22.前缀搜索、通配符搜索、正则搜索

主要知识点:

  • 前缀搜索
  • 通配符搜索
  • 正则搜索

   

一、前缀搜索

假如有如下doc数据:

C3D0-KD345

C3K5-DFG65

C4I8-UI365

现在搜索前缀为C3数据,会把前两个都搜索出来

   

1、语法:

   

GET my_index/my_type/_search

{

"query": {

"prefix": {

"title": {

"value": "C3"

}

}

}

}

   

2、前缀搜索的原理

   

1prefix query不计算relevance score,所有结果的得分都是1,与prefix filter唯一的区别就是,filtercache 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]:指定范围内的字母

.:一个字符

+:前面的正则表达式可以出现一次或多次

   

这三种方式都会扫描整个倒排索引,性能会很差,在实际工作中,不到万不得已不要用这种语法。

posted @ 2018-03-08 10:19  outback123  阅读(813)  评论(0编辑  收藏  举报