模糊查询、短语前缀、优化
一、模糊查询
1、四种情况:
混淆字符(box->fox) 缺少字符(black->lack)
多出字符(sic->sick) 颠倒次序(act->cat)
2、使用fuzzy进行模糊查询:
1 GET product_en/_search 2 { 3 "query": { 4 "fuzzy": { 5 "desc": { 6 "value": "quangongneng nfc" 7 } 8 } 9 } 10 }
3、使用match进行模糊查询
1 GET product_en/_search 2 { 3 "query": { 4 "match": { 5 "desc": { 6 "query": "nfe quasdasdasdasd", 7 "fuzziness": 1 8 } 9 } 10 } 11 }
使用fuzzy进行模糊查询与使用fuzzy进行模糊查询的区别:
使用fuzzy进行模糊查询时,value中的字段不会进行分词,而是作为一个整体进行匹配
使用match进行模糊查询时,value中的字段会被分词,分词后按照每个分词结果进行匹配
二、match_phrase_prefix
1、match_phrase:
①match_phrase会被分词
②被检索字段必须包含match_phrase中的所有词项并且顺序必须是相同的
③被检索字段包含的match_phrase中的词项之间不能有其他词项
2、match_phrase_prefix:它允许在文本的最后一个词项上的前缀匹配,如果是一个单词,比如a,它会匹配文档字段所有以a开头的文档,如果是一个短语,比如"this is ma",他会先在倒排索引中做以ma做前缀搜索,然后在匹配到的doc中做match_phrase查询
1 GET product_en/_search 2 { 3 "query": { 4 "match_phrase_prefix": { 5 "desc": { 6 "query": "de zhong shouji hongzhaji", 7 "max_expansions": 50 只使用前缀查询匹配50条数据 8 } 9 } 10 } 11 }
三、ngram和edge ngram
1 # ngram 和 edge-ngram 2 #ngram min_gram =1 "max_gram": 2 3 4 GET _analyze 5 { 6 "tokenizer": "ik_max_word", 7 "filter": [ "edge_ngram" ], 8 "text": "reba always loves me" 9 } 10 11 #min_gram =1 "max_gram": 1 12 #r a l m 13 14 #min_gram =1 "max_gram": 2 15 #r a l m 16 #re al lo me 17 18 #min_gram =2 "max_gram": 3 19 #re al lo me 20 #reb alw lov me
ngram适用于前缀、中缀、后缀搜索,因为它会将每个词项从头到尾按照min_gram和max_gram进行切分
edge_ngram只适用于前缀搜索,因为它只会将每个词项从头按照min_gram和max_gram进行切分,一旦到达max_gram后则跳到下一词项