我有两个索引,businesses
和 categories
.每个都有不同的映射,其中一个区别是 businesses
有一个与之相关的地理场(纬度/经度)。我想执行一个查询,用户可以执行跨越两个索引的自动完成搜索(想想 Yelp.com)。此外,将提供用户的位置,以便只有 businesses
在一些 x
会出现距离。但是,任何 categories
应该出现与搜索匹配的内容,因为返回 categories
时用户所在的位置并不重要。 .因为我不关联categories
使用 geofield,我收到一个错误,即找不到 geofield 属性,这是正确的(当我查询 businesses
时它可以工作)。有没有办法构造我的查询,以便一条语句只查看一个索引,而一条语句只查看另一个索引?或者我是否需要为类别提供一些“虚拟”地理场,通过添加 type
将被忽略?属性并使用 or
"type":"category"
的运算符?即,“匹配地理查询或为 type:category
”。
最佳答案
如果我理解您想要做什么,可以将其改写为 bool 表达式,例如:
("index == businesses" AND "<geoquery> is OK") OR ("index == categories" AND "<categoryquery> is OK")
以下是实现此查询的一些提示:
您没有提供地理查询和类别查询,所以我会让它们作为占位符,您只需要替换它们。
您应该尝试这样的事情(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>
}
}
]
}
}
]
}
}
}
关于Elasticsearch 查询跨索引搜索地理和非地理数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43552126/