前言
模糊查詢主要針對文本類型使用。
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"]
}