ElasticSearch查詢 第四篇:匹配查詢(Match)

ElasticSearch查詢 第一篇:搜索API

ElasticSearch查詢 第二篇:文檔更新

ElasticSearch查詢 第三篇:詞條查詢

ElasticSearch查詢 第四篇:匹配查詢(Match)

ElasticSearch查詢 第五篇:布爾查詢

匹配(Match)查詢屬于全文(Fulltext)查詢,不同于詞條查詢,ElasticSearch引擎在處理全文搜索時,首先分析(analyze)查詢字符串,然后根據(jù)分詞構(gòu)建查詢,最終返回查詢結(jié)果。匹配查詢共有三種類型,分別是布爾(boolean)、短語(phrase)和短語前綴(phrase_prefix),默認的匹配查詢是布爾類型,這意味著,ElasticSearch引擎首先分析查詢字符串,根據(jù)分析器對其進行分詞,例如,對于以下match查詢:

"query":{?

? ? ? "match":{?

? ? ? ? "eventname":"Microsoft Azure Party"

? ? ? }

查詢字符串是“Microsoft Azure Party”,被分析器分詞之后,產(chǎn)生三個小寫的單詞:microsoft,azure和party,然后根據(jù)分析的結(jié)果構(gòu)造一個布爾查詢,默認情況下,引擎內(nèi)部執(zhí)行的查詢邏輯是:只要eventname字段值中包含有任意一個關(guān)鍵字microsoft、azure或party,那么返回該文檔,偽代碼是:

if(doc.eventnamecontains"microsoft"ordoc.eventnamecontains"azure"ordoc.eventnamecontains "party") returndoc

匹配查詢的行為受到兩個參數(shù)的控制:

operator:表示單個字段如何匹配查詢條件的分詞

minimum_should_match:表示字段匹配的數(shù)量

通過調(diào)整operator 和?minimum_should_match 屬性值,控制匹配查詢的邏輯條件,進而控制引擎返回的結(jié)果。默認情況下operator的值是or,在構(gòu)造查詢時設(shè)置分詞之間的邏輯運算符,如果設(shè)置為and,那么引擎內(nèi)部執(zhí)行的查詢邏輯是:

if(doc.eventnamecontains"microsoft"anddoc.eventnamecontains"azure"anddoc.eventnamecontains "party") returndoc

對于minimum_should_match 屬性值,默認值是1,如果設(shè)置其值為2,表示分詞必須匹配查詢條件的數(shù)量為2,這意味著,只要文檔的eventname字段包含任意兩個關(guān)鍵字,就滿足查詢條件。

短語(Phrase)是一個字符串,其單個分詞出現(xiàn)的位置和分詞的數(shù)量是固定的。在進行短語查詢時,必須匹配短語中每個分詞及其相對位置,例如,對于包含兩個分詞的短語:“azure function”,分詞“azure”出現(xiàn)在分詞“function”之前,并且兩個詞條之間的位置相差一個空格,下面兩個字符串都滿足短語匹配:

"Azure Notification Hubs & Azure Function"

"Serverless Azure Function"

一,布爾匹配查詢

布爾型match查詢是把query參數(shù)中的條件字符串加以分析,使用索引映射中定義的分析器對字符串分詞,然后構(gòu)建相應(yīng)的子查詢,ElasticSearch選擇合適的分析器(analyzer),該analyzer和建立索引時使用的分析器相同。在執(zhí)行match查詢時,默認情況下,字段值必須匹配任意一個詞條,例如,當(dāng)文檔的eventname字段匹配任意一個分詞,azure、aws和cloud時,該文檔匹配match查詢,匹配分詞的數(shù)量是由匹配參數(shù)控制的。

POST /_search -d{? ? "from":10,? "size":5,? "query":{? ? ? ? "match":{? ? ? ? ? "eventname":"azure aws cloud"? ? ? }

? }

}

2,match查詢常用的參數(shù)

operator:用來控制match查詢匹配詞條的邏輯條件,默認值是or,如果設(shè)置為and,表示查詢滿足所有條件;

minimum_should_match:當(dāng)operator參數(shù)設(shè)置為or時,該參數(shù)用來控制應(yīng)該匹配的分詞的最少數(shù)量;

POST /search -d

{? ? "from":10,? "size":5,? "query":{? ? ? ? "match":{? ? ? ? ? "eventname":{? ? ? ? ? ? ? "query":"azure aws cloud security",? ? ? ? ? ? "operator":"or",? ? ? ? ? ? "minimum_should_match":2? ? ? ? }

? ? ? }

? }

}

二,短語匹配查詢(match_phrase)

在執(zhí)行短語匹配查詢時,ElasticSearch引擎首先分析(analyze)查詢字符串,從分析后的文本中構(gòu)建短語查詢,這意味著必須匹配短語中的所有分詞,并且保證各個分詞的相對位置不變:

POST /_search -d{? ? "from":1,? "size":100,? "fields":[ "eventname"],? "query":{? ? ? ? "match_phrase":{? ? ? ? ? "eventname":"Open Source"? ? ? }

? }

}

三,短語前綴匹配查詢(match_phrase_prefix)

除了把查詢文本的最后一個分詞只做前綴匹配之外,match_phrase_prefix和match_phrase查詢基本一樣,參數(shù) max_expansions 控制最后一個單詞會被重寫成多少個前綴,也就是,控制前綴擴展成分詞的數(shù)量,默認值是50。擴展的前綴數(shù)量越多,找到的文檔數(shù)量就越多;如果前綴擴展的數(shù)量太少,可能查找不到相應(yīng)的文檔,遺漏數(shù)據(jù)。如代碼所示,能夠查到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? ? ? ? }

