ElasticSearch 的条件查询 5.x (elasticsearch-rails/elasticsearch-model)
Conditional queries for ElasticSearch 5.x (elasticsearch-rails/elasticsearch-model)
ElasticSearch 的新手,我想知道是否有构造条件 queries/filters 的方法。我正在使用 Rails,所以我想它必须在那个特定的级别上,因为我找不到任何指向 ES 级别的条件查询的内容,而且我很确定只是假设是愚蠢的!
所以这是我的(有效)查询:
search_definition = {
query: {
bool: {
must: [
{
more_like_this: {
fields: tag_types,
docs: [
{
_index: self.class.index_name,
_type: self.class.document_type,
_id: id
}
],
min_term_freq: 1
}
}
],
should: [
range: {
age: {
gte: min_age,
lte: max_age,
boost: 4.0
}
}
],
filter: {
bool: {
must: [
term: {
active: true
}
],
must: [
geo_distance: {
distance: xdistance,
unit: "km",
location: {
lat: xlat,
lon: xlng
},
boost: 5.0
}
]
}
}
}
},
size: how_many
}
而且效果非常好。现在让我们假设我想应用额外的过滤器,在这个特定的例子中我需要验证当用户正在搜索时,另一端的用户实际上正在为正在搜索的人寻找性别。这保存在数据库中的 2 个独立的布尔属性中 (male/female)。我认为准备两个类似的过滤器就足够简单了——但是,查询中还有更多 运行 的条件过滤器,我最终会得到十多个预先准备好的过滤器。必须有更优雅的方式!谢谢!
您熟悉 elasticsearch search templates
吗?
使用搜索模板,您可以进行 conditional
和 dynamic
查询。例如,您可以有一个字段和值列表来进行术语过滤并将其作为参数传递给搜索模板。
按照 Mohammad 的建议 - 最后,我寻求使用 ES 搜索模板的解决方案,这让我的生活变得更加轻松。 JBuilder、ElasticSearch-DSL 和其他解决方案的问题在于它们似乎无法与最新的 ES 一起使用,因此,我不确定如果对 gems 或 ES 版本进行任何更改,我最终会在哪里。因此,切断中间人并完全控制实际上非常容易创建的模板对我来说很有意义。我使用 JBuilder 和 ES-DSL 设置的版本从未正常工作,因为它们的输出充其量是随机的。
搜索模板 -> More Information
JBuilder -> More Information
ElasticSearch-DSL -> More Information
还有其他我没有尝试过的解决方案,但是使用搜索模板,我认为没有任何必要。
ElasticSearch 的新手,我想知道是否有构造条件 queries/filters 的方法。我正在使用 Rails,所以我想它必须在那个特定的级别上,因为我找不到任何指向 ES 级别的条件查询的内容,而且我很确定只是假设是愚蠢的!
所以这是我的(有效)查询:
search_definition = {
query: {
bool: {
must: [
{
more_like_this: {
fields: tag_types,
docs: [
{
_index: self.class.index_name,
_type: self.class.document_type,
_id: id
}
],
min_term_freq: 1
}
}
],
should: [
range: {
age: {
gte: min_age,
lte: max_age,
boost: 4.0
}
}
],
filter: {
bool: {
must: [
term: {
active: true
}
],
must: [
geo_distance: {
distance: xdistance,
unit: "km",
location: {
lat: xlat,
lon: xlng
},
boost: 5.0
}
]
}
}
}
},
size: how_many
}
而且效果非常好。现在让我们假设我想应用额外的过滤器,在这个特定的例子中我需要验证当用户正在搜索时,另一端的用户实际上正在为正在搜索的人寻找性别。这保存在数据库中的 2 个独立的布尔属性中 (male/female)。我认为准备两个类似的过滤器就足够简单了——但是,查询中还有更多 运行 的条件过滤器,我最终会得到十多个预先准备好的过滤器。必须有更优雅的方式!谢谢!
您熟悉 elasticsearch search templates
吗?
使用搜索模板,您可以进行 conditional
和 dynamic
查询。例如,您可以有一个字段和值列表来进行术语过滤并将其作为参数传递给搜索模板。
按照 Mohammad 的建议 - 最后,我寻求使用 ES 搜索模板的解决方案,这让我的生活变得更加轻松。 JBuilder、ElasticSearch-DSL 和其他解决方案的问题在于它们似乎无法与最新的 ES 一起使用,因此,我不确定如果对 gems 或 ES 版本进行任何更改,我最终会在哪里。因此,切断中间人并完全控制实际上非常容易创建的模板对我来说很有意义。我使用 JBuilder 和 ES-DSL 设置的版本从未正常工作,因为它们的输出充其量是随机的。
搜索模板 -> More Information
JBuilder -> More Information
ElasticSearch-DSL -> More Information
还有其他我没有尝试过的解决方案,但是使用搜索模板,我认为没有任何必要。