2016-07-20 36 views
1

假設我有兩個不同的索引字段 在elasticsearch和/ MUST運營商查詢,如下所示:如何elasticsearch獲取並從其索引操作查詢

"bool": { 
    "must": [ 
     { 
      "match" : { 
      "query":  "Will", 
      "fields":  [ "first",], 
      "minimum_should_match": "100%" // assuming this is q1 
      } 
     }, 
     { 
      "match" : { 
      "query":  "Smith", 
      "fields":  [ "last" ] 
      "minimum_should_match": "100%" //assuming this is q2 
      } 
     } 
    ] 
} 

現在我想知道如何在後臺彈性搜索將取回文件。 它是否會得到所有索引匹配q1的文檔的id,然後遍歷所有索引q2的索引。

它做兩個交集,如何?

如何索引我的數據以在兩個單獨的字段上進行優化和QUERIES?

回答

2

首先是一些基本知識:ElasticSearch在後臺使用lucene。在lucene中,一個查詢返回一個記分員,該記錄員負責返回與查詢匹配的文檔列表。

您的布爾查詢將在內部被翻譯爲lucene BooleanQuery,在這種情況下將返回ConjunctionScorer,因爲它只有must子句。

每個條款是一個TermQuery,返回TermScorer,當進階時,按照文檔ID的遞增順序給出下一個匹配文檔。

ConjunctionScorer通過簡單地依次推進每個分數器來計算每個分句由分數器返回的匹配文檔的交集。

因此,您可以將TermScorer視爲返回文檔的有序列表以及ConjunctionScorer的一個簡單相交兩個有序列表。

沒有太多的事情可以優化它。也許,由於您對分數不是很感興趣,您可以使用過濾器查詢來讓ElasticSearch緩存它。

+0

@soulcheck ...感謝信息它有助於查詢的情況下,過濾器將有助於執行緩存....如果可能,你可以提供詳細說明兩個過濾器如何相交的工作? –

+0

@PrannoyMittal找到匹配的文檔是完全一樣的 - 請記住,在lucene過濾器只是不參與評分的查詢(從5.x開始的lucene建議使用TermQuery來實現術語過濾器)。 – soulcheck

+0

舉例來說,這是lucene 5.4.0中的'TermFilter'構造函數:'public TermFilter(Term term){超級(新TermQuery(term)); }' – soulcheck

相關問題