elasticsearch全文搜尋

2021-10-19 19:48:04 字數 4067 閱讀 3061

put /test4

}, "properties": ,

"age": ,

"mail": ,

"hobby": }}}

結果:

插入資料:

post /test4/_bulk}}}}}

單詞搜尋:

post /test4/_search

},"highlight": }}}

結果:

,

"hits" : ,

"max_score" : 0.816522,

"hits" : [

,"highlight" : },,

"highlight" : }]

}}

過程說明:

檢查字段型別

愛好 hobby 欄位是乙個 text 型別( 指定了ik分詞器),這意味著查詢字串本身也應該被分詞。

分析查詢字串 。

將查詢的字串 「**」 傳入ik分詞器中,輸出的結果是單個項 **。因為只有乙個單詞項,所以 match 查詢執行的是單個底層 term 查詢。

查詢匹配文件 。

用 term 查詢在倒排索引中查詢 「**」 然後獲取一組包含該項的文件,本例的結果是文件:3 、5 。

為每個文件評分 。

用 term 查詢計算每個文件相關度評分 _score ,這是種將 詞頻(term frequency,即詞 「**」 在相關文件的hobby 字段**現的頻率)和 反向文件頻率(inverse document frequency,即詞 「**」 在所有文件的hobby 字段**現的頻率),以及欄位的長度(即欄位越短相關度越高)相結合的計算方式。

post /test4/_search

},"highlight": }}}

結果:

,

"hits" : ,

"max_score" : 1.319227,

"hits" : [

,"highlight" : },,

"highlight" : },,

"highlight" : },,

"highlight" : }]

}}

可以看到,包含了「**」、「籃球」的資料都已經被搜尋到了。

可是,搜尋的結果並不符合我們的預期,因為我們想搜尋的是既包含「**」又包含「籃球」的使用者,顯然結果返回的「或」的關係。

在elasticsearch中,可以指定詞之間的邏輯關係,如下:

post /test4/_search}},

"highlight": }}}

結果:可以看到結果符合預期。

,

"hits" : ,

"max_score" : 1.319227,

"hits" : [

,"highlight" : }]

}}

前面我們測試了「or」 和 「and」搜尋,這是兩個極端,其實在實際場景中,並不會選取這2個極端,更有可能是選取這種,或者說,只需要符合一定的相似度就可以查詢到資料,在elasticsearch中也支援這樣的查詢,通過minimum_should_match來指定匹配度,如:70%;

post /test4/_search}},

"highlight": }}}

結果:相似度為80%的情況下,查詢到4條資料

,

"hits" : ,

"max_score" : 1.6214579,

"hits" : [

,"highlight" : },,

"highlight" : },,

"highlight" : },,

"highlight" : }]

}}

設定40%進行測試:

post /test4/_search}},

"highlight": }}}

結果:相似度為40%的情況下,查詢到5條資料

,

"hits" : ,

"max_score" : 1.6214579,

"hits" : [

,"highlight" : },,

"highlight" : },,

"highlight" : },,

"highlight" : },,

"highlight" : }]

}}

結論:相似度應該多少合適,需要在實際的需求中進行反覆測試,才可得到合理的值。

在搜尋時,也可以使用過濾器中講過的bool組合查詢,示例:

post /test4/_search

},"must_not":

},"should":[}]

}},"highlight": }}}

結果:

,

"hits" : ,

"max_score" : 1.8336569,

"hits" : [

,"highlight" : },,

"highlight" : }]

}}

上面搜尋的意思是:

搜尋結果中必須包含籃球,不能包含**,如果包含了游泳,那麼它的相似度更高。

評分的計算規則:

bool 查詢會為每個文件計算相關度評分 _score , 再將所有匹配的 must 和 should 語句的分數 _score 求和,最後除以 must 和 should 語句的總數。

must_not 語句不會影響評分; 它的作用只是將不相關的文件排除。

預設情況下,should中的內容不是必須匹配的,如果查詢語句中沒有must,那麼就會至少匹配其中乙個。當然了,也可以通過minimum_should_match引數進行控制,該值可以是數字也可以的百分比。

示例:

post /test4/_search

},},}],

"minimum_should_match":2}},

"highlight": }}}

結果:

,

"hits" : ,

"max_score" : 2.1357489,

"hits" : [

,"highlight" : },,

"highlight" : }]

}}

minimum_should_match為2,意思是should中的三個詞,至少要滿足2個。

有些時候,我們可能需要對某些詞增加權重來影響該條資料的得分。如下:

搜尋關鍵字為「游泳籃球」,如果結果中包含了「**」權重為10,包含了「跑步」權重為2。

post /test4/_search

}},"should": [}},

}}]}

}, "highlight": }}}

結果:

,

"hits" : ,

"max_score" : 2.1357489,

"hits" : [

,"highlight" : },,

"highlight" : }]

}}

如果不設定權重的查詢結果是這樣:

,

"hits" : ,

"max_score" : 3.630794,

"hits" : [

,"highlight" : },,

"highlight" : }]

}}

Elasticsearch 全文搜尋

1,初始化資料 delete my index put my index post my index my type bulk 2,match 單個詞查詢 get my index my type search 3,match 多詞查詢 get my index my type search 3.1...

elasticSearch 全文檢索工具

index es裡的index相當於乙個資料庫。type 相當於資料庫裡的乙個表。id 唯一,相當於主鍵。node 節點是es例項,一台機器可以執行多個例項,但是同一臺機器上的例項在配置檔案中要確保http和tcp埠不同 下面有講 cluster 代表乙個集群,集群中有多個節點,其中有乙個會被選為主...

全文搜尋之 Elasticsearch

elasticsearch es 是乙個基於 lucene 的開源搜尋引擎,它不但穩定 可靠 快速,而且也具有良好的水平擴充套件能力,是專門為分布式環境設計的。json 輸入 輸出格式為 json,意味著不需要定義 schema,快捷方便 restful 基本所有操作 索引 查詢 甚至是配置 都可以...