業務場景:篩選項原功能是用mysql左模糊進行過濾查詢,現業務要用es,怎么樣才能滿足原功能,又不損性能。
elasticsearch中有關於模糊查詢的操作:wildcard
文檔:https://blog.csdn.net/qq_22612245/article/details/82432107
另外的思路解決方案:使用分詞
1、篩選項是中文類型
例:商品名稱 :無糖麥芽糖口香糖
篩選這種,用中文分詞即可滿足業務場景
索引定義
"shopname": { "analyzer": "ik_max_word", "type": "text", "fields": { "raw": { "type": "keyword" } } }
2、篩選項是字母加數據類型
例:商品代碼:abcde0001
因為在mysql中是左模糊,用戶可能會篩abcde、abc、ab、abcde0、abcde0001,這種用中文分詞就不能滿足業務,而用es的wildcard性能不好,
綜合考慮使用ngram分詞器。
使用方法:
創建索引
{ "settings": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "my_tokenizer" } }, "tokenizer": { "my_tokenizer": { "type": "ngram", "min_gram": 2, "max_gram": 3, "token_chars": [ "letter", "digit" ] } } } }, "mappings": { "properties": { "id": { "type": "keyword" }, "shopcode": { "analyzer": "my_analyzer", "type": "text", "fields": { "raw": { "type": "keyword" } } } } } }
驗證方法
POST my_index/_analyze { "analyzer": "my_analyzer", "text": "abcde0001" }
結果:

"min_gram": 2,"max_gram": 3, 這里是設置切的粒度,如果min設為1的話,切的粒度就太細,會占儲存容量。
就算是設置成2,3也要注意因數據量過大分詞后所占容量變多的情況
有空格的情況:


