天天看點

Elasticsearch: 權威指南 » 深入搜尋 » 多字段搜尋 » 多數字段 good

如果包含詞語 <code>fast foxes</code> 的文檔是能找到的唯一相關文檔,那麼它會出現在結果清單的最上面,但是,如果有 100 個文檔都出現了詞語 <code>quick brown fox</code> ,那麼這個包含詞語 <code>fast foxes</code> 的文檔當然會被認為是次相關的,它可能處于傳回結果清單更下面的某個地方。當包含了很多潛在比對之後,我們需要将最比對的幾個置于結果清單的頂部。

使用詞幹提取來索引 <code>jumps</code> 、 <code>jumping</code> 和 <code>jumped</code> 樣的詞,将 <code>jump</code> 作為它們的詞根形式。這樣即使使用者搜尋 <code>jumped</code> ,也還是能找到包含 <code>jumping</code> 的比對的文檔。

将同義詞包括其中,如 <code>jump</code> 、 <code>leap</code> 和 <code>hop</code> 。

移除變音或口音詞:如 <code>ésta</code> 、 <code>está</code> 和 <code>esta</code> 都會以無變音形式 <code>esta</code> 來索引。

盡管如此,如果我們有兩個文檔,其中一個包含詞 <code>jumped</code> ,另一個包含詞 <code>jumping</code> ,使用者很可能期望前者能排的更高,因為它正好與輸入的搜尋條件一緻。

一個文檔如果與廣度比對的主字段相比對,那麼它會出現在結果清單中。如果文檔同時又與 signal 信号字段比對,那麼它會獲得額外加分,系統會提升它在結果清單中的位置。

我們會在本書稍後對同義詞、詞相似性、部分比對以及其他潛在的信号進行讨論,但這裡隻使用詞幹已提取(stemmed)和未提取(unstemmed)的字段作為簡單例子來說明這種技術。

<a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/most-fields.html#CO71-1"></a>

<a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/most-fields.html#CO71-2"></a>

<code>title</code> 字段使用 <code>english</code> 英語分析器來提取詞幹。

<a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/most-fields.html#CO71-3"></a>

<code>title.std</code> 字段使用 <code>standard</code> 标準分析器,是以沒有詞幹提取。

接着索引一些文檔:

這裡用一個簡單 <code>match</code> 查詢 <code>title</code> 标題字段是否包含 <code>jumping rabbits</code> (跳躍的兔子):

因為有了 <code>english</code> 分析器,這個查詢是在查找以 <code>jump</code> 和 <code>rabbit</code> 這兩個被提取詞的文檔。兩個文檔的 <code>title</code> 字段都同時包括這兩個詞,是以兩個文檔得到的評分也相同:

如果隻是查詢 <code>title.std</code> 字段,那麼隻有文檔 2 是比對的。盡管如此,如果同時查詢兩個字段,然後使用 <code>bool</code> 查詢将評分結果 合并 ,那麼兩個文檔都是比對的( <code>title</code> 字段的作用),而且文檔 2 的相關度評分更高( <code>title.std</code> 字段的作用):

<a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/most-fields.html#CO72-1"></a>

我們希望将所有比對字段的評分合并起來,是以使用 <code>most_fields</code> 類型。這讓 <code>multi_match</code> 查詢用 <code>bool</code> 查詢将兩個字段語句包在裡面,而不是使用 <code>dis_max</code> 查詢。

文檔 2 現在的評分要比文檔 1 高。

用廣度比對字段 <code>title</code> 包括盡可能多的文檔——以提升召回率——同時又使用字段 <code>title.std</code> 作為 信号 将相關度更高的文檔置于結果頂部。

每個字段對于最終評分的貢獻可以通過自定義值 <code>boost</code> 來控制。比如,使 <code>title</code> 字段更為重要,這樣同時也降低了其他信号字段的作用:

<a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/most-fields.html#CO74-1"></a>

<code>title</code> 字段的 <code>boost</code> 的值為 <code>10</code> 使它比 <code>title.std</code> 更重要。

https://www.elastic.co/guide/cn/elasticsearch/guide/current/most-fields.html

繼續閱讀