實現對es中存儲的數據進行查詢分析,以_search爲結尾,查詢主要有兩種形式:
URI Search
:操作簡便,方便通過命令行測試,僅包含部分查詢語法Request Body Search
:es提供完備查詢語法Query DSL
(Domain Specific Language)
URI Search詳解
通過url query
參數來實現搜索,常用參數如下:
q
: 指定查詢語句,語法爲 Query String Syntaxdf
: q中不指定字段時默認查詢的字段,如果不指定,es會查詢所有字段sort
:排序timeout
:指定超時時間,默認不超時from,size
:用於分頁
案例如下所示:
GET /myindex/_search?q=alfred&df=user&sort=age:asc&from=4&size=10&timeout=1s
#查詢user字段包含alfred的文檔,結果按照age升序排列,返回第5-14個文檔,如果超過1s沒有結束,則以超時結束
Query String Syntax
- 1.term與phrase
alfred way 等效於 alfred OR way
"alfred way" 詞語查詢,要求先後順序
- 2.泛查詢
alfred等效於在所有字段去匹配該term
- 3.指定字段
name:alfred
- 4.Group分組指定,使用括號指定匹配的規則
(quick OR brown) AND fox
status:(active OR pending) title:(full text search)
- 5.布爾操作符
AND(&&),OR(||),NOT(!)
name:(tom NOT lee) 注意大寫,不能小寫
+ - 分別對應must和must_not
name:(tom +lee -alfred)
name:((lee && !alfred)||(tom && lee && !alfred))
+
在url中會被解析爲空格,要使用encode後的結果纔可以,爲%2B
6.範圍查詢,支持數值和日誌
- 區間寫法,閉區間用[],開區間用{}
age: [1 TO 10]意爲 1<=age<=10 age: [1 TO 10}意爲 1<=age<10 age: [1 TO ]意爲 age>=1 age: [* TO 10]意爲 age<=10
- 算數符號寫法
age:>=1 age:(>=1&&<=10)或者age:(+>=1 +<=10)
- 7.通配符查詢:?代表一個字符,*代表0或多個字符
name:t?m
name:tom*
通配符匹配執行效率低,且佔用較多內存,不建議使用
如無特殊需求,不要將?/*放在最前面
- 8.正則表達式:
name:/[mb]oat/
- 9.模糊匹配 fuzzy query
name:roam~1
匹配與roam差一個character的詞,比如foam roams等
- 10.近似度查詢 proximity search
"fox quick"~5
以term爲單位進行差異比較,比如"quick fox" "quick brown fox"都會被匹配
示例說明:
GET /myindex/_search?q=username:alfred way
{
"profile": "true"
}
#其中alfred爲指定username字段查詢,way爲泛查詢
如果想在指定字段中查詢,可以改爲如下語句:
GET /myindex/_search?q=username:"alfred way"
GET /myindex/_search?q=username:(alfred way)
GET /myindex/_search?q=username:(alfred +way) (包含alfred或者包含way)+被解析爲空> > 格,需要改爲如下形式
GET /myindex/_search?q=username:(alfred %2Bway)(必須包含way,可以有alfred)
userna:alfred AND way 和userna:(alfred AND way)的查詢語法完全不同,前者包含一個泛查> 詢
可以通過{"profile": "true"}查看查詢語法。
Request Body Search
將查詢語句通過http request body 發送到es,主要包含如下參數:
- query: 符合Query DSL語法的查詢語句
- from,size
- timeout
- sort
- …
Query DSL
Query DSL
: 基於json定義的查詢語言,主要包含如下兩種類型:
- 字段類查詢:如
term、match、range
等,只針對某一字段進行查詢 - 複合查詢:如
bool
查詢等,包含一個或多個字段類查詢或者複合查詢語句
match查詢示例:
GET my_index/_search
{
"query": {
"match": {
"username": "alfred way"
}
}
}
字段類型的查詢
- 全文匹配:針對text類型字段進行全文檢索,對語句先進行分詞,如
match,match_phrase
等
match
:operator
參數,可選項爲and和or;minimum_should_match
: 需要匹配的單詞數
match_phrase
:詞語查詢
slop
參數:控制單詞的間隔數(差異數)
query_string
:類似於url中的q參數查詢
simple_query_string
:會忽略錯誤的查詢語法,並且僅支持部分查詢語法,不能使用AND,OR,NOT,要用+,|,-代替
- 單詞匹配:不會進行分詞處理,直接匹配倒排索引,如
term,terms,range
等
term;terms
:一次傳入多個參數進行查詢
range
:gt,gte,lt,lte
日期:gte:"1999-02-01"
計算:+1h -1d /d
(將時間舍入到天)
或者gte:"now-20y"
(也可以用具體的日期"2018-01-01"
,使用的時候用||
做隔離)
2018-01||+1M/d
複合查詢
constant_score
:將內部查詢結果的文檔得分設定爲1或者boost
的值
一般用於結合bool查詢實現自定義得分bool
:一個或者多個bool字句組成filter
,只過濾符合條件的文檔,不計算相關得分(對性能提升有用,做簡單查詢的時候,推薦使用filter
替代query
)must
,文檔必須符合must
中的條件,會影響相關性得分must_not
,文檔必須不符合must_not
中的所有條件should
,文檔可以符合should
中的條件,會影響得分,一般兩種形式:
- (1)只包含
should
,不包含must
:文檔必須滿足至少一個條件
minimum_should_match
:控制滿足的個數或者百分比 - (2)同時包含
should
和must
:不必滿足條件,如果滿足,會有加分
- (1)只包含
- dis_max
- function_score
- boosting