現在,你或許意想到了使用了match
查詢的多詞查詢只是簡單地將生成的term
查詢包括在了1個bool
查詢中。通過默許的or
操作符,每一個term
查詢都以1個語句被添加,所以致少1個should
語句需要被匹配。以下兩個查詢是等價的:
使用and
操作符時,所有的term
查詢都以must
語句被添加,因此所有的查詢都需要匹配。以下兩個查詢是等價的:
如果指定了minimum_should_match
參數,它會直接被傳入到bool
查詢中,因此下面兩個查詢是等價的:
由于只有3個查詢語句,minimum_should_match
的值75%
會被向下舍入到2
。即最少兩個should語句需要匹配。
固然,我們可以通過match
查詢來編寫這類查詢,但是理解match
查詢的內部工作原理能夠讓你根據需要來控制該進程。有些行動沒法通過1個match
查詢完成,比如對部份查詢詞條給予更多的權重。在下1節中我們會看到1個例子。
固然,bool
查詢其實不是只能合并簡單的單詞(One-word)match
查詢。它能夠合并任何其它的查詢,包括其它的bool
查詢。它通常被用來通過合并數個單獨的查詢的分值來調優每份文檔的相干度_score
。
假定我們需要搜索和"full-text search"相干的文檔,但是我們想要給予那些提到了"Elasticsearch"或"Lucene"的文檔更多權重。更多權重的意思是,對提到了"Elasticsearch"或"Lucene"的文檔,它們的相干度_score
會更高,即它們會出現在結果列表的前面。
1個簡單的bool查詢能夠讓我們表達較為復雜的邏輯:
content
字段必須含有full
,text
和search
這3個詞條content
字段也含有了詞條Elasticsearch
或Lucene
,那末該文檔會有1個較高的_score
should
查詢子句的匹配數量越多,那末文檔的相干度就越高。目前為止還不錯。
但是如果我們想給含有Lucene
的文檔多1些權重,同時給含有Elasticsearch
的文檔更多1些權重呢?
我們可以通過指定1個boost
值來控制每一個查詢子句的相對權重,該值默許為1
。1個大于1
的boost
會增加該查詢子句的相對權重。因此我們可以將上述查詢重寫以下:
NOTE
boost
參數被用來增加1個子句的相對權重(當boost
大于1
時),或減小相對權重(當boost
介于0
到1
時),但是增加或減小不是線性的。換言之,boost
設為2
其實不會讓終究的_score
加倍。相反,新的
_score
會在適用了boost
后被歸1化(Normalized)。每種查詢都有自己的歸1化算法(Normalization Algorithm),算法的細節超越了本書的討論范圍。但是能夠說1個高的boost
值會產生1個高的_score
。如果你在實現你自己的不基于TF/IDF的相干度分值模型并且你需要對提升進程具有更多的控制,你可使用
function_score
查詢,它不通過歸1化步驟對文檔的boost
進行操作。
在下1章中,我們會介紹其它的用于合并查詢的方法,多字段查詢(Multifield Search)。但是,首先讓我們看看查詢的另外一個重要特定:文本分析(Text Analysis)。
上一篇 如何獲得正確的基數估計值
下一篇 堆排序算法的實現!!