白话Elasticsearch13-深度探秘搜索技术之基于multi_match+most fields策略进行multi-field搜索
文章目錄
- 概述
- 官網
- 示例
- 構造模擬數據
- 普通查詢
- 使用 multi_match + most fileds查詢
- best fields VS most fields
概述
繼續跟中華石杉老師學習ES,第十三篇
課程地址: https://www.roncoo.com/view/55
官網
https://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-dsl-multi-match-query.html
示例
上一節 我們演示了best_fileds的用法 白話Elasticsearch12-基于multi_match + bestfields語法實現dis_max+tie_breaker ,這里我們繼續來看下 most fields 的用法
構造模擬數據
POST /forum/_mapping/article {"properties": {"sub_title": {"type": "text","analyzer": "english","fields": {"std": {"type": "text","analyzer": "standard"}}}} }增加一個字段sub_title,使用english分詞器(會進行stemmer), 然后在這對sub_title增加一個子field ,使用standard分詞器(不會進行stemmer).
批量更新數據
POST /forum/article/_bulk { "update": { "_id": "1"} } { "doc" : {"sub_title" : "learning more courses"} } { "update": { "_id": "2"} } { "doc" : {"sub_title" : "learned a lot of course"} } { "update": { "_id": "3"} } { "doc" : {"sub_title" : "we have a lot of fun"} } { "update": { "_id": "4"} } { "doc" : {"sub_title" : "both of them are good"} } { "update": { "_id": "5"} } { "doc" : {"sub_title" : "haha, hello world"} }普通查詢
GET /forum/article/_search {"query": {"match": {"sub_title": "learning courses"}} }sub_title用的是enligsh analyzer,所以還原了單詞.
因為如果我們用的是類似于english analyzer這種分詞器的話,就會將單詞還原為其最基本的形態,stemmer
learning --> learn learned --> learn courses --> coursesub_titile: learning coureses 就變成了 learn course
返回結果
使用 multi_match + most fileds查詢
GET /forum/article/_search {"query": {"multi_match": {"query": "learning courses","type": "most_fields","fields": ["sub_title","sub_title.std"]}} }結果
best fields VS most fields
-
best-fields策略,主要是說將某一個field匹配盡可能多的關鍵詞的doc優先返回回來
-
most-fields策略,主要是說盡可能返回更多field匹配到某個關鍵詞的doc,優先返回回來
best_fields,是對多個field進行搜索,挑選某個field匹配度最高的那個分數,同時在多個query最高分相同的情況下,在一定程度上考慮其他query的分數。簡單來說,你對多個field進行搜索,就想搜索到某一個field盡可能包含更多關鍵字的數據
- 優點:通過best_fields策略,以及綜合考慮其他field,還有minimum_should_match支持,可以盡可能精準地將匹配的結果推送到最前面
- 缺點:除了那些精準匹配的結果,其他差不多大的結果,排序結果不是太均勻,沒有什么區分度了
實際的例子:百度之類的搜索引擎,最匹配的到最前面,但是其他的就沒什么區分度了
most_fields,綜合多個field一起進行搜索,盡可能多地讓所有field的query參與到總分數的計算中來,此時就會是個大雜燴,出現類似best_fields案例最開始的那個結果,結果不一定精準,某一個document的一個field包含更多的關鍵字,但是因為其他document有更多field匹配到了,所以排在了前面;所以需要建立類似sub_title.std這樣的field,盡可能讓某一個field精準匹配query string,貢獻更高的分數,將更精準匹配的數據排到前面
- 優點:將盡可能匹配更多field的結果推送到最前面,整個排序結果是比較均勻的
- 缺點:可能那些精準匹配的結果,無法推送到最前面
實際的例子:wiki,明顯的most_fields策略,搜索結果比較均勻,但是的確要翻好幾頁才能找到最匹配的結果
總結
以上是生活随笔為你收集整理的白话Elasticsearch13-深度探秘搜索技术之基于multi_match+most fields策略进行multi-field搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白话Elasticsearch12-深度
- 下一篇: 白话Elasticsearch14-深度