? ? ? }

? }

}

四,多字段匹配查詢

在多個字段上執(zhí)行匹配相同的查詢,叫做"multi_match"查詢,Elasticsearch共有五種多字段匹配查詢:best_fields,most_fields,cross_fields,phrase和phrase_prefix,默認的是best_fields類型,如下示例代碼:

{

? "multi_match" : {

? ? "query":"Microsoft Azure",

? ? "fields": ["subject","message" ]

? }

}

參數(shù)query指定查詢的條件,在match查詢中,query中的參數(shù)被分析成分詞;參數(shù)type指定查詢的類型,默認值是best_fields;參數(shù)fields指定字段數(shù)組,ElasticSearch在每個字段上匹配參數(shù)query。對于best_fields和most_fields類型,每個字段都會拆分成一個子查詢(Individual Query),這意味著,ElasticSearch引擎在每個字段上生成一個子查詢,每個子查詢都匹配相同的query參數(shù)。

在示例中,參數(shù)query被拆分成兩個分詞microsoft和azure,ElasticSearch引擎有兩個參數(shù)設(shè)置每個子查詢(Individual Query)應(yīng)該匹配的分詞數(shù)量。

參數(shù)operator設(shè)置每個字段的子查詢的匹配分詞的邏輯方式,默認值是or,例如,如果設(shè)置參數(shù)operator為and,那么subject字段中必須同時含有microsoft和azure這兩個分詞。也就是說,匹配所有的分詞。

"operator":"and"

當(dāng)參數(shù)operator使用默認值時,參數(shù)minimum_should_match設(shè)置每個子查詢應(yīng)該匹配多少個分詞,默認值是1,例如,設(shè)置minimum_should_match為1,那么subject字段中至少含有microsoft或azure的一個分詞。

“operator”:"or""minimum_should_match":1

1,best_fields類型

best_fields類型是默認值,從指定的字段中匹配查詢,每個字段都計算評分(_score),返回最高的評分。如果不考慮評分,那么best_fields查詢類型的含義是從指定的字段中執(zhí)行查詢,返回匹配的文檔。

對于best_fields和most_fields查詢類型,它們都是基于字段拆分的,每個字段都會產(chǎn)生一個子查詢,

{

? "multi_match" : {

? ? "query":"Will Smith",

? ? "type":"best_fields",

? ? "fields":? ? ["first_name","last_name" ],

? ? "operator":"and"

? }

}

跟best_fields類型相同的查詢類型是dis_max,字母dis是單詞“Disjunction”的簡寫,意思是分離,dis_max查詢類型有一個子查詢數(shù)組,每一個子查詢都單獨計算評分,返回子查詢中最高的評分。如果忽略評分,那么dis_max查詢類型的含義是執(zhí)行指定的子查詢,返回匹配的文檔。

{

? "dis_max": {

? ? "queries": [

? ? ? { "match": {"subject":"brown fox" }},

? ? ? { "match": {"message":"brown fox" }}

? ? ]? }

}

2,most_fields類型

most_fields類型是默認值,從指定的字段中匹配查詢,每個字段都計算評分(_score),最后把每個字段的評分合并(Combine)在一起,求平均分。如果不考慮評分,那么most_fields查詢類型的含義是從指定的字段中執(zhí)行查詢,返回匹配的文檔。

該類型的查詢類似于布爾查詢的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,在每個字段上執(zhí)行查詢,然后返回最高的評分,類似于best_fields類型。

?View Code

4,cross_fields類型

該查詢類型是把query條件拆分成各個分詞,然后在各個字段上執(zhí)行匹配分詞,默認情況下,只要有一個字段匹配,那么返回文檔。

例如,query參數(shù)拆分成will和smith兩個分詞,當(dāng)參數(shù)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"? }

}

如果參數(shù)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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容