Elasticsearch 查询跨索引搜索地理和非地理数据?
Elasticsearch query to search across indexes for geo and non-geo data?
我有两个索引,businesses
和 categories
。每个都有不同的映射,其中一个区别是 businesses
有一个与之关联的地理场 (lat/lng)。我想执行一个查询,用户可以在其中执行跨越两个索引的自动完成搜索(想想 Yelp.com)。此外,将提供用户的位置,以便仅显示 x
距离内的 businesses
。但是,任何与搜索相匹配的 categories
都应该出现,因为返回 categories
时用户所在的位置并不重要。因为我没有将 categories
与地理场相关联,所以我得到一个错误,找不到地理场 属性,这是正确的(当我只查询 businesses
时它有效) .有没有一种方法可以构造我的查询,使一条语句只查看一个索引,而一条语句只查看另一个索引?或者我是否需要通过添加 type
属性 并为 "type":"category"
使用 or
运算符来为类别提供一些 "dummy" 地理区域?即 "matches the geoquery OR is type:category
".
如果我明白你想做什么,它可以改写为布尔表达式,如:
("index == businesses" AND "<geoquery> is OK") OR ("index == categories" AND "<categoryquery> is OK")
这里有一些实现此查询的提示:
- OR 查询可以在 elasticsearch 中定义为 "bool" 查询,其中包含 2 个或更多“should”子句和“minimum_should_match”设置为 1
- AND 查询可以在 elasticsearch 中定义为一个“bool”查询,其中包含 2 个或更多“must ”条款
- 您可以使用“_index”字段检查 2 个子查询中的索引:
- 您必须在 "categories" 索引的映射中定义地理点字段(不一定在 "categories" 索引的 json 文档中)
您没有提供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>
}
}
]
}
}
]
}
}
}
我有两个索引,businesses
和 categories
。每个都有不同的映射,其中一个区别是 businesses
有一个与之关联的地理场 (lat/lng)。我想执行一个查询,用户可以在其中执行跨越两个索引的自动完成搜索(想想 Yelp.com)。此外,将提供用户的位置,以便仅显示 x
距离内的 businesses
。但是,任何与搜索相匹配的 categories
都应该出现,因为返回 categories
时用户所在的位置并不重要。因为我没有将 categories
与地理场相关联,所以我得到一个错误,找不到地理场 属性,这是正确的(当我只查询 businesses
时它有效) .有没有一种方法可以构造我的查询,使一条语句只查看一个索引,而一条语句只查看另一个索引?或者我是否需要通过添加 type
属性 并为 "type":"category"
使用 or
运算符来为类别提供一些 "dummy" 地理区域?即 "matches the geoquery OR is type:category
".
如果我明白你想做什么,它可以改写为布尔表达式,如:
("index == businesses" AND "<geoquery> is OK") OR ("index == categories" AND "<categoryquery> is OK")
这里有一些实现此查询的提示:
- OR 查询可以在 elasticsearch 中定义为 "bool" 查询,其中包含 2 个或更多“should”子句和“minimum_should_match”设置为 1
- AND 查询可以在 elasticsearch 中定义为一个“bool”查询,其中包含 2 个或更多“must ”条款
- 您可以使用“_index”字段检查 2 个子查询中的索引:
- 您必须在 "categories" 索引的映射中定义地理点字段(不一定在 "categories" 索引的 json 文档中)
您没有提供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>
}
}
]
}
}
]
}
}
}