elasticsearch 7.x 如何滿足mysql中的模糊查詢功能(like)


業務場景:篩選項原功能是用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也要注意因數據量過大分詞后所占容量變多的情況

有空格的情況:

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM