我有两个索引,businesses和categories。每个映射都有不同的映射,其中一个不同之处是businesses有一个与之相关的geofield (lat/lng)。我想要执行一个查询,用户可以在其中执行跨越这两个索引的自动完成搜索(比如Yelp.com)。此外,将提供用户的位置,以便只有businesses在一定的x距离将出现。但是,任何匹配搜索的categories都应该出现,因为当返回categories时,用户的位置并不重要。因为我没有将categories与geofield相关联,所以我得到一个无法找到geofield属性的错误,这是正确的(当我只是查询businesses时,它可以工作)。是否有一种方法来构造我的查询,使一个语句只查看一个索引,而一个语句只查看另一个索引?或者,我是否需要通过添加type属性和为"type":"category"使用or运算符来给类别提供一些将被忽略的“虚拟”geofield?也就是说,“匹配geoquery OR is type:category”。
发布于 2017-04-21 21:46:27
如果我理解您想要做的事情,可以将其重新表述为布尔表达式,例如:
("index == businesses" AND "<geoquery> is OK") OR ("index == categories" AND "<categoryquery> is OK")以下是实现此查询的几个提示:
您没有提供地理查询和分类查询,所以我让它们作为占位符,您只需替换它们。
您应该尝试这样的方法(ElasticSearchv5.2.2语法,也应该在ElasticSearchv2.0中工作):
GET businesses,categories/_search
{
"query": {
"bool": {
"minimum_should_match": 1,
"should": [{
"bool": {
"must": [
{
"term": {
"_index": "businesses"
}
},
{
"<your_geoip_query>": {
<your_geoip_query_params>
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"_index": "categories"
}
},
{
"<your_category_query>": {
<your_category_query_params>
}
}
]
}
}
]
}
}
}https://stackoverflow.com/questions/43552126
复制相似问题