匹配(Match)查詢屬於全文(Fulltext)查詢,不同於詞條查詢,ElasticSearch引擎在處理全文搜索時,首先分析(analyze)查詢字符串,然後根據分詞構建查詢,最終返回查詢結果。匹配查詢共有三種類型,分別是布爾(boolean)、短語(phrase)和短語前綴(phrase_prefix),默認的匹配查詢是布爾類型,這意味着,ElasticSearch引擎首先分析查詢字符串,根據分析器對其進行分詞,例如,對於以下match查詢:
"query":{
"match":{
"eventname":"Microsoft Azure Party"
}
查詢字符串是“Microsoft Azure Party”,被分析器分詞之後,產生三個小寫的單詞:microsoft,azure和party,然後根據分析的結果構造一個布爾查詢,默認情況下,引擎內部執行的查詢邏輯是:只要eventname字段值中包含有任意一個關鍵字microsoft、azure或party,那麼返回該文檔,僞代碼是:
if(doc.eventnamecontains"microsoft"ordoc.eventnamecontains"azure"ordoc.eventnamecontains "party") returndoc
匹配查詢的行爲受到兩個參數的控制:
operator:表示單個字段如何匹配查詢條件的分詞
minimum_should_match:表示字段匹配的數量
通過調整operator 和 minimum_should_match 屬性值,控制匹配查詢的邏輯條件,進而控制引擎返回的結果。默認情況下operator的值是or,在構造查詢時設置分詞之間的邏輯運算符,如果設置爲and,那麼引擎內部執行的查詢邏輯是:
if(doc.eventnamecontains"microsoft"anddoc.eventnamecontains"azure"anddoc.eventnamecontains "party") returndoc
對於minimum_should_match 屬性值,默認值是1,如果設置其值爲2,表示分詞必須匹配查詢條件的數量爲2,這意味着,只要文檔的eventname字段包含任意兩個關鍵字,就滿足查詢條件。
短語(Phrase)是一個字符串,其單個分詞出現的位置和分詞的數量是固定的。在進行短語查詢時,必須匹配短語中每個分詞及其相對位置,例如,對於包含兩個分詞的短語:“azure function”,分詞“azure”出現在分詞“function”之前,並且兩個詞條之間的位置相差一個空格,下面兩個字符串都滿足短語匹配:
"Azure Notification Hubs & Azure Function"
"Serverless Azure Function"
一,布爾匹配查詢
布爾型match查詢是把query參數中的條件字符串加以分析,使用索引映射中定義的分析器對字符串分詞,然後構建相應的子查詢,ElasticSearch選擇合適的分析器(analyzer),該analyzer和建立索引時使用的分析器相同。在執行match查詢時,默認情況下,字段值必須匹配任意一個詞條,例如,當文檔的eventname字段匹配任意一個分詞,azure、aws和cloud時,該文檔匹配match查詢,匹配分詞的數量是由匹配參數控制的。
POST /_search -d{ "from":10, "size":5, "query":{ "match":{ "eventname":"azure aws cloud" }
}
}
2,match查詢常用的參數
operator:用來控制match查詢匹配詞條的邏輯條件,默認值是or,如果設置爲and,表示查詢滿足所有條件;
minimum_should_match:當operator參數設置爲or時,該參數用來控制應該匹配的分詞的最少數量;
POST /search -d
{ "from":10, "size":5, "query":{ "match":{ "eventname":{ "query":"azure aws cloud security", "operator":"or", "minimum_should_match":2 }
}
}
}
二,短語匹配查詢(match_phrase)
在執行短語匹配查詢時,ElasticSearch引擎首先分析(analyze)查詢字符串,從分析後的文本中構建短語查詢,這意味着必須匹配短語中的所有分詞,並且保證各個分詞的相對位置不變:
POST /_search -d{ "from":1, "size":100, "fields":[ "eventname"], "query":{ "match_phrase":{ "eventname":"Open Source" }
}
}
三,短語前綴匹配查詢(match_phrase_prefix)
除了把查詢文本的最後一個分詞只做前綴匹配之外,match_phrase_prefix和match_phrase查詢基本一樣,參數 max_expansions 控制最後一個單詞會被重寫成多少個前綴,也就是,控制前綴擴展成分詞的數量,默認值是50。擴展的前綴數量越多,找到的文檔數量就越多;如果前綴擴展的數量太少,可能查找不到相應的文檔,遺漏數據。如代碼所示,能夠查到eventname包含"Open Source Hack Night"的文檔。
POST /_search -d{ "from":1, "size":100, "fields":[ "eventname"], "query":{ "match_phrase_prefix":{ "eventname":{ "query":"Open Source hac", "max_expansions":50 }
}
}
}
四,多字段匹配查詢
在多個字段上執行匹配相同的查詢,叫做"multi_match"查詢,Elasticsearch共有五種多字段匹配查詢:best_fields,most_fields,cross_fields,phrase和phrase_prefix,默認的是best_fields類型,如下示例代碼:
{
"multi_match" : {
"query":"Microsoft Azure",
"fields": ["subject","message" ]
}
}
參數query指定查詢的條件,在match查詢中,query中的參數被分析成分詞;參數type指定查詢的類型,默認值是best_fields;參數fields指定字段數組,ElasticSearch在每個字段上匹配參數query。對於best_fields和most_fields類型,每個字段都會拆分成一個子查詢(Individual Query),這意味着,ElasticSearch引擎在每個字段上生成一個子查詢,每個子查詢都匹配相同的query參數。
在示例中,參數query被拆分成兩個分詞microsoft和azure,ElasticSearch引擎有兩個參數設置每個子查詢(Individual Query)應該匹配的分詞數量。
參數operator設置每個字段的子查詢的匹配分詞的邏輯方式,默認值是or,例如,如果設置參數operator爲and,那麼subject字段中必須同時含有microsoft和azure這兩個分詞。也就是說,匹配所有的分詞。
"operator":"and"
當參數operator使用默認值時,參數minimum_should_match設置每個子查詢應該匹配多少個分詞,默認值是1,例如,設置minimum_should_match爲1,那麼subject字段中至少含有microsoft或azure的一個分詞。
“operator”:"or""minimum_should_match":1
1,best_fields類型
best_fields類型是默認值,從指定的字段中匹配查詢,每個字段都計算評分(_score),返回最高的評分。如果不考慮評分,那麼best_fields查詢類型的含義是從指定的字段中執行查詢,返回匹配的文檔。
對於best_fields和most_fields查詢類型,它們都是基於字段拆分的,每個字段都會產生一個子查詢,
{
"multi_match" : {
"query":"Will Smith",
"type":"best_fields",
"fields": ["first_name","last_name" ],
"operator":"and"
}
}
跟best_fields類型相同的查詢類型是dis_max,字母dis是單詞“Disjunction”的簡寫,意思是分離,dis_max查詢類型有一個子查詢數組,每一個子查詢都單獨計算評分,返回子查詢中最高的評分。如果忽略評分,那麼dis_max查詢類型的含義是執行指定的子查詢,返回匹配的文檔。
{
"dis_max": {
"queries": [
{ "match": {"subject":"brown fox" }},
{ "match": {"message":"brown fox" }}
] }
}
2,most_fields類型
most_fields類型是默認值,從指定的字段中匹配查詢,每個字段都計算評分(_score),最後把每個字段的評分合並(Combine)在一起,求平均分。如果不考慮評分,那麼most_fields查詢類型的含義是從指定的字段中執行查詢,返回匹配的文檔。
該類型的查詢類似於布爾查詢的should子句查詢,
{
"bool": {
"should": [
{ "match": {"title":"quick brown fox" }},
{ "match": {"title.original":"quick brown fox" }},
{ "match": {"title.shingles":"quick brown fox" }}
]
}
}
3,phrase和phrase_prefix查詢類型
該類型的query是phrase,在每個字段上執行查詢,然後返回最高的評分,類似於best_fields類型。
View Code
4,cross_fields類型
該查詢類型是把query條件拆分成各個分詞,然後在各個字段上執行匹配分詞,默認情況下,只要有一個字段匹配,那麼返回文檔。
例如,query參數拆分成will和smith兩個分詞,當參數operator爲and時,字段first_name或last_name必須包含will ,並且first_name或last_name必須包含smith。
{
"multi_match" : {
"query":"Will Smith",
"type":"cross_fields",
"fields": ["first_name","last_name" ],
"operator":"and" }
}
如果參數operator爲or,字段first_name或last_name必須包含will ,或者 first_name或last_name必須包含smith,其等價的邏輯是,只要字段 first_name或last_name中包含 will或smith就返回文檔。
出處:http://www.cnblogs.com/ljhdo/p/4577065.html
作者:不落的風箏
鏈接:https://www.jianshu.com/p/88c726f7e6e1
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。