Elasticsearch 模糊查詢

前言

模糊查詢主要針對文本類型使用。
1、當搜索字段是text類型時:由於它會分詞,在執行wildcard、regexp、prefix時,es會檢查字段中的每個詞條,而不是整個字段。
2、當搜索字段是keyword類型時:在執行wildcard、regexp、prefix時,es會檢查字段中整個文本。

性能方面:prefix > wildcard > regexp

1、模糊查詢之前綴查詢-prefix

prefix 前綴查詢,以下查詢示例 表示查出所有姓張的人(名字name以張開頭),並且只返回name字段(_source字段的列表就是需要返回的)
查詢示例:

POST /_search?pretty
{
    "query":{
        "bool":{
            "filter":[{"prefix":{"name":"張"}}                              
            ]}},
"size": 5,
"_source": ["name"]
}

2、模糊查詢之通配符查詢-wildcard

wildcard支持shell標準通配符。
注意:字母要小寫!
注意:字母要小寫!
注意:字母要小寫!
 
  

通配符 含義 實例
* 匹配 0 或多個字符 a*b,a與b之間可以有任意長度的任意字符, 也可以一個也沒有, 如 aabcb, axyzb, a012b, ab
? 匹配任意單個字符 a?b,a與b之間有且只有一個字符, 可以是任意字符, 如 aab, abb, acb, a0b
[list]  匹配 list 中的任意單個字符 a[xyz]b,a與b之間必須也只能有一個字符, 但只能是 x 或 y 或 z, 如 axb, ayb, azb。
[!list] 匹配除 list 中的任意單一字符 a[!0-9]b,a與b之間必須也只能有一個字符, 但不能是阿拉伯數字, 如 axb, aab, a-b。
[c1-c2] 匹配 c1-c2 中的任意單一字符 a[0-9]b,匹配0與9之間其中一個字符,如 a0b, a1b… a9b
{s1,s2,…}  匹配 s1 或 s2 (或更多)中的一個字符串 a{abc,xyz,123}b,a與b之間只能是abc或xyz或123這三個字符串之一
查詢示例,查詢名字中帶有‘萬’字的文檔

查詢示例,查詢名字中帶有‘萬’字的文檔

POST /_search?pretty
{
    "query":{"bool":{
                       "filter":[{"wildcard":{"name":"*萬*"}}                              
        ]}},
    "size": 2,
    "_source": ["name"]
}

3、模糊查詢之正則查詢-regexp

注意:字母要小寫!
注意:字母要小寫!
注意:字母要小寫!

支持標準的正則。
查詢示例:

POST /_search?pretty
{
  "query":{"bool":{
                       "filter":[{"regexp":{"name":".*張.*"}}                              
 ]}},
"size": 2,
"_source": ["name"]
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章