模糊查询、短语前缀、优化

一、模糊查询

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后则跳到下一词项

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

posted @ 2022-02-14 11:24  showMeTheCodes  阅读(315)  评论(0编辑  收藏  举报