- 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
- }
- }
- }
- }
- }
优缺点:
优点:加快前缀索引的搜索效率
缺点:占用内存、空间
匹配的也是分词后的词项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"
- }
- }
- }
- }

* 数组中的每个值都是精准值
- GET testindex/_search
- {
- "query": {
- "regexp": {
- "name": ".*san"
- }
- }
- }


1)混淆字符(box->fox)
2) 缺少字符(black->lack)
3) 多出字符(sic -> sick)
4) 颠倒次序(act-> cat)
- GET testindex/_search
- {
- "query": {
- "fuzzy": {
- "name": "xiaolahu"
- }
- }
- }


编辑距离:把字符改成正确的,需要挪到的次数
- GET testindex/_search
- {
- "query": {
- "fuzzy": {
- "name": {
- "value": "xiaoloahu",
- "fuzziness": 1,
- "transpositions":false
- }
- }
- }
- }
fuzziness, 默认是auto,根据字符串长度,从0,1,2取值
- GET testindex/_search
- {
- "query": {
- "match": {
- "name": {
- "query":"xiaoloahu",
- "fuzziness": 1
- }
- }
- }
- }

match是分词的,fuzzy是不分词的
fuzzy不适合数据量大时使用
match_phrase会分词
被检索字段必须包含match_phrase中的所有词项并且顺序必须是相同的
被检索字段包含的match_phrase中的词项之间不能有其他词项
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 查询词条相隔多远时仍然能将文档视为匹配
什么是相隔多远? 意思是说为了让查询和文档匹配你需要移动词条多少次
- GET _analyze
- {
- "tokenizer": "ngram",
- "text": "reba always loves me"
- }
有两个主要参数
min_gram:创建索引所拆分字符的最小阈值
max_gram:创建索引所拆分字符的最大阈值
- GET _analyze
- {
- "tokenizer": "ik_max_word",
- "filter": [ "ngram" ],
- "text": "reba always loves me"
- }
优点:做模糊搜索时,粒度更细
缺点:占用大量的磁盘空间

ngram适用于前缀、中缀、后缀搜索
Edge n-gream只适用于前缀搜索,但也会更节省空间
Edge n-gream的性能比match_phrase_prefix更高