背景:在搜索的時候經常會有一種場景就是忽略大小寫,不管你輸入的是全大寫還是全小寫還是大小寫混合,希望都能夠搜索出結果。 解決思路:Elasticsearch中的lowercase normalizer將文本轉換為小寫,並將其作為規範形式存儲在索引中。這可以確保在搜索和比較文本時忽略大寫字母的差異,從 ...
背景:在搜索的時候經常會有一種場景就是忽略大小寫,不管你輸入的是全大寫還是全小寫還是大小寫混合,希望都能夠搜索出結果。
解決思路:Elasticsearch中的lowercase normalizer將文本轉換為小寫,並將其作為規範形式存儲在索引中。這可以確保在搜索和比較文本時忽略大寫字母的差異,從而提高搜索的準確性和一致性
實現方案:
開發過程中,經常會遇到索引是之前已經建好的,由於es的規則,只能新增欄位,不能刪除或者修改已經存在的欄位,可以動態更新原有索引的setting,動態更新setting,需要先關閉索引,執行玩更新操作以後,再開啟索引,步驟如下:
index_name是 索引名稱
field_name是欄位名稱
POST index_name/_close PUT /index_name/_settings { "index":{ "analysis":{ "normalizer":{ "lowercase_normalizer":{ "type": "custom", "char_filter": [], "filter": ["lowercase"] } } } } } POST index_name/_open PUT /index_name/_mapping { "properties" : { "field_name" : { "type" : "keyword", "normalizer":"lowercase_normalizer" } } }
舉個例子:
新建一個索引:
PUT /lowercase_normalizer_index { "mappings" : { "properties" : { "id" : { "type" : "keyword" } } } }
新增欄位 設置屬性
POST lowercase_normalizer_index/_close PUT /lowercase_normalizer_index/_settings { "index":{ "analysis":{ "normalizer":{ "lowercase_normalizer":{ "type": "custom", "char_filter": [], "filter": ["lowercase"] } } } } } POST lowercase_normalizer_index/_open PUT /lowercase_normalizer_index/_mapping { "properties" : { "name" : { "type" : "keyword", "normalizer":"lowercase_normalizer" } } }
插入一些數據
PUT lowercase_normalizer_index/_doc/1 { "id": "1", "name": "Mohammed Ahmed" }
PUT lowercase_normalizer_index/_doc/2 { "id": "2", "name": "Sophie Martin" }
PUT lowercase_normalizer_index/_doc/3 { "id": "3", "name": "mohammed ahmed" }
驗證
GET lowercase_normalizer_index/_search { "query": { "wildcard": { "name": { "value": "*moham*" } } } }
結果
{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "lowercase_normalizer_index", "_type" : "_doc", "_id" : "1", "_score" : 1.0, "_source" : { "id" : "1", "name" : "Mohammed Ahmed" } }, { "_index" : "lowercase_normalizer_index", "_type" : "_doc", "_id" : "3", "_score" : 1.0, "_source" : { "id" : "3", "name" : "mohammed ahmed" } } ] } }