Elasticsearch 6.x版本全文檢索學習之Search API。
1)、Search API,實現對es中存儲的數據進行查詢分析,endpoind為_search,如下所示。
方式一、GET /_search,對es中所有的數據進行查詢。
方式二、GET /my_index/_search,針對單個索引的數據進行查詢。
方式三、GET /my_index1,my_index2/_search,針對兩個索引的數據進行查詢。
方式四、GET /my_*/_search,指定索引查詢,可以一次查詢多個。
2)、查詢的主要有兩種形式。
形式一、URI Search。a、優點,操作簡便,方便通過命令行測試。b、缺點,僅包含部分查詢語法。案例如下:
GET /test_search_index/_search?q=username:al*
形式二、Request Body Search。a、es提供完備的查詢語法Query DSL語法(Domain Specific Language)。案例如下:
GET /test_search_index/_search { "query": { "term": { "username": { "value": "alfred" } } } }
1、URI Search。通過url query參數來實現搜素,常用參數如下。
1)、q指定查詢的語句,語法為Query String Syntas。q是關鍵字,后面跟的是查詢的內容。
term與phrase詞語。語法一、alfred way這種term查詢等效於alfred OR way。語法二、"alfred way"這種phrase詞語查詢,要求先后順序。
泛查詢。alfred等效於在所有字段去匹配該term。
指定字段。name:alfred。
2)、df q中不指定字段時候默認查詢的字段,如果不指定,es會查詢所有字段。
3)、sort排序。
4)、timeout指定超時時間,默認不超時。
5)、from,size用於分頁。
6)、Group分組設定,使用括號指定匹配的規則。括號的概念,是將值做一個分組,OR和AND是布爾操作符。括號制定了匹配的優先級。
(quick OR brown) AND fox。這個方式的意思是值先判斷前面括號內的,再判斷后面的。status:(active OR pending)。括號的另一個概念,就是將關鍵字作為一個整體,返回status是active或者pending的所有文檔。
status:active OR pending。如果不加括號的意思是,status的值是active的,或者所有文檔有pending值的文檔。
title:(full text search)。類比上面即可。
7)、GET /test_search_index/_search?q=alfred&df=username&sort=age:asc&from=1&size=10&timeout=1s
解釋:查詢username字段包含alfred的文檔,結果按照age升序排列,返回第1~3個文檔,如果超過1s沒有結束,則以超時結束。
泛查詢的使用如下所示:
根據指定字段進行查詢、term與phrase詞語、Group分組設定。
2、布爾操作符。
a、AND(&&)、OR(||)、NOT(!)。操作符必須,注意大寫,不能小寫。
舉例:name:(tom NOT lee)。name里面不要有lee的,但是可以包含tom的。b、+、-分別對應must和must_not。+在url中會被解析為空格,要使用encode后的結果才可以,為%2B。
舉例:name:(tom +lee -alfred)。返回,一定包含lee,一定不包含alfred,可以包含tom的文檔。
name:((lee && !alfred) || (tom && lee && !alfred))。和上面一樣效果的。
3、范圍查詢,支持數值和日期。
a、區分寫法,閉區間用[],開區間用{}。
舉例如下所示。
age:[1 TO 10],意為1<=age<=10。
age:[1 TO 10},意為1<=age<10。
age:[1 TO * ],意為age>=1。
age:[* TO 10],意為age<=10。
b、算數符合寫法。
舉例如下所示。
age:>1
age:(>=1&&<=10)或者age:(+>=1 +<=10)。
4、通配符查詢。
a、?代表1個字符,*代表0或者多個字符。
舉例如下所示。
name:t?m。
name:tom*。
name:t*m。
b、通配符匹配執行效率低,且占用較多內存,不建議使用,如果無特殊需求,不要將?/*放在最前面。c、正則表達式匹配。
舉例如下所示。
name:/[mb]oat/。返回所有包含moat的文檔或者包含boat的文檔。
5、模糊匹配fuzzy query、近似度查詢proximity search。
a、模糊匹配fuzzy query。
舉例如下所示。
name:roam~1。
匹配與roam差1個character的詞,比如foam、roams等等。
b、近似度查詢proximity search。
舉例如下所示。
"fox quick"~5。
以term為單位進行差異比較,比如"quick fox"、"quick brown fox"都會被匹配。
6、Request Body Search,將查詢語句通過http request body發送到es,主要包含如下參數。query符合Query DSL語法的查詢語句。包含query、from、size、timeout、sort等等關鍵查詢參數。
1)、基於JSON定義的查詢語句,主要包含如下兩種類型。
a、字段類查詢,如term(針對詞的查詢)、match(針對全文檢索的查詢)、range(針對范圍的查詢)等等,只針對某一個字段進行查詢。
b、復合查詢,如bool查詢(符合查詢關鍵字)等等,包含一個或者多個字段類查詢或者復合查詢語句。2)、字段類查詢主要包含以下兩類。
a、全文匹配,針對text類型的字段進行全文檢索,會對查詢語句先進行分詞處理,然后拿着分詞結果去es中存倒排索引的term匹配,如match、match_phrase(詞語查詢)等等query類型。
b、單詞匹配,不會對查詢語句做分詞處理,直接拿着查詢語句的內容去匹配字段的倒排索引,如term、terms、range等等類型。
3)、Query DSL復合查詢,復合查詢是指包含字段類查詢或者復合查詢的類型,主要包括以下幾類。方式一、constant_score query。
該查詢將其內部的查詢結果文檔得分都設定為1或者boost的值。多用於結合bool查詢實現自定義得分。
方式二、bool query。
布爾查詢由一個或者多個布爾子句組成,主要包含如下4個。
a、filter只過濾符合條件的文檔,不計算相關性得分。
b、must文檔必須符合must中的所有條件,會影響相關性得分。
c、must_not文檔必須不符合must_not中的所有條件。
d、should文檔可以符合should中的條件,會影響相關性得分。
方式三、dis_max query。
方式四、function_score query。
方式五、boosting query。
Match Phrase Query(詞語類查詢,與Match Query的區別就是待查詢的語句分詞以后,es去匹配的時候,對分詞后的term即詞語有順序要求的),對字段作檢索,有順序要求,API示例如下所示:
Query String Query,類似於URI Search中的q參數查詢。
Simple Query String Query,類似Query String,但是會忽略錯誤的查詢語法,並且僅支持部分查詢語法。其常用的邏輯符號,不能使用AND、OR、NOT等關鍵詞。可以使用+代指AND、|代指OR、-代指NOT。
Term Query,Terms Query,將查詢語句作為整個單詞進行查詢,即不對查詢語句做分詞處理。
Range Query,范圍查詢主要針對數值和日期類型。
針對日期提供的一種更友好的計算方式。
a、now - 1d。基准日期,也可以是具體的日期,比如2019-01-01,使用具體日期的時候要用||做隔離。
計算公式,主要有如下3種方式。+1h是加1個小時。-1d是減1天。/d是將時間舍入到天。
b、單位主要有如下幾種。
y是years,M是months,w是weeks,d是days,h是hours,m是minues,s是seconds。
7、Query DSL復合查詢,復合查詢是指包含字段類查詢或者復合查詢的類型,主要包括以下幾類。
1)、constant_score query。
該查詢將其內部的查詢結果文檔得分都設定為1或者boost的值。多用於結合bool查詢實現自定義得分。
2)、bool query。
布爾查詢由一個或者多個布爾子句組成,主要包含如下4個。
a、filter只過濾符合條件的文檔,不計算相關性得分。
b、must文檔必須符合must中的所有條件,會影響相關性得分。
c、must_not文檔必須不符合must_not中的所有條件。
d、should文檔可以符合should中的條件,會影響相關性得分。
3)、dis_max query。
4)、function_score query。
5)、boosting query。
constant_score query。該查詢將其內部的查詢結果文檔得分都設定為1或者boost的值。多用於結合bool查詢實現自定義得分。
bool query。布爾查詢由一個或者多個布爾子句組成,主要包含如下4個。
filter、must、must_not、should,支持數組的,可以傳條件進去,match query,term query,terms query,score query等等查詢方式。
must_not,關鍵詞,查詢job中包含java關鍵詞,但不包含ruby關鍵詞的文檔列表。
should,關鍵詞,should使用分兩種情況。
a、bool查詢中只包含should,不包含must查詢。只包含should時,文檔必須滿足至少一個條件。
minimum_should_match可以控制滿足條件的個數或者百分比。
b、bool查詢中同時包含should和must的查詢。
同時包含should和must的時候,文檔不必滿足should中的條件,但是如果滿足條件,會增加相關性得分。
bool查詢中同時包含should和must的查詢,同時包含should和must的時候,文檔不必滿足should中的條件,但是如果滿足條件,會增加相關性得分。
Query Context和Filter Context的區別。當一個查詢語句位於Query或者Filter上下文時,es執行的結果會不同。
must下的query上下文,會進行相關性算分。需要做相關性算分、需要做全文檢索的的可以放到query里面。
filter下的filter上下文,不會影響算分,只會過濾符合條件的文檔。不需要做相關性算分的可以放到filter里面,
8、count api,獲取符合條件的文檔數,endpoint為_count。Source Filter過濾返回結果中_source中的字段,可以減少網絡IO,主要有如下幾種方式。
作者:別先生
博客園:https://www.cnblogs.com/biehongli/
如果您想及時得到個人撰寫文章以及著作的消息推送,可以掃描上方二維碼,關注個人公眾號哦。