【问题标题】:ElasticSearch append non matched docs at the end of the search resultElasticSearch 在搜索结果的末尾附加不匹配的文档
【发布时间】:2018-09-18 06:28:48
【问题描述】:

有没有办法在搜索结果的末尾附加不匹配的文档?

我一直在做一个项目,我们需要按地理位置数据搜索文档,但有些文档没有可用的地理位置数据。因此,这些文档没有在搜索结果中返回。

有没有办法在搜索结果的末尾附加不匹配的文档?

示例映射:

PUT /my_locations
{
    "mappings": {
        "_doc": {
            "properties": {
                "address": {
                    "properties": {
                        "city": {
                            "type": "text"
                        },
                        "location": {
                            "type": "geo_point"
                        }
                    }
                }
            }
        }
    }
}

地理位置数据:

PUT /my_locations/_doc/1
{
    "address" : {
        "city: "XYZ",
        "location" : {
            "lat" : 40.12,
            "lon" : -71.34
        }
    }
}

没有地理位置的数据:

PUT /my_locations/_doc/2
{
    "address" : {
        "city: "ABC"
    }
}

有什么方法可以执行地理距离查询,选择带有地理位置数据的文档并在结果末尾附加非地理文档?

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-distance-query.html#query-dsl-geo-distance-query

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您有两个单独的查询

    1. 获取区域内的文档
    2. 获取其他文档

    在一次搜索中同时获得这两个,意味着所有文档都出现在一个结果中,并共享排名。很难创建一个关联模型来获取前 9 个有地址的文档,而一个没有地址的文档。

    但是您可以一次运行两个查询,一个表示前 9 个包含位置的文档,另一个表示没有任何位置。

    例子:

    GET my_locations/_msearch
    {}
    {"size":9,"query":{"geo_distance":{"distance":"200km","pin.location":{"lat":40,"lon":-70}}}}
    {}
    {"size":1,"query":{"bool":{"must_not":[{"exists":{"field":"pin.location"}}]}}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-27
      • 2017-12-21
      • 1970-01-01
      • 2014-10-23
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多