說明
ElasticSearch請求類型很多,支持精確、模糊、組合、正則、範圍等,爲複雜查詢提供保證。
查詢說明
- Elasticsearch有不同類型和查詢規則,大致總結如下,後續根據實際情況修正,學無止境。
查詢方式
方式名 | 說明 | 特點 |
---|---|---|
term | 精準查詢 | 字段和內容完全匹配 |
terms | 精準查詢 | term擴展,支持單字段多內容查詢 |
match_all | 查詢全部信息 | 查詢index全部信息 |
match | 分詞匹配查詢 | 單字段分詞匹配查詢 |
multi_match | 分詞匹配查詢 | 多字段分詞匹配查詢 |
match_phrase | 分詞匹配查詢 | 首先將查詢字符串解析成一個詞項列表,然後對這些詞項進行搜索,但只保留那些包含 全部 搜索詞項,且 位置與搜索詞項相同的文檔 |
query_string | 類似match | match需要指定字段名,query_string不需要指定字段名,是在所有字段中搜索,範圍更廣泛。 |
fuzzy | 模糊查詢 | 滿足查詢的指定字符個數即可 |
wildcard | 通配符查詢 | 允許指定一個模式來匹配,而不需要指定完整的trem,匹配的方式類似於match的分詞匹配查詢,可使用?和* |
bool | 布爾查詢 | 支持should(或)、must(與)、must_not(非) |
range | 範圍查詢 | integer、long、double、data、ip等類型數據的範圍查詢,通過relation設置關係:within、contains、intersects |
regexp | 正則查詢 | 通過正則搜索字段中滿足條件的數據 |
prefix | 前綴匹配查詢 | |
exists | 字段查詢 | 文檔字段是否有值 |
missing | 字段查詢 | 文檔字段是否爲空 |
fuzzy_like_this | 文檔搜索 | |
fuzzy_like_this_field | 文檔搜索 | |
more_like_this | 文檔搜索 | |
more_like_this_field | 文檔搜索 |
查詢方式加字段類型
方式 | 數據類型 | 特點 |
---|---|---|
term | keyword | term不分詞,keyword字段也不分詞,需要完全匹配纔可 |
term | text | term不分詞,text字段分詞,所以term查詢條件必須是text字段分詞後的某一個。 |
match | keyword | match分詞,keyword不分詞,match的需要跟keyword的完全匹配可以。 |
match | text | match分詞,text分詞,只要match的分詞結果和text的分詞結果有相同的就匹配 |
match_phrase | keyword | match_phrase的需要跟keyword的完全匹配纔可以。 |
match_phrase | text | match_phrase是分詞的,text也是分詞的。match_phrase的分詞結果必須在text字段分詞中都包含,而且順序必須相同,而且必須都是連續的。 |
query_string | keyword | 無法查詢 |
query_string | text | 不需要連續,順序還可以調換。 |
查詢實例
以下查詢全部以post類型,請求地址:http://127.0.0.1:9200/索引名/_search
精確匹配
term
單字段或多字段單值精確查詢,請求數據:
{
"query": {
"term": {
"name.keyword": "張三"
}
}
}
- 響應:
{
"_shards":{
"total":1,
"failed":0,
"successful":1,
"skipped":0
},
"hits":{
"hits":[
{
"_index":"userindex",
"_type":"_doc",
"_source":{
"args":20,
"createtm":"2018-4-5 11:07:23",
"name":"張三",
"description":"張三是java開發工程師",
"id":1
},
"_id":"one",
"_score":0.6931471
}
],
"total":{
"value":1,
"relation":"eq"
},
"max_score":0.6931471
},
"took":2,
"timed_out":false
}
terms
字段多值精確查詢,請求數據實例:
{
"query": {
"terms": {
"name.keyword": ["張三","思路"]
}
}
}
- 響應:
{
"_shards":{
"total":1,
"failed":0,
"successful":1,
"skipped":0
},
"hits":{
"hits":[
{
"_index":"userindex",
"_type":"_doc",
"_source":{
"args":20,
"createtm":"2018-4-5 11:07:23",
"name":"張三",
"description":"張三是java開發工程師",
"id":1
},
"_id":"one",
"_score":0.6931471
}
],
"total":{
"value":1,
"relation":"eq"
},
"max_score":0.6931471
},
"took":2,
"timed_out":false
}
分詞匹配
match
單字段分詞匹配查詢,如果是中文,如查詢字段name爲張三,結果會返回name包含張和三的數據。請求數據實例:
{
"query":{
"match":{
"name":"zhangsan"
}
}
}
match_all
查詢index所有數據,請求數據實例:
{
"query":{
"match_all":{
}
}
}
multi_match
多字段分詞匹配查詢,請求數據實例:
{
"query":{
"multi_match":{
"query":"zhangsan",
"fields":["name","description"]
}
}
}
match_phrase
短語匹配查詢,ElasticSearch引擎首先分析(analyze)查詢字符串,從分析後的文本中構建短語查詢,這意味着必須匹配短語中的所有分詞,並且保證各個分詞的相對位置不變。請求數據實例:
{
"query":{
"match_phrase":{
"name":"zhangsan lisi"
}
}
}
模糊查詢fuzzy
可以糾正查詢時輸入內容部分錯誤,fuzziness設置最小匹配字符。請求數據實例:
{
"query":{
"fuzzy":{
"name":{
"value":"lisss",
"fuzziness":2
}
}
}
}
通配符查詢wildcard
通配符支持一定模式匹配,查詢方式類似term的分詞匹配,請求數據實例:
{
"query":{
"wildcard":{
"name":"li*"
}
}
}
組合查詢 bool
彙集其他查詢爲一體的複雜查詢
should或
多個字段內容匹配,關係爲或。請求數據實例:
{
"query":{
"bool":{
"should":[
{ "match" : { "name":"zhangsan" }},
{ "match" : { "name":"lisi"}}
]
}
}
}
must與
多個字段內容匹配,關係爲與。請求數據實例:
{
"query":{
"bool":{
"must":[
{ "match" : { "name":"zhangsan" }},
{ "match" : { "name":"lisi"}}
]
}
}
}
must_not非
多個字段內容匹配,不是查詢條件的內容。請求數據實例:
{
"query":{
"bool":{
"must_not":[
{ "match" : { "name":"zhangsan" }},
{ "match" : { "name":"lisi"}}
]
}
}
}
range範圍查詢
數值數據類型使用range,可以實現數值範圍查詢,參數如下:
- gt:大於
- lt:小於
- gte:大於等於
- lte:小於登錄
- format:用於轉換日期查詢中的日期格式。如果爲指定,則使用默認格式。
- relation:指示範圍查詢如何匹配range的字段
- INTERSECTS,默認值;使用具有與查找範圍相交的範圍字段來匹配文檔
- CONTAINS;使用範圍字段值完全包含查詢範圍的文檔進行匹配。
- WITHIN;使用範圍字段值完全在查詢範圍內的文檔進行匹配。
- time_zone:查詢中的值轉換爲UTC的偏移量或是IANA時區
- boost:用於減少或增加查詢的相關性得分
查詢age字段大於等於10,小於等於20,請求數據實例:
{
"query": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
}
}
regexp正則匹配
通過正則表達式尋找匹配字段,搜索name值滿足ac.*ha正則表達式的數據,請求實例如下:
{
"query": {
"regexp": {
"name": "ac.*ha"
}
}
}
exists有值查詢
查找文檔字段是否有值,如查詢name字段是否有值,請求實例如下:
{
"query": {
"exists": {
"field": "name"
}
}
}
missing無值查詢
查找文檔字段是否無值,查詢name字段是否爲空,請求實例如下:
{
"query": {
"missing": {
"field": "name"
}
}
}
prefix前追匹配查詢
字符串開頭匹配,請求實例:
{
"query":{
"prefix":{
"name":"ac"
}
}
}
排序+指定位置
_source指定響應字段,from返回結果的位置,size返回結果的最大條數,sort排序,請求數據實例:
{
"_source":["name","description"],
"query":{
"match":{
"name":"lisi?"
}
},
"size":2,
"from":0,
"sort":{
"age":{"order":"desc"}
}
}
優化
term數值查詢
查詢默認使用評分計算,對文檔執行包括或排除計算時,使用constant_score+filter以非評分模式且1作爲統一評分查詢。
//源查詢
{
"query": {
"term": {
"age": 30
}
}
}
//優化查詢
{
"query": {
"constant_score":{
"filter":{
"term": {
"age": 30
}
}
}
}
}
總結
- Elasticsearch知識學習有一定成果,入門水平,想真正用好,需要實踐檢驗,只有理論的技術缺乏硬度。