ES搜尋 term與match區別 bool查詢

2021-10-04 17:39:45 字數 2978 閱讀 3137

1、ik_max_word

會將文字做最細粒度的拆分,比如會將「中華人民共和國人民大會堂」拆分為「中華人民共和國、中華人民、中華、華人、人民共和國、人民、共和國、大會堂、大會、會堂等詞語。

2、ik_smart

會做最粗粒度的拆分,比如會將「中華人民共和國人民大會堂」拆分為中華人民共和國、人民大會堂。

在實際的專案查詢中,termmatch是最常用的兩個查詢,而經常搞不清兩者有什麼區別,趁機總結有空總結下。

term用法

先看看term的定義,term是代表完全匹配,也就是精確查詢,搜尋前不會再對搜尋詞進行分詞拆解。

這裡通過例子來說明,先存放一些資料:

來使用term查詢下:

}}

結果是,上面的兩條資料都能查詢到:

,

"hits": },}

]}}

發現,title裡有關love的關鍵字都查出來了,但是我只想精確匹配love china這個,按照下面的寫法看看能不能查出來:

}}

執行發現無資料,從概念上看,term屬於精確匹配,只能查單個詞。我想用term匹配多個詞怎麼做?可以使用terms來:

}}

查詢結果為:

,

"hits": },}

]}}

發現全部查詢出來,為什麼?因為terms裡的[ ]多個是或者的關係,只要滿足其中乙個詞就可以。想要通知滿足兩個詞的話,就得使用bool的must來做,如下:

},}

]}

}}

可以看到,我們上面使用china是小寫的。當使用的是大寫的china我們進行搜尋的時候,發現搜不到任何資訊。這是為什麼了?title這個詞在進行儲存的時候,進行了分詞處理。我們這裡使用的是預設的分詞處理器進行了分詞處理。我們可以看看如何進行分詞處理的?

分詞處理器

get test/_analyze

結果為:

,

]}

分析出來的為lovechina的兩個詞。而term只能完完整整的匹配上面的詞,不做任何改變的匹配。所以,我們使用china這樣的方式進行的查詢的時候,就會失敗。稍後會有一節專門講解分詞器。

match用法

先用love china來匹配。

get test/doc/_search

}}

結果是:

,

"hits": },}

]}}

發現兩個都查出來了,為什麼?因為match進行搜尋的時候,會先進行分詞拆分,拆完後,再來匹配,上面兩個內容,他們title的詞條為:love china hubei,我們搜尋的為love china我們進行分詞處理得到為love china,並且屬於或的關係,只要任何乙個詞條在裡面就能匹配到。如果想lovechina同時匹配到的話,怎麼做?使用match_phrase

match_phrase用法

match_phrase稱為短語搜尋,要求所有的分詞必須同時出現在文件中,同時位置必須緊鄰一致。

get test/doc/_search

}}

結果為:

,

"hits": }]

}}

這次好像符合我們的需求了,結果只出現了一條記錄。

bool查詢對應lucene中的booleanquery,它由乙個或者多個子句組成,每個子句都有特定的型別。

bool查詢也支援禁用協同計分選項disable_coord。一般計算分值的因素取決於所有的查詢條件。

bool查詢也是採用more_matches_is_better的機制,因此滿足must和should子句的文件將會合併起來計算分值。

},"filter":

},"must_not" : }},

"should" : [},}

],"minimum_should_match" : 1,

"boost" : 1.0

}}

在filter子句查詢中,分值將會都返回0。分值會受特定的查詢影響。

比如,下面三個查詢中都是返回所有status欄位為active的文件

第乙個查詢,所有的文件都會返回0:

get _search}}

}}

下面的bool查詢中包含了乙個match_all,因此所有的文件都會返回1

get _search

},"filter": }}

}}

constant_score與上面的查詢結果相同,也會給每個文件返回1:

get _search}}

}}

如果想知道到底是bool裡面哪個條件匹配,可以使用named query查詢:

}},

}}],

"filter" : }}

}

es中的term和match的區別

term hits love china terms hits 可以看到,我們上面使用china是小寫的。當使用的是大寫的china我們進行搜尋的時候,發現搜不到任何資訊。這是為什麼了?title這個詞在進行儲存的時候,進行了分詞處理。我們這裡使用的是預設的分詞處理器進行了分詞處理。我們可以看看如何...

es搜尋核心與實戰 Day02

倒排索引包含兩個部分 單詞詞典一般比較大,可以通過b 樹或雜湊拉鍊法實現,以滿足高效能的插入與查詢 get analyze 1.standard analyzer 2.analyzer 3.whitespace analyzer 4.stop analyzer 5.keyword analyzer ...

es搜尋核心與實戰Day05

1.詞頻tf term frequency 檢索詞在子篇文件 現的頻率 檢索詞出現的次數除以文件的總字數 度量一條查詢和結果文件相關性的簡單方法 簡單將搜尋中每一乙個詞的tf進行相力 tf 區塊鏈 tf 的 tf 應用 stop word 的 在文件 現了很多次,但是對貢獻相關度幾乎沒有用處,不應該...