Elasticsearch請求類型和使用說明

說明

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知識學習有一定成果,入門水平,想真正用好,需要實踐檢驗,只有理論的技術缺乏硬度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章