ElasticSearch查詢(xún) 第一篇:搜索API
ElasticSearch查詢(xún) 第三篇:詞條查詢(xún)
ElasticSearch查詢(xún) 第四篇:匹配查詢(xún)(Match)
ElasticSearch查詢(xún) 第五篇:布爾查詢(xún)
匹配(Match)查詢(xún)屬于全文(Fulltext)查詢(xún),不同于詞條查詢(xún),ElasticSearch引擎在處理全文搜索時(shí),首先分析(analyze)查詢(xún)字符串,然后根據(jù)分詞構(gòu)建查詢(xún),最終返回查詢(xún)結(jié)果。匹配查詢(xún)共有三種類(lèi)型,分別是布爾(boolean)、短語(yǔ)(phrase)和短語(yǔ)前綴(phrase_prefix),默認(rèn)的匹配查詢(xún)是布爾類(lèi)型,這意味著,ElasticSearch引擎首先分析查詢(xún)字符串,根據(jù)分析器對(duì)其進(jìn)行分詞,例如,對(duì)于以下match查詢(xún):
"query":{?
? ? ? "match":{?
? ? ? ? "eventname":"Microsoft Azure Party"
? ? ? }
查詢(xún)字符串是“Microsoft Azure Party”,被分析器分詞之后,產(chǎn)生三個(gè)小寫(xiě)的單詞:microsoft,azure和party,然后根據(jù)分析的結(jié)果構(gòu)造一個(gè)布爾查詢(xún),默認(rèn)情況下,引擎內(nèi)部執(zhí)行的查詢(xún)邏輯是:只要eventname字段值中包含有任意一個(gè)關(guān)鍵字microsoft、azure或party,那么返回該文檔,偽代碼是:
if(doc.eventnamecontains"microsoft"ordoc.eventnamecontains"azure"ordoc.eventnamecontains "party") returndoc
匹配查詢(xún)的行為受到兩個(gè)參數(shù)的控制:
operator:表示單個(gè)字段如何匹配查詢(xún)條件的分詞
minimum_should_match:表示字段匹配的數(shù)量
通過(guò)調(diào)整operator 和?minimum_should_match 屬性值,控制匹配查詢(xún)的邏輯條件,進(jìn)而控制引擎返回的結(jié)果。默認(rèn)情況下operator的值是or,在構(gòu)造查詢(xún)時(shí)設(shè)置分詞之間的邏輯運(yùn)算符,如果設(shè)置為and,那么引擎內(nèi)部執(zhí)行的查詢(xún)邏輯是:
if(doc.eventnamecontains"microsoft"anddoc.eventnamecontains"azure"anddoc.eventnamecontains "party") returndoc
對(duì)于minimum_should_match 屬性值,默認(rèn)值是1,如果設(shè)置其值為2,表示分詞必須匹配查詢(xún)條件的數(shù)量為2,這意味著,只要文檔的eventname字段包含任意兩個(gè)關(guān)鍵字,就滿(mǎn)足查詢(xún)條件。
短語(yǔ)(Phrase)是一個(gè)字符串,其單個(gè)分詞出現(xiàn)的位置和分詞的數(shù)量是固定的。在進(jìn)行短語(yǔ)查詢(xún)時(shí),必須匹配短語(yǔ)中每個(gè)分詞及其相對(duì)位置,例如,對(duì)于包含兩個(gè)分詞的短語(yǔ):“azure function”,分詞“azure”出現(xiàn)在分詞“function”之前,并且兩個(gè)詞條之間的位置相差一個(gè)空格,下面兩個(gè)字符串都滿(mǎn)足短語(yǔ)匹配:
"Azure Notification Hubs & Azure Function"
"Serverless Azure Function"
一,布爾匹配查詢(xún)
布爾型match查詢(xún)是把query參數(shù)中的條件字符串加以分析,使用索引映射中定義的分析器對(duì)字符串分詞,然后構(gòu)建相應(yīng)的子查詢(xún),ElasticSearch選擇合適的分析器(analyzer),該analyzer和建立索引時(shí)使用的分析器相同。在執(zhí)行match查詢(xún)時(shí),默認(rèn)情況下,字段值必須匹配任意一個(gè)詞條,例如,當(dāng)文檔的eventname字段匹配任意一個(gè)分詞,azure、aws和cloud時(shí),該文檔匹配match查詢(xún),匹配分詞的數(shù)量是由匹配參數(shù)控制的。
POST /_search -d{? ? "from":10,? "size":5,? "query":{? ? ? ? "match":{? ? ? ? ? "eventname":"azure aws cloud"? ? ? }
? }
}
2,match查詢(xún)常用的參數(shù)
operator:用來(lái)控制match查詢(xún)匹配詞條的邏輯條件,默認(rèn)值是or,如果設(shè)置為and,表示查詢(xún)滿(mǎn)足所有條件;
minimum_should_match:當(dāng)operator參數(shù)設(shè)置為or時(shí),該參數(shù)用來(lái)控制應(yīng)該匹配的分詞的最少數(shù)量;
POST /search -d
{? ? "from":10,? "size":5,? "query":{? ? ? ? "match":{? ? ? ? ? "eventname":{? ? ? ? ? ? ? "query":"azure aws cloud security",? ? ? ? ? ? "operator":"or",? ? ? ? ? ? "minimum_should_match":2? ? ? ? }
? ? ? }
? }
}
二,短語(yǔ)匹配查詢(xún)(match_phrase)
在執(zhí)行短語(yǔ)匹配查詢(xún)時(shí),ElasticSearch引擎首先分析(analyze)查詢(xún)字符串,從分析后的文本中構(gòu)建短語(yǔ)查詢(xún),這意味著必須匹配短語(yǔ)中的所有分詞,并且保證各個(gè)分詞的相對(duì)位置不變:
POST /_search -d{? ? "from":1,? "size":100,? "fields":[ "eventname"],? "query":{? ? ? ? "match_phrase":{? ? ? ? ? "eventname":"Open Source"? ? ? }
? }
}
三,短語(yǔ)前綴匹配查詢(xún)(match_phrase_prefix)
除了把查詢(xún)文本的最后一個(gè)分詞只做前綴匹配之外,match_phrase_prefix和match_phrase查詢(xún)基本一樣,參數(shù) max_expansions 控制最后一個(gè)單詞會(huì)被重寫(xiě)成多少個(gè)前綴,也就是,控制前綴擴(kuò)展成分詞的數(shù)量,默認(rèn)值是50。擴(kuò)展的前綴數(shù)量越多,找到的文檔數(shù)量就越多;如果前綴擴(kuò)展的數(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? ? ? ? }
? ? ? }
? }
}
四,多字段匹配查詢(xún)
在多個(gè)字段上執(zhí)行匹配相同的查詢(xún),叫做"multi_match"查詢(xún),Elasticsearch共有五種多字段匹配查詢(xún):best_fields,most_fields,cross_fields,phrase和phrase_prefix,默認(rèn)的是best_fields類(lèi)型,如下示例代碼:
{
? "multi_match" : {
? ? "query":"Microsoft Azure",
? ? "fields": ["subject","message" ]
? }
}
參數(shù)query指定查詢(xún)的條件,在match查詢(xún)中,query中的參數(shù)被分析成分詞;參數(shù)type指定查詢(xún)的類(lèi)型,默認(rèn)值是best_fields;參數(shù)fields指定字段數(shù)組,ElasticSearch在每個(gè)字段上匹配參數(shù)query。對(duì)于best_fields和most_fields類(lèi)型,每個(gè)字段都會(huì)拆分成一個(gè)子查詢(xún)(Individual Query),這意味著,ElasticSearch引擎在每個(gè)字段上生成一個(gè)子查詢(xún),每個(gè)子查詢(xún)都匹配相同的query參數(shù)。
在示例中,參數(shù)query被拆分成兩個(gè)分詞microsoft和azure,ElasticSearch引擎有兩個(gè)參數(shù)設(shè)置每個(gè)子查詢(xún)(Individual Query)應(yīng)該匹配的分詞數(shù)量。
參數(shù)operator設(shè)置每個(gè)字段的子查詢(xún)的匹配分詞的邏輯方式,默認(rèn)值是or,例如,如果設(shè)置參數(shù)operator為and,那么subject字段中必須同時(shí)含有microsoft和azure這兩個(gè)分詞。也就是說(shuō),匹配所有的分詞。
"operator":"and"
當(dāng)參數(shù)operator使用默認(rèn)值時(shí),參數(shù)minimum_should_match設(shè)置每個(gè)子查詢(xún)應(yīng)該匹配多少個(gè)分詞,默認(rèn)值是1,例如,設(shè)置minimum_should_match為1,那么subject字段中至少含有microsoft或azure的一個(gè)分詞。
“operator”:"or""minimum_should_match":1
1,best_fields類(lèi)型
best_fields類(lèi)型是默認(rèn)值,從指定的字段中匹配查詢(xún),每個(gè)字段都計(jì)算評(píng)分(_score),返回最高的評(píng)分。如果不考慮評(píng)分,那么best_fields查詢(xún)類(lèi)型的含義是從指定的字段中執(zhí)行查詢(xún),返回匹配的文檔。
對(duì)于best_fields和most_fields查詢(xún)類(lèi)型,它們都是基于字段拆分的,每個(gè)字段都會(huì)產(chǎn)生一個(gè)子查詢(xún),
{
? "multi_match" : {
? ? "query":"Will Smith",
? ? "type":"best_fields",
? ? "fields":? ? ["first_name","last_name" ],
? ? "operator":"and"
? }
}
跟best_fields類(lèi)型相同的查詢(xún)類(lèi)型是dis_max,字母dis是單詞“Disjunction”的簡(jiǎn)寫(xiě),意思是分離,dis_max查詢(xún)類(lèi)型有一個(gè)子查詢(xún)數(shù)組,每一個(gè)子查詢(xún)都單獨(dú)計(jì)算評(píng)分,返回子查詢(xún)中最高的評(píng)分。如果忽略評(píng)分,那么dis_max查詢(xún)類(lèi)型的含義是執(zhí)行指定的子查詢(xún),返回匹配的文檔。
{
? "dis_max": {
? ? "queries": [
? ? ? { "match": {"subject":"brown fox" }},
? ? ? { "match": {"message":"brown fox" }}
? ? ]? }
}
2,most_fields類(lèi)型
most_fields類(lèi)型是默認(rèn)值,從指定的字段中匹配查詢(xún),每個(gè)字段都計(jì)算評(píng)分(_score),最后把每個(gè)字段的評(píng)分合并(Combine)在一起,求平均分。如果不考慮評(píng)分,那么most_fields查詢(xún)類(lèi)型的含義是從指定的字段中執(zhí)行查詢(xún),返回匹配的文檔。
該類(lèi)型的查詢(xún)類(lèi)似于布爾查詢(xún)的should子句查詢(xún),
{
? "bool": {
? ? "should": [
? ? ? { "match": {"title":"quick brown fox" }},
? ? ? { "match": {"title.original":"quick brown fox" }},
? ? ? { "match": {"title.shingles":"quick brown fox" }}
? ? ]
? }
}
3,phrase和phrase_prefix查詢(xún)類(lèi)型
該類(lèi)型的query是phrase,在每個(gè)字段上執(zhí)行查詢(xún),然后返回最高的評(píng)分,類(lèi)似于best_fields類(lèi)型。
?View Code
4,cross_fields類(lèi)型
該查詢(xún)類(lèi)型是把query條件拆分成各個(gè)分詞,然后在各個(gè)字段上執(zhí)行匹配分詞,默認(rèn)情況下,只要有一個(gè)字段匹配,那么返回文檔。
例如,query參數(shù)拆分成will和smith兩個(gè)分詞,當(dāng)參數(shù)operator為and時(shí),字段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,其等價(jià)的邏輯是,只要字段?first_name或last_name中包含 will或smith就返回文檔。
出處:http://www.cnblogs.com/ljhdo/p/4577065.html