一、前缀搜索 prefix
- 不计算相关度评分
- 性能较差
- 前缀搜索匹配的是分词后的词项
- 前缀搜索没有缓存
- 前缀搜索尽可能把前缀长度设置的更长
GET product/_search
{
"query": {
"fuzzy": {
"name": {
"value": "product1"
}
}
}
}
index_prefixes为词项创建倒排索引,
比如computer这个单词,本身是一个词项,index_prefixes可以为这个单词再创建倒排索引,min_chars=2,max_chars=5的话,创建的索引:co、com、comp、compu
PUT prefixindex
{
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word",
"index_prefixes": {
"min_chars": 2,
"max_chars": 3
}
}
}
}
}
优缺点:
优点:加快前缀索引的搜索效率
缺点:占用内存、空间
二、通配符 wildcard
匹配的也是分词后的词项term
# 造数据
PUT testindex/_doc/1
{
"name":"zhang san"
}
PUT testindex/_doc/2
{
"name":"zhang si"
}
PUT testindex/_doc/3
{
"name":"zhuang san"
}
PUT testindex/_doc/4
{
"name":"zhuang si"
}
# 用法
GET testindex/_search
{
"query": {
"wildcard": {
"name": {
"value": "*san"
}
}
}
}
* 数组中的每个值都是精准值
三、正则 regexp
1. 用法
GET testindex/_search
{
"query": {
"regexp": {
"name": ".*san"
}
}
}
2. flags参数含义
四、模糊查询 fuzzy
1. 情况
1)混淆字符(box->fox)
2) 缺少字符(black->lack)
3) 多出字符(sic -> sick)
4) 颠倒次序(act-> cat)
2. 用法
GET testindex/_search
{
"query": {
"fuzzy": {
"name": "xiaolahu"
}
}
}
3. 参数
编辑距离:把字符改成正确的,需要挪到的次数
GET testindex/_search
{
"query": {
"fuzzy": {
"name": {
"value": "xiaoloahu",
"fuzziness": 1,
"transpositions":false
}
}
}
}
fuzziness, 默认是auto,根据字符串长度,从0,1,2取值
4. match查询也支持fuzziness
GET testindex/_search
{
"query": {
"match": {
"name": {
"query":"xiaoloahu",
"fuzziness": 1
}
}
}
}
match是分词的,fuzzy是不分词的
fuzzy不适合数据量大时使用
五、match_phrase_prefix
match_phrase
match_phrase会分词
被检索字段必须包含match_phrase中的所有词项并且顺序必须是相同的
被检索字段包含的match_phrase中的词项之间不能有其他词项
match_phrase_prefix概念
match_phrase_prefix与match_phrase相似,但是它多了一个特性,就是它允许在文本的最后一个词项(term)上的前缀匹配
如果是一个单词,比如a,它会匹配文档字段所有以a开头的文档
如果是一个短语,比如 "this is ma" ,他会先在倒排索引中做以ma做前缀搜索,然后在匹配到的doc中做match_phrase查询
参数
max_expansions:限制匹配的最大词项,默认50;越大越消耗性能,可以通过减少这个值,提高性能
analyzer:指定何种分析器来对该短语进行分词处理
boost :用于设置该查询的权重
slop :允许短语间的词项(term)间隔
slop 参数告诉 match_phrase 查询词条相隔多远时仍然能将文档视为匹配
什么是相隔多远? 意思是说为了让查询和文档匹配你需要移动词条多少次
六、N-gram和edge ngram
ngram可以用于切词器(比分词器粒度更小)
GET _analyze
{
"tokenizer": "ngram",
"text": "reba always loves me"
}
有两个主要参数
min_gram:创建索引所拆分字符的最小阈值
max_gram:创建索引所拆分字符的最大阈值
ngram也可以用于词项过滤器token filter
GET _analyze
{
"tokenizer": "ik_max_word",
"filter": [ "ngram" ],
"text": "reba always loves me"
}
优点:做模糊搜索时,粒度更细
缺点:占用大量的磁盘空间
Edge n-gream
ngram适用于前缀、中缀、后缀搜索
Edge n-gream只适用于前缀搜索,但也会更节省空间
Edge n-gream的性能比match_phrase_prefix更高