06.full_text multi_match查询
文章目錄
- 1. multi_match 簡介
 - 2. multi_match 查詢類型
 - 1. best_fields
 - 2. most_fields
 - 3. phrase和phrase_prefix
 - 4. cross_fields
 - 5. bool_prefix
 
1. multi_match 簡介
這個multi_match實際上算是類似一個組合查詢,他把dis_max query, phrase query, phrase_prefix,bool_prefix等給打包到一起了,使用的時候按照需要選用就可以了,這樣的話就更加簡單易用了。
 但是在使用的時候又不想純粹的只做組合的query(bool query,dis_max query等),哪些只做組合的query沒有自己的查詢語法,只是組合別的查詢query,multi_match有自己的查詢語法,是對多個查詢類型的封裝,暴露給外面的是一個新的api,不是bool那種還是使用子query的查詢方式。而且他允許多字段查詢。
一個簡單的樣例
GET /_search {"query": {"multi_match" : {"query": "this is a test", "fields": [ "subject", "message" ] }} }GET /_search {"query": {"multi_match" : {"query": "Will Smith","fields": [ "title", "*_name" ] #filed 的name可以使用通配符}} }GET /_search {"query": {"multi_match" : {"query" : "this is a test","fields" : [ "subject^3", "message" ] # subject會被提升權重}} }field的數量不能超過1024
2. multi_match 查詢類型
multi_match 是如何支持dis_max,phrase,phrase_prefix等等查詢的呢,在這里引入了一個參數叫 type,type的取值如下
best_fields:(默認)查找與任何字段匹配的文檔,但使用最佳字段中的_score。請參閱best_fields。
most_fields: 查找與任何字段匹配的文檔,并組合每個字段的_score。請參閱most_fields。
cross_fields: 使用相同的分析器將多個字段內容視為一個大字段。在大字段中查找每個單詞。參見cross_fields。
phrase: 在每個字段上運行match_phrase查詢,并使用最佳字段中的_score。參見詞組和詞組前綴。
phrase_prefix: 在每個字段上運行match_phrase_prefix查詢,并使用最佳字段中的_score。參見詞組和詞組前綴。
bool_prefix: 在每個字段上創建一個match_bool_prefix查詢,并組合每個字段中的_score。請參閱bool_prefix。
1. best_fields
當您在同一字段中search多個單詞時,best_fields類型最有用。例如,搜索“brown fox”的時候,單個字段中的“brown fox”比一個字段中的“brown”和另一字段中的“ fox”更有意義。
best_fields類型為每個字段生成一個匹配查詢,并將它們包裝在dis_max查詢中,以查找單個最佳匹配字段。例如,此查詢:
GET /_search {"query": {"multi_match" : {"query": "brown fox","type": "best_fields","fields": [ "subject", "message" ],"tie_breaker": 0.3}} } GET /_search {"query": {"dis_max": {"queries": [{ "match": { "subject": "brown fox" }},{ "match": { "message": "brown fox" }}],"tie_breaker": 0.3}} }其中的tie_breaker和dis_max的查詢是一樣的含義
因為best_fields and most_fields 的multi_match是以field為中心進行查詢的,所以operator和minimum_should_match參數會單獨的對每個field起作用
GET /_search {"query": {"multi_match" : {"query": "Will Smith","type": "best_fields","fields": [ "first_name", "last_name" ],"operator": "and" }} }這個對應的語義是
(+first_name:will +first_name:smith) | (+last_name:will +last_name:smith)2. most_fields
當多個field對相同內容采用不用的analyze進行存儲,如果想對這多個字段進行搜索從而獲得更加準確的結果的話,使用most_fields更加合適。比如,main field可能包含synonums,stemming , terms without diacritic(變音符),
 second field 包含了原有的terms, third field 包含了shingles。這樣的話就可以使用三個field的score來計算final score進而得到更好的排序效果。
3. phrase和phrase_prefix
phrase_prefix 和phrase和 best_fields類似
 也可以使用tie_breaker參數,同時還可以使用boost,lenient,slop等在match_phase中使用的參數
等同于
GET /_search {"query": {"dis_max": {"queries": [{ "match_phrase_prefix": { "subject": "quick brown f" }},{ "match_phrase_prefix": { "message": "quick brown f" }}]}} }4. cross_fields
cross_fields類型對于結構化文檔(其中多個字段應匹配)特別有用。例如,當在first_name和last_name字段中查詢“ Will Smith”時,最匹配的一個字段中可能有“ Will”,而另一個字段中有“ Smith”。
GET /_search {"query": {"multi_match" : {"query": "Will Smith","type": "cross_fields","fields": [ "first_name", "last_name" ],"operator": "and"}} }執行的邏輯是
+(first_name:will last_name:will) +(first_name:smith last_name:smith)5. bool_prefix
GET /_search {"query": {"multi_match" : {"query": "quick brown f","type": "bool_prefix","fields": [ "subject", "message" ]}} }總結
以上是生活随笔為你收集整理的06.full_text multi_match查询的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 05.full_text match_b
 - 下一篇: 07.full text query_