實現類似於關係型資料庫中的 like '%querystring%'
之前一直基於ik分詞,以為無法實現完全匹配。現在實現整理出來,記錄下備忘、共享。
1、先看下ES提供的NGram Tokenizer
2、實現完全匹配
1 elasticsearch學習五、全文檢索
NGram Tokenizer
先看下NGram分詞器屬性
min_gram:單個詞的最小長度,預設1
max_gram:但歌詞的最大長度,預設2
token_chars:大概就是es會按照不在列表中的字元集合進行文字分割(具體意思大家看圖原文^_^)
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 √
先看個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" ]
}
}
}
}
}'
看下這個的分詞效果
curl 'localhost:9200/test/_analyze?pretty=1&analyzer=my_ngram_analyzer' -d '中華人民共和國'
完全匹配實現
定義一個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"
]
}
}
}
}
}'
接下來建立mapping,可以參考我前面的學習四里面建立mapping,指定分析器為前面一步中定義的
接下來使用完全匹配查詢試試啦.只出一條完全匹配的資料,搞定!
{
"query": {
"multi_match": {
"query": "query_string",
"type": "phrase",
"slop": 0,
"fields": [
"content"
],
"analyzer": "charSplit",
"max_expansions": 1
}
}
}
最後記錄一個組合的多條件查詢
要求:查出樣本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
}
}]}
}
}