需要对嵌套字段进行过滤

问题描述 投票:0回答:1

我需要使用 searchkick 对嵌套字段进行过滤,并且从文档中我需要使用“price.currency”点表示法语法来按嵌套字段进行过滤,并且当您只需要使用一个过滤器时它就可以工作。但我需要更复杂的现实生活过滤器:我需要按范围内的金额按“price.currency”和“price.amount”进行过滤。幸运的是,我可以使用弹性“嵌套”查询来做到这一点,但不幸的是我无法在令人惊叹的 Searhkick 文档中找到如何做到这一点。我解析了 searchkick 源代码,发现无法使用“嵌套”命令。有没有办法用 searchkick 来做到这一点,或者我很愚蠢,试图使用这个库以及 ruby 和 Rails,只需要去死?

BR,丹尼斯。

我阅读文档、阅读源代码并花了 2 天时间尝试找到正确的解决方案。

ruby-on-rails ruby elasticsearch searchkick
1个回答
0
投票

Denis 首先,重要的是要记住,编码时遇到挑战是一种常见的经历,它并不反映您作为开发人员的能力。像这样的复杂问题是软件开发学习过程的一部分。

关于您的问题,对于按范围内的“price.currency”和“price.amount”进行过滤的具体情况,您是正确的,这通常需要在 Elasticsearch 中进行嵌套查询。

虽然 Searchkick 可能不直接直接支持此功能,但您可以使用 Searchkick 中的

where
选项来构建更复杂的查询。

这是一个例子:

Product.search("*", where: {
  and: [
    { "price.currency": "USD" },
    { "price.amount": { gte: 10, lte: 100 } }
  ]
})

此示例假设

Product
是您的 Searchkick 型号,并且您正在寻找价格在 10 到 100 美元之间的产品。

如果

where
选项不够,您可能需要使用原始 Elasticsearch 查询。 Searchkick 允许您使用其
search
方法执行原始查询:

Product.search(body: { 
  query: { 
    nested: {
      path: "price",
      query: {
        bool: {
          must: [
            { match: { "price.currency": "USD" } },
            { range: { "price.amount": { gte: 10, lte: 100 } } }
          ]
        }
      }
    }
  }
})

此示例展示了如何直接在 Elasticsearch 的查询 DSL 中构建嵌套查询。

如果这些方法仍然不能满足您的要求,则值得考虑不同的工具或自定义解决方案是否更适合您的特定用例。

请记住,每种工具都有其优点和局限性,有时挑战在于找到适合工作的工具或调整我们解决问题的方法。

继续前进,不要犹豫,向社区寻求支持!

© www.soinside.com 2019 - 2024. All rights reserved.