前言
模糊查询主要针对文本类型使用。
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"]
}