我需要使用 searchkick 对嵌套字段进行过滤,并且从文档中我需要使用“price.currency”点表示法语法来按嵌套字段进行过滤,并且当您只需要使用一个过滤器时它就可以工作。但我需要更复杂的现实生活过滤器:我需要按范围内的金额按“price.currency”和“price.amount”进行过滤。幸运的是,我可以使用弹性“嵌套”查询来做到这一点,但不幸的是我无法在令人惊叹的 Searhkick 文档中找到如何做到这一点。我解析了 searchkick 源代码,发现无法使用“嵌套”命令。有没有办法用 searchkick 来做到这一点,或者我很愚蠢,试图使用这个库以及 ruby 和 Rails,只需要去死?
BR,丹尼斯。
我阅读文档、阅读源代码并花了 2 天时间尝试找到正确的解决方案。
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 中构建嵌套查询。
如果这些方法仍然不能满足您的要求,则值得考虑不同的工具或自定义解决方案是否更适合您的特定用例。
请记住,每种工具都有其优点和局限性,有时挑战在于找到适合工作的工具或调整我们解决问题的方法。
继续前进,不要犹豫,向社区寻求支持!