2016-07-07 70 views
0

比方說,我有一個doc格式是這樣的:Can ElasticSearch在第一次匹配搜索時會停止嗎?

doC#1 

A: 1 
B: 2 
C: 3 

doC#2 

A: 4 
B: 1 
C: 8 

因此,用戶輸入將是1。我對A,B和C的multi_match查詢這工作得很好。我想把A看作主要的,所以我給了它一個提升(目前是5)。這工作正常,所有文檔與A:1上升到頂部。

但是,鑑於上述兩個文檔,輸入「1」將返回兩個文檔。我希望搜索工作的方式是將A作爲優先領域,如果我在那裏找到價值,我想忽略其他兩個領域。

如果找不到A:1,那麼我想搜索B & C作爲後備。

elasticsearch是否有這樣的機制?

這裏是輸入的情況下= 1個

  • 回報所有A:1個文件...如果只有一個,然後做
  • 如果沒有答:1個文檔,或多個A:1個文檔,還包括B:1和C:1文檔
+0

你需要從Elasticsearch的角度思考這個問題。在ES中控制這些東西都是關於得分的。您可以使用'「size」:1'來僅返回一個文檔。您可以提高特定文件的質量,以便您可以決定先於他人。也許你可以這樣做。但是,如果考慮一下這種使用情況,像編程方法(如果其他情況下)不會與ES一起工作,就像@imotov在他的答案中提到的那樣。 –

回答

2

Elasticsearch不支持此類功能。即使這樣做,如果您運行鍼對A的第一個查詢,並且它不返回任何針對客戶端的B和C運行第二個查詢的任何內容,它也不會顯着更優化。

在elasticsearch中,搜索分佈在多個分片中,而特定分片沒有找到文檔的事實並不意味着該文檔不存在於其他分片中。因此,爲了在elasticsearch中實現它,我們必須首先執行對A的查詢,檢查它是否不返回任何內容,然後對B和C執行查詢。將此移動到客戶端只需在客戶端之間添加一個額外的躍點並將elasticsearch節點添加到進程中。除此之外,它幾乎是一樣的。

+0

謝謝。我正在對A,B,C運行一個*單個*查詢並提升A以使其達到頂峯。不可能有多個A:1,所以客戶端只需要檢查第一條記錄,看它是否與A匹配,然後丟棄其餘的。但是,這仍然會與A,B,C始終相匹配,並在應用中進行過濾。所以它的兩個查詢中的第一個可能是「更輕」。或者只是1,並在應用程序中進行檢查。 – SledgeHammer

相關問題