2013-07-04 33 views
0
{ 
    "query": { 
    "custom_score": { 
     "query": { 
     "match": { 
      "xxx": { 
      "query": "foobar" 
      } 
     } 
     }, 
     "filter": { 
     "and": [ 
      { 
      "query": { 
       "match": { 
       "yyyy": { 
        "query": "barfoo" 
       } 
       } 
      } 
      } 
     ] 
     } 
    }, 
    "script": "_score * doc['_score']" 
    } 
} 

這給了錯誤_score而在elasticsearch做索引

[custom_score] query does not support [filter] 

那麼如何評價這樣的查詢?

+0

你的意思是索引時間提升嗎?你能否詳細說明你想要達到的目標? – javanna

+0

更新了這個問題。 – user12345

+0

謝謝,但我不明白:)你能解釋一下你想用你的腳本實現什麼嗎?我認爲你應該改寫你的問題,因爲它不是在建立索引時增加查詢時間。另外,如果再看看異常情況,您應該找到更詳細的消息,其中包含查詢失敗的原因。 – javanna

回答

1

我建議你看看你的要求有關提升,因爲你目前的腳本沒有多大意義。

另外,看看elasticsearch query DSL的文檔。它提供了複合查詢和簡單的查詢,您可以將它們組合在一起。正如錯誤所述,您不能在自定義分數查詢中放置過濾器。您可以使用一個filtered query定製比分查詢中:

{ 
    "query": { 
    "custom_score": { 
     "query": { 
     "filtered" : { 
      "query" : { 
      "match": { 
       "xxx": { 
       "query": "foobar" 
       } 
      } 
      }, 
      "filter" : { 
      "and": [ 
       { 
       "query": { 
        "match": { 
        "yyyy": { 
         "query": "barfoo" 
        } 
        } 
       } 
       } 
      ] 
      } 
     } 
     }, 
     "script": "_score * doc['_score']" 
    } 
    } 
} 

或使用頂級filter這樣的:

{ 
    "query": { 
    "custom_score": { 
     "query": { 
     "match": { 
      "xxx": { 
      "query": "foobar" 
      } 
     } 
     }, 
     "script": "_score * doc['_score']" 
    } 
    }, 
    "filter": { 
    "and": [ 
     { 
     "query": { 
      "match": { 
      "yyyy": { 
       "query": "barfoo" 
      } 
      } 
     } 
     } 
    ] 
    } 
} 

兩個選項之間的區別是,頂層過濾器不考慮如果您在搜索請求中進行了分析,而如果您將篩選器放入查詢中,則會考慮它們。

另一件要看的事情是:如果只有一個子句,則不需要過濾器。另外,在過濾器中放置全文搜索通常沒有意義,因爲過濾器是可緩存的,並且假定全文搜索是免費的並且幾乎不可預測,那麼緩存它們將是浪費。

+0

「腳本」屬性應位於「custom_score」屬性的括號內,而不在其外部。謝謝你們各種各樣的例子,非常有幫助。 –

+0

謝謝@TedAvery指出了這一點,我編輯了我的答案。 – javanna