22.前缀搜索、通配符搜索、正则搜索
主要知识点:
- 前缀搜索
- 通配符搜索
- 正则搜索
一、前缀搜索
假如有如下doc数据:
C3D0-KD345
C3K5-DFG65
C4I8-UI365
现在搜索前缀为C3数据,会把前两个都搜索出来
1、语法:
GET my_index/my_type/_search
{
"query": {
"prefix": {
"title": {
"value": "C3"
}
}
}
}
2、前缀搜索的原理
1、prefix query不计算relevance score,所有结果的得分都是1,与prefix filter唯一的区别就是,filter会cache bitset.
2、会扫描整个倒排索引,因为他找到第一个前缀到c3的之后,还有可能后面的doc也还包含c3,所以直到扫描到整个到排索引之后才能确定。前缀越短,要处理的doc越多,性能越差,尽可能用长前缀搜索
二、通配符搜索
跟前缀搜索类似,功能更加强大,但是性能也很差。
?表示一个字条
*表示0个或任意多个字符
c? 表示以c开头,后面再有一个字符。
1、语法:
GET my_index/my_type/_search
{
"query": {
"wildcard": {
"title": {
"value": "C?K*5"
}
}
}
}
三、正则搜索
用正则表达示进行搜索。
GET /my_index/my_type/_search
{
"query": {
"regexp": {
"title": "C[0-9].+"
}
}
}
[0-9]:指定范围内的数字
[a-z]:指定范围内的字母
.:一个字符
+:前面的正则表达式可以出现一次或多次
这三种方式都会扫描整个倒排索引,性能会很差,在实际工作中,不到万不得已不要用这种语法。