二十三、elasticSearch前缀搜索/通配符/ngram分词

1、前缀搜索

GET my_index/my_type/_search
{
  "query": {
    "prefix": {
      "title": {
        "value": "C3"
      }
    }
  }
}

前缀越短,要处理的doc越多,性能越差,尽可能用长前缀搜索,前缀搜索会进行全扫,就和数据库中的全表扫描,性能很差。
2、通配符搜索

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

?:任意字符
*:0个或任意多个字符

性能一样差,必须扫描整个倒排索引,才ok
3、正则搜索

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

[0-9]:指定范围内的数字
[a-z]:指定范围内的字母
.:一个字符
+:前面的正则表达式可以出现一次或多次

4、搜索推荐

GET /my_index/my_type/_search 
{
  "query": {
    "match_phrase_prefix": {
      "title": "hello d"
    }
  }
}

原理跟match_phrase类似,唯一的区别,就是把最后一个term作为前缀去搜索

GET /my_index/my_type/_search 
{
  "query": {
    "match_phrase_prefix": {
      "title":{
“query”:"hello d",
“slop”:10,
“max_expansions”:50
} 
    }
  }
}

hello就是去进行match,搜索对应的doc
w,会作为前缀,去扫描整个倒排索引,找到所有w开头的doc
然后找到所有doc中,即包含hello,又包含w开头的字符的doc
根据你的slop去计算,看在slop范围内,能不能让hello w,正好跟doc中的hello和w开头的单词的position相匹配
也可以指定slop,但是只有最后一个term会作为前缀
max_expansions:指定prefix最多匹配多少个term,超过这个数量就不继续匹配了,限定性能
5、什么是ngram/edge ngram
就是分词切分设置
例如:quick,5种长度下的ngram
ngram length=1,q u i c k
ngram length=2,qu ui ic ck
ngram length=3,qui uic ick
ngram length=4,quic uick
ngram length=5,quick
quick,anchor首字母后进行ngram
q
qu
qui
quic
quick

PUT /my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "autocomplete_filter":{
          "type":"ngram",
          "min_gram":1,
          "max_gram":20
        }
      },
      "analyzer": {
        "autocomplete":{
          "type":"custom",
          "tokenizer":"standard",
          "filter":[
            "lowercase","autocomplete_filter"
            ]
        }
      }
    }
  }
}
GET /my_index/_analyze
{
  "analyzer": "autocomplete",
  "text": "zhuxingyu"
}

6、误拼写时的fuzzy模糊搜索技术

GET /forum/article/_search
{
  "query": {
    "fuzzy": {
      "title": {
        "value": "jddva",
        "fuzziness": 2
      }
    }
  }
}

fuzzy搜索以后,会自动尝试将你的搜索文本进行纠错,然后去跟文本进行匹配
fuzziness,你的搜索文本最多可以纠正几个字母去跟你的数据进行匹配,默认如果不设置,就是2
另一种写法

GET /forum/article/_search
{
  "query": {
    "match": {
      "title": {
        "query": "jdava BLOG",
        "fuzziness":"AUTO",
        "operator": "and"
      }
    }
  }
}

Operator:包含

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容