Elasticsearch排序字段

时间:2014-09-25 09:09:24

标签: elasticsearch kibana

我有这个字段映射

    "my_field":{
         "long"
   }

此字段只能采用四个值" 1,2,3,4" 。 我想按照这个字段排序我的文件" my_field",按顺序排列:显示的第一个文件是my_field是1,3或4的位置,以及my_field = 2最后显示的位置。

我已经尝试过一些事情来重新调整my_field = 2的文件,但它没有正常工作。

 "rescore": [
    {
        "query": {
            "rescore_query": {
                "match": {
                    "my_field": {
                        "query": 2,
                        "slop": 1
                    }
                }
            },
            "query_weight": 0.0001,
            "rescore_query_weight": 0.0001
        }
    }
],

如何通过my_field值获取结果顺序,如下所示:1,3,4,2

映射:

          {
            "index_name" : {
            "mappings" : {
            "type_name" : {
            "properties" : {
            "address" : {
            "type" : "string"
            },
            "country_id" : {
            "type" : "long"
            },
            "county_id" : {
            "type" : "long"
            },
            "created" : {
            "type" : "long"
            },
             "my_field":{
                   "long"
             }
            }
}
}

这是查询:

    {
    "fields": [
        "_source"
    ],
    "query": {
        "terms": {
            "my_field": [
               1,
                2
            ]
        }
    },
    "rescore": [
        {
            "query": {
                "rescore_query": {
                    "match": {
                        "my_field": {
                            "query": 2
                        }
                    }
                },
                "query_weight": 0.1,
                "rescore_query_weight": 1
            }
        },
        {
            "query": {
                "rescore_query": {
                    "match": {
                        "my_field": {
                            "query": 1
                        }
                    }
                },
                "query_weight": 1,
                "rescore_query_weight": 33
            }
        }
    ]
}

我在这里发布了my_field的尝试增加分数,其中值为1,减去值为2

2 个答案:

答案 0 :(得分:1)

我会考虑"排序"分数ES的文件在搜索时给出。如果您只对排序文档感兴趣,即使您的查询中有其他内容(例如,您搜索某些地址),我也会为每个" my_field"提供查询的元素。重视不同的boost值以及对排序过程中我不感兴趣的查询元素 - constant_score

{
  "fields": ["_source"], 
  "query": {
    "bool": {
      "must": [
        { "constant_score": {
          "query": {"terms": {"my_field": [1, 2, 3, 4] }}}}
      ],
      "should": [
        { "match": { "my_field" : {"query": 1, "boost" : 8}}},
        { "match": { "my_field" : {"query": 3, "boost" : 8}}},
        { "match": { "my_field" : {"query": 4, "boost" : 8}}},
        { "match": { "my_field" : {"query": 2, "boost" : 1}}}
      ]
    }
  }
}

在上面的示例中,我给出了一些我不想干扰评分计算的内容的常数得分值(默认值为1)。对于my_field"值我使用match为每个(知道每个文档都填充了该字段)但具有不同的boost值。 1,3和4被平等对待(给它们一个大的boost 8),2被正常处理(boost值为1)。

答案 1 :(得分:0)

我能够得到我预期的结果如下:

{
    "fields": [
        "_source"
    ],
    "size": 20,
    "query": {
        ...
    },
    "sort": [
        {
            "my_field": {
                "order": "asc",
                "nested_filter": {
                    "terms": {
                        "my_field": [
                            1,
                            3,
                            4
                        ]
                    }
                }
            }
        }
    ]
}

现在my_field等于2的结果列在最后。