我有两个索引businesses
和categories
。每个映射都有不同的映射,其中一个差异是businesses
具有与之关联的geofield(lat / lng)。我想执行一个查询,其中用户可以执行跨越两个索引的自动完成搜索(想想Yelp.com)。此外,系统会提供用户的位置,以便只显示某个businesses
距离内的x
。但是,应显示与搜索匹配的任何categories
,因为返回categories
时用户所处的位置无关紧要。因为我没有将categories
与geofield关联,所以我收到一个错误,即无法找到geofield属性,这是正确的(当我只查询businesses
时它会起作用)。有没有办法构造我的查询,以便一个语句只查看一个索引,一个语句只查看另一个索引?或者我是否需要为类别提供一些“虚拟”地理位置,通过添加type
属性并使用or
运算符"type":"category"
来忽略这些地理位置?即,“匹配地理查询OR是type:category
”。
答案 0 :(得分:1)
如果我理解你想做什么,可以将它改为布尔表达式,如:
("index == businesses" AND "<geoquery> is OK") OR ("index == categories" AND "<categoryquery> is OK")
以下是一些实现此查询的提示:
你没有提供geoquery和categoryquery,所以我会把它们作为占位符,你只需要替换它们。
你应该尝试这样的东西(elasticsearch v5.2.2语法,也应该在elasticsearch v2.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>
}
}
]
}
}
]
}
}
}