1.複合查詢java
複合查詢可以組合其餘複合查詢或者查詢子句,同時也能夠組合各個查詢的查詢結果及得分,也能夠從Query查詢轉換爲Filter過濾器查詢。數組
首先介紹一下Query Context和 Filter Context緩存
1)Query Context查詢主要關注的是文檔和查詢條件的匹配度,Query查詢會計算文檔和查詢條件的相關度評分。app
2)Filter Context過濾器主要關注文檔是否匹配查詢條件,並不關係文檔和查詢條件的匹配程度,也不會計算文檔的相關度評分。過濾器查詢速度比普通查詢快,常用的過濾器將被ES自動緩存。dom
GET /kibana_sample_data_ecommerce/_search { "query": { //query context "bool": { "must": [ { "match": { "customer_first_name": "Eddie"}}, { "match": { "customer_gender": "MALE" }} ], "filter": [ // filter context { "term": { "currency": "EUR" }}, { "range": { "order_id": { "gte": "584679" }}} ] } } }
1.1.Boolean Query函數
Bool查詢由一個或多個bool查詢子句組成,容許組合任意數量的查詢子句,bool查詢共有4鍾查詢類型。測試
1)mustui
若是查詢子句爲must,那麼must子句中的全部查詢條件都必須在匹配文檔中出現。spa
2)must_notcode
查詢條件中的任何一部分不能在文檔中出現。
3)should
查詢條件能夠在匹配文檔中出現也能夠不出現,可是出現的數量至少要達到minimum_should_match參數所設置的數量,若是組合中使用了must子句,該值默認爲0,若是沒有使用該值默認爲1.
4)filter
查詢條件必須出如今匹配的文檔中,可是該查詢子句對於文檔的評分沒有影響,僅對文檔進行過濾。
http://127.0.0.1:9200/kibana_sample_data_ecommerce/_search
{ "query": { "bool" : { "must" : [ { "term" : { "day_of_week": "Monday" } }, { "term" : {"customer_gender": "FEMALE"} } ] } } }
1.2Boosting Query
Boosting Query返回和positive查詢條件匹配的文檔,減小與negative查詢條件匹配的文檔的分數。注意,只有匹配了positive查詢條件的文檔纔會被返回,negative只是下降同時匹配positive條件和negative查詢條件的文檔的相關性評分。negative_boost爲介於0和1.0之間的浮點數,用於下降與negative查詢條件匹配的文檔相關性評分。
GET /kibana_sample_data_ecommerce/_search { "query": { "boosting" : { "positive" : { "match": { "customer_first_name" : "Eddie" } }, "negative" : { "match" : { "customer_last_name" : "Underwood" } }, "negative_boost" : 0.5 } } }
1.3Constant Score Query
包裝filter查詢,返回全部匹配的文檔,可是文檔的相關度評分等於查詢傳入的boost值,默認值爲1.0。
GET /kibana_sample_data_ecommerce/_search { "query": { "constant_score" : { "filter" : { "match" : { "customer_first_name" : "Eddie"} }, "boost" : 1.2 } } }
1.4Disjunction Max Query
將與任何一個查詢條件匹配的文檔做爲結果返回,可是採用單個字段上最匹配的評分做爲最終評分返回。
首先看一個不使用dis_max查詢多查詢字段匹配的例子,
GET /test/_search { "query": { "bool": { "should": [ { "match": { "title": "Brown fox" }}, { "match": { "body": "Brown fox" }} ] } } }
返回:能夠看到文檔2的body字段更加匹配查詢條件"body": "Brown fox",可是因爲文檔1的title字段和body字段都有"brown"因此其評分疊加起來比文檔2的評分更高。
{ "hits" : { "max_score" : 0.90425634, "hits" : [ { "_index" : "test", "_type" : "_doc", "_id" : "1", "_score" : 0.90425634, "_source" : { "title" : "Quick brown rabbits", "body" : "Brown rabbits are commonly seen." } }, { "_index" : "test", "_type" : "_doc", "_id" : "2", "_score" : 0.77041256, "_source" : { "title" : "Keeping pets healthy", "body" : "My quick brown fox eats rabbits on a regular basis." } } ] } }
dis_max不會將查詢條件各個字段評分作簡單的相加,而是將與查詢條件匹配得分最高的單個字段的評分做爲文檔的評分返回。以下例:
GET /test/_search { "query": { "dis_max": { "queries": [ { "match": { "title": "Brown fox" }}, { "match": { "body": "Brown fox" }} ] } } }
返回:能夠看到使用dis_max後文檔1的評分下降了。
{
"hits" : { "max_score" : 0.77041256, "hits" : [ { "_index" : "test", "_type" : "_doc", "_id" : "2", "_score" : 0.77041256, "_source" : { "title" : "Keeping pets healthy", "body" : "My quick brown fox eats rabbits on a regular basis." } }, { "_index" : "test", "_type" : "_doc", "_id" : "1", "_score" : 0.6931471, "_source" : { "title" : "Quick brown rabbits", "body" : "Brown rabbits are commonly seen." } } ] } }
dis_max查詢的tie_breaker參數,若是在查詢的時候根據查詢場景須要考慮到其餘查詢字段的得分,則可使用tie_breaker參數[0.0,1.0],使用tie_beaker以後,計算得分的過程將變爲:
1.取到與查詢條件最匹配的單個字段的評分,2.將與其餘查詢條件匹配的得分乘以tie_beaker,3.將1中最高分和2中的得分相加做爲文檔的評分返回。
1.5Function Score Query
function score query能夠在查詢結束後,對每個匹配的文檔從新算分,根據新生成的分數進行排序。
GET /_search { "query": { "function_score": { "query": { "match_all": {} }, "boost": "5", "functions": [ { "filter": { "match": { "test": "bar" } }, "random_score": {}, "weight": 23 }, { "filter": { "match": { "test": "cat" } }, "weight": 42 } ], "max_boost": 42, "score_mode": "max", "boost_mode": "multiply", "min_score" : 42 } } }
score_mode:每個文檔將會被定義的函數打分,當有多個函數時由score_mode決定如何去組合各個函數的打分,score_mode的幾個方法:multiply,各個得分相乘;sum,分數相加;avg,分數取平均;first,用第一個有match filter的函數的評分;max,選取分數的最大值;min,選取分數的最小值。
weight:由於各個函數的打分範圍不一樣,例如衰減函數打分範圍爲[0,1],而field_value_factor的打分值是任意的,並且有時候但願不一樣的函數對文檔的分數有不一樣的影響,用戶可使用weight權重來調整各個函數的得分,在每一個function中定義weight的數值,函數計算出文檔的得分後將會和其定義的weight值。
max_score:用於限制得分,function算出的新得分會被限制在max_boost內,默認爲FLT_MAX。
boost_mode:決定function算出的分和query的得分如何組合:multiply,function和query得分相乘;replace,使用function的得分替換query的得分;sum,二者得分相加;avg,取二者均值;max,取二者較大值;min,取二者較小值。
min_score:用於排除分值低於閾值的文檔。
function score支持的幾種改變分值的函數:
1)script_score:包裝一個子查詢,經過自定義腳本的方式徹底自定義計算文檔的得分。
2)Weight:爲每一個文檔設置一個權重,將文檔的得分乘以該權重,該參數和boost相似,boost對文檔得分的提高不是線性的,文檔得分在乘以boost值後會被歸一化(nomalize)處理,因此當不想將得分歸一化處理時便可使用Weight來提高文檔的得分。
3)random_score:隨機均勻的產生在[0,1)之間的得分,能夠爲該函數提供種子(seed)和計算得分的字段(filed),這樣來保證分數的可複製性。最後的得分將基於seed、filed以及salt(salt由索引名和分片id計算得來),因此有相同的值可是存儲在不一樣索引中的文檔會有不一樣的評分。可是在同一個分片中並具備相同字段值的文檔將得到相同的分數,所以一般須要使用具備惟一值的字段來進行評分。
4)field_value_factor:可使用文檔中的字段來影響文檔的得分
參數:field,用來計算得分的字段;factor,得分的乘數;modifier,得分的計算公式,能夠爲none(默認值)
, log
, log1p
, log2p
, ln
, ln1p
, ln2p
, square
, sqrt
, reciprocal;missing,若是指定的filed字段文檔中沒有,默認使用的值。以下計算公式爲:
sqrt(1.2 * doc['likes'].value)
"query": { "function_score": { "field_value_factor": { "field": "likes", "factor": 1.2, "modifier": "sqrt", "missing": 1 } } }
5)Decay functions:衰減函數,用戶指定一個文檔中的字段的值,衰減函數根據距離這個值的距離來進行打分;查詢時須要爲每一個字段定義origin值和scale值,
origin表明的是中心點,用以計算其餘值到中心點的距離;
scale表明衰減的範圍,衰減的範圍爲[origin-offset-scale,origin-offset],[origin+offset,origin+offset+scale]
此外有兩個可選值:offset、decay
offset表示衰減函數只計算到中心點距離大於offset的文檔,即衰減函數計算的範圍是[origin-offset-scale,origin-offset],[origin+offset,origin+offset+scale];
decay表示衰減到兩個邊界上時origin-offset-scale,origin+offset+scale文檔的得分,默認爲0.5分。如圖:
舉例說明各參數的做用:假設衰減函數的origin定義爲100,scale定義爲10,offset定義爲10,decay爲0.5,那麼衰減函數只會計算文檔[80,90],[110,120],即介於90與110之間的文檔評分與origin得分同樣,在[80,90],[110,120]之間文檔得分將會進行衰減,在80,120邊界上的文檔得分是
decay:0.5。
以下例所示:DECAY_FUNCTION能夠是
linear(線性)、
exp(指數)、
gauss(高斯)這三種衰減函數,FILED_NAME即用來評分的字段必須爲數值型、日期型或地理位置型。
"DECAY_FUNCTION": { "FIELD_NAME": { "origin": "11, 12", "scale": "2km", "offset": "0km", "decay": 0.33 } }
日期型衰減函數:
"function_score": { "gauss": { "date": { "origin": "2013-09-17", "scale": "10d", "offset": "5d", "decay" : 0.5 } } }
若是用於計算衰減的字段包含多個值,在默認狀況下,將選擇最接近原點的值來肯定距離,能夠經過設置multi_value_mode來改變這個方法:min:衰減距離使用多個字段距離中的最小值,max:衰減距離使用多個字段距離中的最大值,avg:衰減距離使用多個字段距離的平均值,sum衰減距離使用多個字段距離的和。
2.全文檢索
全文檢索使用戶可以搜索分析過的文本,查詢的關鍵字也會被文檔索引時使用的分析器進行處理。
2.1Intervals Query
容許對匹配詞項的順序和鄰近性進行細粒度控制。用戶能夠應用一個或多個規則集合在指定的字段上進行操做。
POST _search { "query": { "intervals" : { "my_text" : { "all_of" : { "ordered" : true, "intervals" : [ { "match" : { "query" : "my favorite food", "max_gaps" : 0, "ordered" : true } }, { "any_of" : { "intervals" : [ { "match" : { "query" : "hot water" } }, { "match" : { "query" : "cold porridge" } } ] } } ] } } } } }
interval查詢頂層參數:
Field,用戶但願查詢的字段,上例爲my_text。Field的參數爲一個基於詞項匹配度、順序、接近度規則的對象用於匹配文檔,上例爲{"all_of":"...."}。
有以下一些規則:
1)match:match規則匹配分析後的文本。參數:
query:但願在Field字段中匹配的內容。
max_gaps:匹配的詞項之間間隔的最大詞數,超過max_gaps的被視爲不匹配,默認爲-1,若是沒有設定,則對詞項之間的間隔沒有限制;若是設置爲0,那麼匹配的詞項之間必須僅僅相鄰。
ordered:若是爲true,那麼匹配的詞項出現的順序必須和查詢內容的順序一致,默認爲false。
analyzer:用於分析查詢內容的分析器,默認和文檔的分析器一致。
filter:intervals filter。
use_field:若是指定該字段,那麼此規則將應用於該字段而不是頂層Field字段。
POST /test/_search { "query": { "intervals" : { "body" : { "match" : { "query" : "quick rabbits", "max_gaps" : 10 } } } } }
2)prefix:前綴規則匹配以指定字符集開頭的詞項,prefix最多能夠擴展到匹配128個字符,若是超過128個字符,ES將返回錯誤。參數:
prefix:但願頂層Field開頭的字符。
analyzer:用以處理prefix的分析器。
use_field:若是指定該字段,那麼此規則將應用於該字段而不是頂層Field字段。
POST /test/_search { "query": { "intervals" : { "body" : { "prefix" : { "prefix" : "Keeping", "use_field":"title" } } } } }
3)wildcard:wildcard使用通配符模式,最多能匹配128個詞項。參數:
pattern:通配符,支持*、?兩種通配符。
analyzer:同上。
use_field:同上。
POST /test/_search { "query": { "intervals" : { "body" : { "wildcard" : { "pattern" : "rab?i*" } } } } }
4)fuzzy:模糊規則匹配與提供的term類似的詞項。參數:
term:須要匹配的詞項。
prefix_length:保持不變的前綴的數量。
transpositions:模糊規則是否包含兩個相鄰字符的轉換,默認爲true。
fuzziness:一般被解釋爲萊文斯坦距離也叫作Edit Distance,指的是一個詞與另外一個詞匹配須要編輯的次數,編輯操做替換字符,插入字符,刪除字符,須要編輯的次數越多,說明Edit Distance越大。fuzziness的參數:0,1,2表示最大的編輯次數,默認爲AUTO參數,表示根據term的長度自動生成編輯次數。
analyzer:同上。
use_field:同上。
POST /test/_search { "query": { "intervals" : { "body" : { "fuzzy" : { "term" : "rabibst",//須要移動兩次 "fuzziness":2 //兩次edit } } } } }
5)all_of:綜合其餘的interval規則,返回的文檔必須知足全部的intervals規則。參數:
intervals:要組合的規則數組。
max_gaps:
ordered:決定各個規則產生的結果是否排序。
filter:intervals filter。
POST /test/_search { "query": { "intervals" : { "body" : { "all_of" : { "intervals" : [//match、prefix規則均需知足 { "match" : { "query" : "quick" } }, { "prefix" : { "prefix":"My" } } ] } } } } }
6)any_of:知足任一子規則的文檔便可返回。
intervals:匹配的規則數組。
filter:intervals filter。
POST /test/_search { "query": { "intervals" : { "body" : { "any_of" : { "intervals" : [ //match、prefix規則知足其一便可 { "match" : { "query" : "commonly" } }, { "prefix" : { "prefix":"My" } } ] } } } } }
intervals filter參數:
after:匹配的詞項在filter rule後。
before:匹配的詞項在filter rule前。
contained_by:匹配的詞項由filter rule包含。
not_contained_by:匹配的詞項不被filter rule包含。
not_containing:fiter rule不在匹配間隙之間出現。
not_overlapping:匹配的詞項和filter rule不重疊。
overlapping:匹配的詞項和filter rule有重疊。
script:決定文檔是否返回的自定義腳本。
POST /test/_search { "query": { "intervals" : { "body" : { "match" : { "query" : "commonly", "filter":{ "contained_by" : { "match" : { "query" : "Brown seen" //brown seen 必須包含commonly詞項 } } } } } } } }
POST /test/_search { "query": { "intervals" : { "body" : { "match" : { "query" : "brown rabbits", "max_gaps" : 10, "filter":{ "not_containing" : { "match" : { "query" : "fox" //fox 不能出如今brown rabbits 之間 } } } } } } } }
POST /test/_search { "query": { "intervals" : { "body" : { "match" : { "query" : "commonly", "filter":{ "overlapping" : { "match" : { "query" : "Brown seen" //match規則查出的結果文檔爲Brown rabbits are commonly seen 與commonly 有重疊的地方 } } } } } } } }
2.2Match Query
返回與提供的搜索文本相匹配的文檔,搜索文本在匹配以前會被分析器進行分析。
參數:
頂層參數:Filed,表示想要搜索的字段。
Field下的參數:
1.query:想要在Field字段中匹配到的內容,match查詢在查詢以前會對查詢內容進行分析。
2.analyzer:分析器,若是field的mapping中有定義分析器,則使用field的分析器,若是沒有,則使用索引默認的分析器。
3.auto_generate_synonyms_phrase_query:是否開啓同義詞匹配,默認爲false。
4.fuzziness:模糊匹配,參數見interval query fuzzy。
5.max_expansions:控制模糊匹配fuzzy能擴展多少個模糊選項。如test在fuzziness爲1的時候,能匹配不少模糊選項:tes,tets,etst等,使用max_expansions控制能匹配多少個模糊選項。
6.prefix_length:fuzzy匹配時,保持不變的字符前綴數,默認爲0。
7.transpositions:若是true,那麼fuzzy匹配容許字符交換位置,ab->ba。
8.fuzzy_rewrite:重寫查詢的方法,
9.lenient:若是true,則忽略查詢格式錯誤,例如爲數值字段提供文本查詢值。默認爲false。
10.operator:用於解析查詢值的bool邏輯。默認爲OR,若是Query值爲quick brown fox,則匹配規則爲quick or brown or fox;此外還有AND值。
11.minimum_should_match:返回的文檔必須匹配的子句數量。
12.zero_terms_query:決定當分析器移除全部的分詞時是否返回文檔,如當查詢內容中都是停用詞時,全部的分詞被分析器的停用詞過濾器過濾掉時,是否返回文檔。默認爲none,不返回任何文檔,all,返回全部文檔。
測試數據: POST /test/_doc/3 { "title": "tets healthy", "body": "My quick brown fox eats rabbits on a regular basis." } POST /test/_doc/4 { "title": "tes healthy", "body": "My quick brown fox eats rabbits on a regular basis." }
測試案例:
POST /test/_search { "query": { "match" : { "title":{ "query":"test", "fuzziness":1, "max_expansions": 1 //最大擴展數,test只容許有一個模糊選項,匹配的結果只有一個 } } } }
2.3Match boolean prefix query
match_bool_prefix分析查詢內容,並將分詞出來的各個詞項組合成爲一個bool查詢,除了最後一個詞項其餘的詞項都會被用在term query中,最後一個詞項被用在prefix query中。
例如:
POST /test/_search { "query": { "match_bool_prefix" : { "message" : "quick brown f" } } }
這個查詢相似於:
POST /test/_search { "query": { "bool" : { "should": [ { "term": { "message": "quick" }}, { "term": { "message": "brown" }}, { "prefix": { "message": "f"}} ] } } }
參數:
頂層參數:Filed,表示想要搜索的字段。
1.query:想要在Field字段中匹配到的內容。
2.analyzer:分析器,默認使用字段mapping中的分析器。
3.minimum_should_match:返回的文檔最少匹配查詢條件的程度。
4.operator:使用AND仍是OR去鏈接詞項。
5.模糊查詢能夠用於全部的分詞起器分析出的詞項,除了最後一個詞項。
POST /test/_search { "query": { "match_bool_prefix" : { "body": { "query": "fox eats", "operator":"AND", "fuzziness":1 } } } }
2.4Match phrase query
match_phrase查詢分析搜索內容並建立一個短語查詢。
match_phrase的詞項之間的間隔爲0,analyzer使用查詢字段mapping字段定義,若是未定義則使用默認查詢分析器。
GET /test/_search { "query": { "match_phrase" : { "body": { "query": "quick brown fox",
"analyzer":"whitespace" } } } }
2.5Match phrase prefix query
返回包含搜索內容的文檔,與搜索內容提供的順序一致。搜索內容的最後一個詞項做爲前綴匹配任何之前綴開始的詞項。
參數:
頂層參數:Filed,表示想要搜索的字段。
query:想要搜索的文本。
analyzer:分析器。
max_expansions:最後一個查詢詞做爲前綴去匹配到的詞項最多擴展數。
slop:分詞之間的最大間隔數,默認爲0。
zero_terms_query:見Match Query。
GET /test/_search { "query": { "match_phrase_prefix" : { "body" : { "query" : "quick brown f", "max_expansions": 2 //爲2表明以f開頭的詞項只會返回兩種 } } } }
2.6Multi match query
multi match query以match query爲基礎,構建多字段的match查詢。
參數:
1.query:查詢文本。
2.fields:查詢字段,支持多個字段,最多查詢字段數由indices.query.bool.max_clause_count定義,默認爲1024個。
3.type:查詢的類型。
best_fields:查找匹配任意field的文檔,可是文檔的得分來自最匹配的那個字段。
most_fields:組合全部字段的得分,做爲文檔的評分。
cross_fields:將多個字段組合成一個字段,在組合成的字段裏去查詢。
phrase:每一個字段以match_phrase方式查詢,使用最匹配字段的得分做爲文檔的評分。
phrase_prefix:每一個字段以match_phrase_prefix方式查詢,,使用最匹配字段的得分做爲文檔的評分。
bool_prefix:每一個字段以match_bool_prefix方式查詢,組合全部字段的得分做爲文檔的評分。
4.tie_breaker:當使用tie_breaker時,best_field會根據tie_breaker定義的值的大小,決定除最佳匹配字段得分之外其餘字段的得分。爲tie_breaker * (其餘字段_score)之和。
5.其餘參數:analyzer, boost, operator, minimum_should_match, fuzziness, lenient, prefix_length, max_expansions, rewrite, zero_terms_query, cutoff_frequency, auto_generate_synonyms_phrase_query and fuzzy_transpositions。
GET /test/_search { "explain": true, "query": { "multi_match" : { "query": "brown fox", "type": "best_fields", "fields": [ "title", "body" ] } } }
GET /_search { "query": { "multi_match" : { "query": "Will Smith", "type": "cross_fields", "fields": [ "first_name", "last_name" ], "operator": "and" } } }
這個查詢相似與:
(+first_name:will +first_name:smith) | (+last_name:will +last_name:smith)
全部的搜索詞項都必須在單獨的字段(也能夠是多個字段組合成的單個字段,如first_name+last_name)中出現。
2.6Common Terms Query
使用語法基於操做符如:AND OR來解析和分割查詢字符串,而後用分析器對分割的部分就行分析,並與文檔進行匹配。
參數:
1.query:查詢字符串。
2.default_field:當query_string沒有指定查詢字段時候,默認查詢的字段。默認值爲索引設定的index.query.default_field值,
index.query.default_field默認值爲*。
3.allow_leading_wildcard:true的時候,通配符*,?能夠被做爲查詢字符串的首個字符。默認爲true。
4.analyze_wildcard:true的時候,查詢會分析查詢字符串中的通配符。
5.analyzer:用於分析查詢字符串的分析器,默認爲文檔索引時候的分析器。
6.auto_generate_synonyms_phrase_query:true的時候,自動建立多同義詞查詢。
7.boost:浮點數用於增長或減小查詢的相關度評分。
8.default_operator:若是沒有定義operator,默認被用做解析查詢字符串的操做符。OR(默認)
9.enable_position_increments:
10.fields:但願查詢的字段的集合。
11.模糊匹配相關:fuzziness,fuzzy_max_expansions模糊匹配最大擴展數,fuzzy_prefix_length模糊匹配前綴數,fuzzy_transpositions,lenient。
12.max_determinized_states:肯定一個查詢須要的最大的自動機的數量。解釋:https://www.jianshu.com/p/9edca9474663?utm_source=desktop&utm_medium=timeline
13.minimum_should_match:返回的文檔最少匹配查詢條件的程度。
14.quote_analyzer:用於分析在引號中的查詢文本。
15.phrase_slop:匹配的兩個分詞之間間隔的最大詞項數。
16.quote_field_suffix:附加到引號查詢文本的後綴。
17.rewrite:用於重寫查詢的方法。
18.time_zone:時區,用於轉換日期參數。
2.7Simple Query String
返回匹配查詢字符串的文檔,使用有限制的可是容錯的語法去解析查詢字符串。該查詢使用簡單的語法基於操做符去解析和分割查詢字符串,在查詢以前分別分析各個詞項。由於對語法有更多的限制,索引當有不合規的語法時不會返回錯誤,忽略查詢字符串中不合法的部分。
參數:
1.Query:搜索內容。
2.Fields:搜索的字段集合。
3.default_operator:若是沒有定義operator,默認被用做解析查詢字符串的操做符。OR(默認)
4.analyze_wildcard:true的時候,查詢會分析查詢字符串中的通配符。
5.analyzer:用於分析查詢字符串的分析器,默認爲文檔索引時候的分析器。
6.auto_generate_synonyms_phrase_query:true的時候,自動建立多同義詞查詢。
7.flags:查詢操做可使用的操做符列表。合法操做符:AND、ESCAPE、FUZZY、NEAR、NONE、NOT、OR、PHRASE、PRECEDENCE、PREFIX、SLOP、WHITESPACE。
8.其餘參數:fuzzy_max_expansions、fuzzy_prefix_length、fuzzy_transpositions、lenient、minimum_should_match、quote_field_suffix。