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

标签 elasticsearch elasticsearch-2.0

我有两个索引,businessescategories .每个都有不同的映射,其中一个区别是 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 中定义为 “ bool ” 使用 2 个或更多“ 应该 ”子句和“ minimum_should_match ”的查询设置为 1
  • 一个 查询可以在 elasticsearch 中定义为“ bool ”查询,具有 2 个或更多“ 必须 ”子句
  • 您可以使用“ _index ”字段检查 2 个子查询中的索引:
  • https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-index-field.html
  • 您必须在“类别”索引的映射中定义地理点字段(不一定在“类别”索引的 json 文档中)

  • 您没有提供地理查询和类别查询,所以我会让它们作为占位符,您只需要替换它们。

    您应该尝试这样的事情(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/

    相关文章:

    django - Elasticsearch文档字段类型索引自动更改

    elasticsearch - Elasticsearch存储桶和添加到列表

    elasticsearch - 将 uax_url_email 分析器添加到 Elasticsearch 2.4.5

    asp.net - 在ElasticSearch NEST中创建自定义标记生成器

    elasticsearch - MySQL 查询到 Elasticsearch 查询

    elasticsearch - 在 docker 容器中配置 ELK 集群

    ruby-on-rails - 无法通过 Elasticsearch 5.0解析格式为[MMM,YY]的日期字段[0]

    elasticsearch - Elasticsearch荧光笔标记的数量

    elasticsearch - Elasticsearch用于设置索引 “no”使用哪种类型,关键字还是文本?

    elasticsearch - 要求重要条款但什么也不返回