1、ElasticSearch搜索介紹正則表達式
一、ElasticSearch搜索方式主要分爲如下兩種:less
1)、URI Search:此種查詢主要是使用Http的Get方法,在URL中使用查詢參數進行查詢;post
如:http://localhost:9200/kibana_sample_data_ecommerce/_search?q=customer_first_name:Jim學習
這條URL中,q表示查詢的內容,用來搜索名叫Jim的客戶。用Postman進行查詢,搜索結果以下圖所示:搜索引擎
2)、Request Body Search(DSL查詢):此種查詢是使用ElasticSearch提供的,能夠採用Get或Post的方法,基於JSON格式的更加完備的DSL(Query Domain Specific Language);spa
如:http://localhost:9200/kibana_sample_data_ecommerce/_search 3d
在請求體中寫入: code
{
"query":{"match_all":{}}
}
其中match_all表明返回全部的文檔。 blog
或一樣查詢customer_first_name:Jim,以下: 排序
{
"profile": true,
"query": {
"match": {"customer_first_name":"Jim"}
}
}
用Postman進行查詢,結果以下圖所示:
took表示查詢用時;hits表示查到了多少結果,ElasticSearch默認列出10條;_score表示相關度評分;_source表示文檔原始信息;
因此,大致上可根據如下語法進行查詢:
/_search
查詢範圍:集羣上全部的索引;
/index-name1/_search
查詢範圍:只查詢index-name1索引;
/index-name1,index-name2/_search
查詢範圍:查詢index-name1,index-name2兩個索引;
/index*/_search
查詢範圍:查詢以index開頭的索引;
二、搜索相關性
搜索是用戶與搜索引擎的對話,比較關注的有以下幾點:
1)是否能夠找到全部相關的內容;
2)有多少不相關的內容被返回了;
3)文檔的打分是否合理;
4)結合業務需求,平衡結果排名;
三、搜索結果的衡量
1)Precision-查準率:儘量返回較少的無關文檔,公式爲:返回的相關結果/(返回的相關結果+返回的無關結果)
2)Recall-查全率:儘可能返回較多的相關文檔,公式爲:返回的相關結果/(返回的相關結果+應該返回但沒有返回結果)
3)Ranking-排名:是否可以按照相關度進行排序;
2、ElasticSearch URI搜索操做
經過URI Query實現搜索,語法以下:
Get /movies/_search?q=2012&df=title_name&sort=year:desc&from=0&size=10&timeout=1s
{
"profile":true
}
q:指定的查詢語句,使用Query String 語法;
df:默認字段,若不指定,會對全部字段進行查詢;
sort:用於排序;
from、size:用於分頁;
profile:用於展現查詢是如何被執行的;
一、指定字段查詢、泛查詢
指定字段查詢:就是查詢的值是在某個字段範圍內進行的查詢。對movies索引中的title字段作2012信息的查詢,查詢結果以下圖所示:
泛查詢:就是查詢的值是對索引中全部字段進行匹配,以下圖所示:
二、Term【詞語】查詢與Phrase【短語】查詢
二者區別在於,若要查詢一條信息,如Iron Man
對於Term查詢,Iron Man等效於Iron OR Man;
對於Phrase查詢,「Iron Man"等效於Iron AND Man,並且要求先後順序要保持一致;
注意:對於Term查詢,須要加上括號才能夠;對於Phrase查詢,須要加上引號才能夠;
以下圖所示:
三、布爾查詢
布爾表示符:AND/OR/NOT(+、-),注意:符號必須大寫。具體操做以下圖所示:
在AND查詢中,咱們會發現查詢出8條結果,與Phrase查詢結果並不相同。緣由在於:Phrase查詢要求查詢信息先後順序必須是一致的,而AND查詢並無這個要求,所以多出兩條查詢數據。
在OR查詢中,咱們會發現與Term查詢結果是相同的,包括profile中所列出的description都是同樣的。不相同的是查詢類型,Term查詢是TermQuery,Or查詢是BooleanQuery。
四、範圍查詢
[]:表示閉區間;{}:表示開區間;以下圖所示:
上圖中,開區間查詢,在profile中會發現,查詢範圍是從2016至2019,開區間意味着要大於開區間的起始值。
五、算數符號查詢
包括:>、>=、<、<=,以下圖所示:
六、通配符查詢
通配符查詢效率低、佔用內存大,故不建議使用。
?:表明1個字符;*:表明0或多個字符;
七、模糊/近似度匹配查詢
從上面兩圖中能夠看出,近似度查詢中的~1表示一個詞中容許有一個字母與正確單詞不差異;~2表示對一個短語進行搜索,能夠搜索到缺失1個或2個詞的短語,2個以上的不屬於此搜索範圍。
八、正則表達式查詢
3、Request Body搜索操做(DSL操做)
在ElasticSearch中,通常高階的搜索操做都是經過Request Body來實現。
//經過from size返回查詢結果,注意:獲取靠後的翻頁成本較高。
post /movies/_search
{
"profile": true,
「from":10,
"size":20,
"query": {
"match": {"title":"iron man"}
}
}
//經過sort對查詢結果進行排序,注意:排序字段最好是「數字型」或「日期型」
post /movies/_search
{
"profile": true,
"sort":[{"order_date":"desc"}]
"from":10,
"size":20,
"query": {
"match": {"title":"iron man"}
}
}
//經過_source元數據過濾,返回相應的字段,此時,對"iron man"的查詢是iron OR man的邏輯
post /movies/_search
{
"profile":true,
"_source":["title","year"],
"from":10,
"size":5,
"sort":[{"year":"desc"}],
"query":{
"match": {"title":"iron man"}
}
}
//若想對"iron man"執行iron AND man的邏輯,可按以下操做
post /movies/_search
{
"profile":true,
"_source":["title","year"],
"from":10,
"size":5,
"sort":[{"year":"desc"}],
"query":{
"match"{
"title":{
"query":"iron man",
"operator":"AND"
}
}
}
}
二者執行結果,以下圖所示:
//腳本字段,經過script_fields對返回字段進行加工,來算出一個新的字段
post /movies/_search
{
"profile":true,
"script_fields":{
"new_fields":{
"script":{
"lang":"painless",
"source":"doc['year'].value+'-hello'"
}
}
},
"_source":["title","year"],
"from":0,
"size":10,
"sort":[{"year":"desc"}],
"query":{
"match_all":{}
}
}
//短語搜索,注意slop的意思是能夠在iron man之間能夠有1個其餘的字符
post /movies/_search
{
"profile":true,
"_source":["title","year"],
"query":{
"match_phrase":{
"title":{
"query":"iron man",
"slop":"1"
}
}
}
}
4、Query String和Simple Query String搜索(也是DSL操做)
咱們向索引users中插入兩條文檔:
put /users/_doc/3
{
"name":"tang bohu",
"about":"gongfu,wencai,huahua"
}
put /users/_doc/4
{
"name":"zhang sanfeng",
"about":"gongfu,youmo"
}
一、Query String
在DSL中也是能夠支持相似於URI Query的查詢。
二、Simple Query String
該種查詢的特色:
1)此種查詢相似於Query String,可是會忽略錯誤的語法,同時只支持部分查詢語法;
2)不支持AND、OR、NOT,只會將其做爲字符串處理;
3)Term之間的默認關係是OR,經過Operator能夠指定其餘關係;
4)支持部分邏輯:+、-、|;
注意:Query、Query String、Simple Query String在使用時,後二者的靈活性下降了,可是更容易寫;而第一種靈活性最大,可是容易出錯。
你們可關注個人公衆號
知識學習來源:阮一鳴:《Elasticsearch核心技術與實戰》