2014-09-25 127 views
2

我有這個字段映射Elasticsearch排序字段

"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和decrase爲值2

+0

您可以發佈的。映射這個索引,也許還有一些來自查詢本身(你只發布了「rescore」嘗試)? – 2014-09-25 10:34:59

+0

你究竟想要查詢什麼?你只想分類文件,或者你正在尋找其他的東西,以及? (例如,按地址搜索並按「my_field」排序生成的文檔) – 2014-09-25 11:18:26

+0

我已經定義了一個查詢,並且希望我的文檔按「my_field」值進行排序 - 1,3,4,2 – KB9 2014-09-25 12:58:18

回答

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)

+0

謝謝你的回覆 。這正如我所料。我試圖將這與我的查詢結合起來 – KB9 2014-09-25 13:01:35

0

我能得到的結果,我希望像如下:

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

現在結果,其中my_field等於2列在最後