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

时间:2017-04-21 21:14:27

标签: elasticsearch elasticsearch-2.0

我有两个索引businessescategories。每个映射都有不同的映射,其中一个差异是businesses具有与之关联的geofield(lat / lng)。我想执行一个查询,其中用户可以执行跨越两个索引的自动完成搜索(想想Yelp.com)。此外,系统会提供用户的位置,以便只显示某个businesses距离内的x。但是,应显示与搜索匹配的任何categories,因为返回categories时用户所处的位置无关紧要。因为我没有将categories与geofield关联,所以我收到一个错误,即无法找到geofield属性,这是正确的(当我只查询businesses时它会起作用)。有没有办法构造我的查询,以便一个语句只查看一个索引,一个语句只查看另一个索引?或者我是否需要为类别提供一些“虚拟”地理位置,通过添加type属性并使用or运算符"type":"category"来忽略这些地理位置?即,“匹配地理查询OR是type:category”。

1 个答案:

答案 0 :(得分:1)

如果我理解你想做什么,可以将它改为布尔表达式,如:

("index == businesses" AND "<geoquery> is OK") OR ("index == categories" AND "<categoryquery> is OK")

以下是一些实现此查询的提示:

  • OR 查询可以在elasticsearch中定义为“bool”查询,其中包含2个或更多“应该”子句和“ minimum_should_match “设为1
  • AND 查询可以在elasticsearch中定义为具有2个或更多“必须”条款的“ bool ”查询
  • 您可以使用“ _index ”字段检查2个子查询中的索引:
  • 您必须在“类别”索引的映射中定义geopoint字段(不一定在“类别”索引的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>
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}