elasticsearch學習六、完全匹配搜尋、精確匹配?

實現類似於關係型資料庫中的 like '%querystring%'

之前一直基於ik分詞,以為無法實現完全匹配。現在實現整理出來,記錄下備忘、共享。

1、先看下ES提供的NGram Tokenizer

2、實現完全匹配

1 elasticsearch學習五、全文檢索

NGram Tokenizer

先看下NGram分詞器屬性

min_gram:單個詞的最小長度,預設1

max_gram:但歌詞的最大長度,預設2

token_chars:大概就是es會按照不在列表中的字元集合進行文字分割(具體意思大家看圖原文^_^)

elasticsearch學習六、完全匹配搜尋、精確匹配

token_chars 字元classes:

letter for example a, b, ï or 京

digit for example 3 or 7

whitespace for example " " or "\n"

punctuation for example ! or "

symbol for example $ or √

elasticsearch學習六、完全匹配搜尋、精確匹配

先看個example,

curl -XPUT 'localhost:9200/test' -d '

{

"settings" : {

"analysis" : {

"analyzer" : {

"my_ngram_analyzer" : {

"tokenizer" : "my_ngram_tokenizer"

}

},

"tokenizer" : {

"my_ngram_tokenizer" : {

"type" : "nGram",

"min_gram" : "2",

"max_gram" : "3",

"token_chars": [ "letter", "digit" ]

}

}

}

}

}'

elasticsearch學習六、完全匹配搜尋、精確匹配

看下這個的分詞效果

curl 'localhost:9200/test/_analyze?pretty=1&analyzer=my_ngram_analyzer' -d '中華人民共和國'

elasticsearch學習六、完全匹配搜尋、精確匹配

完全匹配實現

定義一個charsplit的分析器,使用的ngram分詞。min_gram、max_gram為1,同時我只需要匹配letter、digit、punctuation。

curl -XPUT 'localhost:9200/dm_v1' -d '{

"settings": {

"analysis": {

"analyzer": {

"charSplit": {

"type": "custom",

"tokenizer": "ngram_tokenizer"

}

},

"tokenizer": {

"ngram_tokenizer": {

"type": "nGram",

"min_gram": "1",

"max_gram": "1",

"token_chars": [

"letter",

"digit",

"punctuation"

]

}

}

}

}

}'

elasticsearch學習六、完全匹配搜尋、精確匹配

接下來建立mapping,可以參考我前面的學習四里面建立mapping,指定分析器為前面一步中定義的

elasticsearch學習六、完全匹配搜尋、精確匹配

elasticsearch學習六、完全匹配搜尋、精確匹配

接下來使用完全匹配查詢試試啦.只出一條完全匹配的資料,搞定!

{

"query": {

"multi_match": {

"query": "query_string",

"type": "phrase",

"slop": 0,

"fields": [

"content"

],

"analyzer": "charSplit",

"max_expansions": 1

}

}

}

elasticsearch學習六、完全匹配搜尋、精確匹配

最後記錄一個組合的多條件查詢

要求:查出樣本1中,內容或者url或標題包含‘new’的所有記錄。

需要注意的是fields中的屬性include_in_all都是true的,這樣_all才能對該欄位搜尋

{"query":{

"bool":

{"must":[{"term":{"sample":1}},{

"multi_match": {

"query": "new",

"type": "phrase",

"slop": 0,

"fields": [

"content","url","bid_title"

],

"analyzer": "charSplit",

"max_expansions": 1

}

}]}

}

}

elasticsearch學習六、完全匹配搜尋、精確匹配

相關問題答案