弹性搜索双面

时间:2012-08-31 08:38:28

标签: lucene elasticsearch

我想运行一个弹性搜索查询,它通过两个不同字段(纬度和经度)的组合对数据进行分组

curl -XGET http://www.my_server:9200/idx_occurrence/Occurrence/_search?pretty=true -d '{  
    "query": { 
        "query_string" : { 
            "fields" : ["genus_interpreted","dataset"], 
            "query": "Pica 2", 
            "default_operator" : "AND" 
         } 
    }, 
    "facets": { 
        "test": { 
            "terms": { 
                "fields" :["decimalLatitude","decimalLongitude"],
                "size" : 500000000 
            } 
        } 
    } 
}'

它提供了比预期更多的结果......任何想法?

答案的相关部分越多......

_shards":{
    "total":5,
    "successful":5,
    "failed":0
},
"hits":{
    "total":**37**,
    "max_score":3.9314494,
    "hits":[{

总点击次数,37是查询的结果,如果我不应用这些方面。这个总数是方面总数的一半(见下文)

"facets":{
    "test":{
        "_type":"terms",
        "missing":0,
        "total":**74**,
        "other":0,
        "terms":[
           {"term":"167.21665954589844","count":5},
           {"term":"167.25","count":4},
           {"term":"167.14999389648438","count":4},
           {"term":"167.1041717529297","count":4},
           {"term":"-21.04166603088379","count":4},.....

因此,分面分组是完全分开的(按纬度,然后是经度)。

请注意,我不能仅按纬度或经度进行分组,因为多个记录可以共享纬度(但经度不同)或反之亦然。

1 个答案:

答案 0 :(得分:4)

您正在多个字段上制作TermsFacet:纬度和经度。这意味着纬度和经度会聚合在一起,因为它们是唯一的字段。您会看到每个值的条目,可以是纬度或经度。您获得74个条目的事实证明您的索引中有74个不同的纬度和经度值,这是有道理的。你想要达到什么目的?每个纬度经度对的一个方面条目?在这种情况下,您有两个选择:

  • 在索引中添加一个附加字段,其中包含该对本身,然后在其上构成
  • 使用术语脚本动态创建latitue经度对。请查看documentation了解更多信息。这是一个应该有所帮助的例子,试一试:
{
    "query" : {
        "match_all" : { }
    },
    "facets" : {
        "tags" : { 
            "terms" : {
                "field" : "latitude",
                "script" : "term + \"_\" + _source.longitude"
            }
        }
    }
}