2014-01-31 91 views
0

在我的ES索引中,文檔有兩個字段,score_minscore_max,我試圖在bool查詢中進行提升。在布爾查詢中組合兩個範圍過濾器

我想提高所有score_min <= expected_score <= score_max爲真的文檔。

我知道我可以在must子句中放入兩個range查詢,但這意味着其他文檔會被忽略。

有沒有辦法做這樣的事情

.. 
.. 
"should": [ 
    ... 
    ... 
    "some_query": { 
     "and": [ 
      "range": { 
       "score_min": { 
         "lte": expected_score 
       }, 
      }, 
      "range": { 
       "score_max": { 
        "gte": expected_score 
       } 
      } 
      "boost": 2 
     ] 
     } 
] 

回答

2

您可以使用function_score查詢做到這一點。其中一個額外的好處是,你的range查詢可以寫成一個過濾器代替,所以利用過濾器的緩存:

curl -XGET "http://localhost:9200/_search" -d' 
{ 
    "query": { 
    "function_score": { 
     "query": { 
     "match": { "some_field": "foo bar" } 
     }, 
     "functions": [ 
     { 
      "boost_factor": 1.2 
      "filter": { 
      "bool": { 
       "must": [ 
       { "range": { "score_min": { "lte": 10 }}}, 
       { "range": { "score_max": { "gte": 10 }}} 
       ] 
      } 
      } 
     } 
     ] 
    } 
    } 
}' 

所有匹配的查詢結果返回,但還匹配過濾任何結果將他們的分數乘以boost_factor