- minimum_should_match的使用
1.1 數(shù)據(jù)準(zhǔn)備
1.2 實(shí)戰(zhàn)分析
--1.2.1 在match中的應(yīng)用
--1.2.2 在should中的應(yīng)用
--1.2.3 should關(guān)鍵字失去or的功能解決方案 - minimum_should_match參數(shù)說明
2.1 傳入?yún)?shù)為數(shù)字
2.2 傳入的參數(shù)為百分比
2.3 組合方式
2.4 多種組合條件
minimum_should_match顧名思義:最低匹配度,即條件在倒排索引中最低的匹配度。
1. minimum_should_match的使用
1.1 數(shù)據(jù)準(zhǔn)備
# 創(chuàng)建索引
PUT test_match
# 創(chuàng)建映射
PUT test_match/_mapping
{
"properties":{
"price":{
"type":"double"
},
"name":{
"type":"text"
}
}
}
# 批量導(dǎo)入數(shù)據(jù)
PUT _bulk
{"create":{"_index":"test_match","_type":"_doc"}}
{"name":"ES,rabbitmq,SPRING,REDIS","price":90.00}
{"create":{"_index":"test_match","_type":"_doc"}}
{"name":"PHP,JAVA,redis,JSP,kafaka,rabbitmq","price":80.00}
{"create":{"_index":"test_match","_type":"_doc"}}
{"name":"PHP,JAVA,C++,C,python,go","price":99.00}
{"create":{"_index":"test_match","_type":"_doc"}}
{"name":"hadoop,es","price":50.00}
{"create":{"_index":"test_match","_type":"_doc"}}
{"name":"hello,pool,mq","price":100.00}
1.2 實(shí)戰(zhàn)分析
1.2.1 在match中的應(yīng)用
minnum_should_match:當(dāng)operator參數(shù)設(shè)置為or時(shí)如捅,該參數(shù)用來控制匹配的分詞的最少數(shù)量草则。
如上例中旺遮,name
字段的類型為text
陨界。例如第一條數(shù)據(jù)中倒排索引存儲(chǔ)的數(shù)據(jù)為:
而match
的查詢條件也會(huì)進(jìn)行分詞顿痪,minnum_should_match
便是用于控制分詞條件在倒排索引中最少的數(shù)量镊辕。
# 復(fù)雜查詢
GET test_match/_search
{
"query": {
"match": {
"name": {
"query": "java,es",
"minimum_should_match": 2
}
}
}
}
1.2.2 在should中的應(yīng)用
match操作,在es的底層會(huì)被轉(zhuǎn)換為如下的term操作蚁袭。
GET test_match/_search
{
"query": {
"bool": {
"should": [
{"term": {
"name": {
"value": "rabbitmq"
}
}},
{
"term": {
"name": {
"value": "es"
}
}
}
],
"minimum_should_match": 2
}
}
}
1.3 should關(guān)鍵字失去or的功能解決方案
照片出處... elasticsearch should實(shí)現(xiàn)or功能征懈,設(shè)置minimum_should_match
minimum_should_match用于控制bool中should列表,至少匹配幾個(gè)條件才召回doc揩悄。
當(dāng)默認(rèn)不傳minimum_should_match
的情況下卖哎,查詢分為兩個(gè)情況
- 當(dāng)bool處在query上下文時(shí),若must或者filter匹配了doc删性,那么should即使一條都不滿足也可以召回doc(如圖1.3.1)亏娜;
- 當(dāng)bool處于filter上下文時(shí),或者bool處于query上下文蹬挺,但沒有must或者filter子句照藻,should至少匹配一個(gè)才會(huì)召回doc(如圖1.3.2);
GET test_match/_search
{
"query": {
"bool": {
"filter": [
{
"bool":{
"should":[
{"term":{"name":"es"}},
{"term":{"name":"rabbitmq"}}
]
}
},
{
"range":{
"price":{
"gte":80.00
}
}
}
]
}
}
}
注意:當(dāng)傳入minimum_should_match的情況下汗侵,只會(huì)將滿足should匹配條件的文檔召回幸缕。
2. minimum_should_match參數(shù)說明
2.1 傳入?yún)?shù)為數(shù)字
傳入?yún)?shù)為數(shù)字表示最低匹配的個(gè)數(shù)。也可以傳入負(fù)數(shù)晰韵。
例如:
GET test_match/_search
{
"query": {
"match": {
"name": {
"query": "php,java,jsp",
"minimum_should_match": "-1"
}
}
}
}
上面的意思表示:3個(gè)條件最低滿足2個(gè)(最多不匹配的個(gè)數(shù)為一個(gè))
2.2 傳入的參數(shù)為百分比
傳入正的百分比時(shí):如圖2.2-1
3個(gè)參數(shù)发乔,當(dāng)最少匹配一個(gè)百分比34%,最少匹配2個(gè)百分比67%雪猪。
由于我們傳入的參數(shù)為50%栏尚,那么轉(zhuǎn)換成最少匹配一個(gè)。
傳入負(fù)的百分比時(shí):如圖2.2-2
負(fù)數(shù)表示最多不匹配的百分比50%只恨,向下取整為最多不匹配的個(gè)數(shù)為1個(gè)译仗。即最少匹配個(gè)數(shù)為2個(gè)。
2.3 組合方式
一個(gè)有條件的規(guī)范是一個(gè)正整數(shù)官觅,后跟小于號纵菌,后跟任何前面提到的說明符。它表示如果可選子句的數(shù)量等于(或小于)整數(shù)休涤,則全部都是必需的咱圆,但如果可選子句的數(shù)量大于整數(shù)笛辟,則適用規(guī)范。
2.4 多種組合條件
多個(gè)條件規(guī)范可以用空格分隔序苏,每個(gè)條件規(guī)范僅對大于其前一個(gè)的數(shù)字有效手幢。在此示例中:如果有1個(gè)或2個(gè)子句,則都需要忱详,如果有3-9個(gè)子句围来,則需要除25%之外的所有子句;如果有9個(gè)以上的子句匈睁,則需要除3個(gè)之外的所有子句监透。