Elasticsearch前缀匹配案例深入剖析-搜索系统线上实战

282 阅读2分钟

专注于大数据及容器云核心技术解密,可提供全栈的大数据+云原生平台咨询方案,请持续关注本套博客。如有任何学术交流,可随时联系。更多内容请关注《数据云技术社区》公众号。

1 前缀搜索

  • prefix query不计算relevance score,与prefix filter唯一的区别就是,filter会cache bitset。前缀越短,要处理的doc越多,性能越差,尽可能用长前缀搜索
GET my_index/my_type/_search
{
  "query": {
    "prefix": {
      "title": {
        "value": "C3"
      }
    }
  }
}

前缀搜索,它是怎么执行的?性能为什么差呢?
match
C3-D0-KD345
C3-K5-DFG65
C4-I8-UI365

分词:
c3			doc1,doc2
d0
kd345
k5
dfg65
c4
i8
ui365
c3 
--> 扫描倒排索引 
--> 一旦扫描到c3,就可以停了,因为带c3的就2个doc,已经找到了
--> 没有必要继续去搜索其他的term了

不分词:
c3 
--> 先扫描到了C3-D0-KD345,找到了一个前缀带c3的字符串
--> 还是要继续搜索的,因为后面还有一个C3-K5-DFG65,也许还有其他很多的前缀带c3的字符串
--> 你扫描到了一个前缀匹配的term,不能停,必须继续搜索 
--> 直到扫描完整个的倒排索引,才能结束
  • 实际场景中,可能有些场景是全文检索解决不了的
C3D0-KD345
C3K5-DFG65
C4I8-UI365
c3d0
kd345

c3 --> match --> 扫描整个倒排索引,能找到吗?显然是不能的。
所以:前缀匹配c3 --> 只能用prefix

2 通配符搜索

  • 跟前缀搜索类似,功能更加强大
[0-9]:指定范围内的数字
[a-z]:指定范围内的字母
.:一个字符
+:前面的正则表达式可以出现一次或多次

GET my_index/my_type/_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "C?K*5"
      }
    }
  }
}

3 正则搜索

GET /my_index/my_type/_search 
{
  "query": {
    "regexp": {
      "title": "C[0-9].+"
    }
  }
}

4 总结

执笔小记,方便查阅。

专注于大数据及容器云核心技术解密,可提供全栈的大数据+云原生平台咨询方案,请持续关注本套博客。如有任何学术交流,可随时联系。更多内容请关注《数据云技术社区》公众号。