模糊查询和智能搜索推荐2.0

一、前缀搜索

prefix前缀搜索的不是数据库中映射的文本,而是词项字典中的数据

前缀搜索不会计算相关度分数

 1 GET my_index/_search
 2 {
 3     "query": {
 4         "prefix": {
 5             "text": {
 6                 "value": "城管"
 7             }
 8         }
 9     }
10 }

注意:当mapping中字段没有设置分词器时,中文会被默认按照空格进行分词

在进行搜索时尽量不要使用prefix,性能不好

二、通配符wildcard

 1 GET my_index/_search
 2 {
 3     "query": {
 4         "wildcard": {
 5             "text": {
 6                 "value": "eng*ish"
 7             }
 8         }
 9     }
10 }

注意:通配符与前缀搜索相同,都为term查询,及搜索的为词项字典中匹配的text

三、正则表达式

1 {
2     "query": {
3         "regexp": {
4             "title": {
5                 "value": "[\s\S]*nfc[\s\S]*"
6             }
7         }
8     }
9 }

一般查询时很少使用正则表达式进行查询

四、模糊查询

1、使用场景:

  混淆字符(box -> fox)  缺少字符(black -> lack)

  多出字符(sic -> sick)  颠倒字符(act -> cat)

2、语法

1 {
2     "query": {
3         "fuzzy": {
4             "desc": {
5                 "value": "[\s\S]*nfc[\s\S]*"
6             }
7         }
8     }
9 }

 五、短语前缀 match_phrase_prefix

1、match_phrase:短语搜索

  ①会被分词  ②被检索字段必须包含match_phrase中的所有词项且顺序相同

  例:match_phrase:手机 中     被检索:手机  中 的 轰炸机

    被检索中必须包含(手机 中),且顺序不能变

2、match_phrase_prefix:短语最后一个词项做前缀查询

  例:match_phrase_prefix:shouji zhong d             被检索:shouji zhong de zhandouji 

    此时match_phrase_prefix也可以搜索到结果,因为最后的d会做前缀匹配

执行原理:先将match_phrase_prefix最后一个词项做前缀查询(特别消耗性能),再将匹配到的所有词项做短语查询

    可以设置max_expansions参数,默认为50,及前缀匹配中搜索前50的词项

作者:http://cnblogs.com/lyc-code/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权力。

原文地址:https://www.cnblogs.com/lyc-code/p/15257776.html