一、前缀搜索
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的词项