Elasticsearch 查询跨索引搜索地理和非地理数据?

Elasticsearch query to search across indexes for geo and non-geo data?

我有两个索引,businessescategories。每个都有不同的映射,其中一个区别是 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>
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}