實例演示ElasticSearch索引查詢term,match,match_phase,query_string之間的區別

通常在面試elasticsearch中,面試官會問一個關於查詢的問題,就是term查詢和match查詢有什麼區別?如果你對這兩個查詢不清楚,面試官會認爲你沒有用過elasticsearch,或者就是用了也不是很深入。

下面通過實例來演示索引檢索時term,match他們之間的區別:

    match:模糊匹配,需要指定字段名,但是輸入會進行分詞,比如"hello world"會進行拆分爲hello和world,然後匹配,如果字段中包含hello或者world,或者都包含的結果都會被查詢出來,也就是說match是一個部分匹配的模糊查詢。查詢條件相對來說比較寬鬆。

    term:這種查詢和match在有些時候是等價的,比如我們查詢單個的詞hello,那麼會和match查詢結果一樣,但是如果查詢"hello world",結果就相差很大,因爲這個輸入不會進行分詞,就是說查詢的時候,是查詢字段分詞結果中是否有"hello world"的字樣,而不是查詢字段中包含"hello world"的字樣,我們知道elasticsearch會對字段內容進行分詞,"hello world"會被分成hello和world,不存在"hello world",因此這裏的查詢結果會爲空。這也是term查詢和match的區別。

    雖然books中有name="java in action"的book,但是term查詢還是查詢不出來結果。只有使用單個詞做索引才能查詢出結果:

    match_phase:會對輸入做分詞,但是需要結果中也包含所有的分詞,而且順序要求一樣。以"hello world"爲例,要求結果中必須包含hello和world,而且還要求他們是連着的,順序也是固定的,hello that word不滿足,world hello也不滿足條件。

增加分詞:

將查詢分詞順序打亂,就查詢不出結果了:

    query_string:和match類似,但是match需要指定字段名,query_string是在所有字段中搜索,範圍更廣泛。

不僅查詢了desc中包含了nosql,還查詢了desc包含Java的結果。所以說query_string是條件最寬泛,查詢結果最廣泛的查詢。

    如果想使用精確查詢,而且想要匹配的更多,可以使用match_phase,在使用term查詢的時候一定要注意最好不要使用多個單詞來查找,這種情況很容易造成誤查找