搜索引擎會對文檔和查詢進行分析并將其拆解為最小的單元(通常稱為詞元,實際上就是抽象的符號)。搜索時,匹配過程會使用簡單字串相似度,所以如果查詢中有一些十分微小的拼寫錯誤(例如“hous”,只比“house”少一個字母 e)或者使用名詞的復數形式(“houses”),即使文檔中包含名詞的單數形式(“house”),搜索引擎也不會匹配到這份文檔。詞干提取器或模糊查詢等工具雖然可以解決一些最常見的此類問題,但是它們并不能消除相關聯的概念或想法之間的差異,也不能將文檔或查詢中稍有不同的單詞用法視為等同。
這時同義詞就派上了大用場。同義詞的英文 synonym 來自于希臘語,分別是前綴σ?ν(syn,表示“一起”)和?νομα(ónoma,表示“名稱”)。從它的詞源可以看出,同義詞表示的是在同一語言或領域中具有完全或基本相同意思的不同詞語。實際上,同義詞的范圍非常廣泛,包括一般同義詞(“疲勞”和“困倦”)、縮寫(英鎊的兩種寫法“l(fā)b.”和“pound”)、電商搜索中產品的不同拼寫(“iPod”和“i-Pod”)、細微的語言差異(例如均表示電梯的英式英語“l(fā)ift”和美式英語“elevator”)、專業(yè)用詞和普通用詞(例如“犬”和“狗”),甚至單純表示同一概念的兩種方式(“宇宙”和“太空”)。通過提供恰當的同義詞規(guī)則,搜索工程師能夠就哪些詞在各自領域內具有相似意思并應該采取相似處理方法提供相關信息。
同義詞用于提高搜索質量并擴大匹配范圍。 例如,搜索oil的用戶可能希望找到包含原油或石油的文檔,盡管這三個詞完全不同。
在我們的很多情況下,我們希望在搜索時,有時能夠使用一個詞的同義詞來進行搜索,這樣我們能搜索出來更多相關的內容。我們可以通過 text analysis 來幫助我們形成同義詞
索引時使用同義詞和搜索時使用同義詞的對比
同義詞在分析器中使用,其既可在索引時使用,也可在搜索時使用。關于在 Elasticsearch 中如何使用同義詞篩選器,最常見的問題之一就是:“我應該索引時使用,還是搜索時使用,還是同時都用?” 我們首先看一下在索引時應用同義詞篩選。這意味著會在索引后的文檔中對字詞進行一次性替換或擴展,結果將一直保存在搜索索引中。
索引時使用同義詞有幾個劣勢:
由于必須對所有同義詞進行索引,所以索引規(guī)模會變大。
搜索得分(依賴于字詞統計數據)可能會受影響,因為同義詞也會計算在內,所以不常見單詞的統計數據會存在偏差。
除非進行重新索引,否則無法針對既有文檔更改同義詞規(guī)則。
最后兩條尤其是巨大劣勢。索引時應用同義詞的唯一潛在好處是性能好,因為您在前期已費心完成了擴展過程,所以無需再在每次查詢時完成一遍擴展過程,這有可能致使需要與更多的字詞進行匹配。然而這一點在實踐中通常并非真正的問題。
相反,在搜索時所用的分析工具中使用同義詞則可以避免很多上述問題:
索引規(guī)模不受影響。
語料庫中的字詞統計數據保持不變。
如需變更同義詞規(guī)則,無需對文檔進行重新索引。
這些優(yōu)勢通常要高出唯一的劣勢,即每次查詢時都必須執(zhí)行同義詞擴展操作,這有可能導致需要匹配更多字詞。不僅如此,搜索時擴展同義詞還能夠允許使用更加復雜的synonym_graph詞元篩選器,這一工具能夠正確處理多單詞同義詞,并且僅可在搜索分析器中使用。
一般而言,搜索時使用同義詞的優(yōu)勢通常要高于索引時使用同義詞可能實現的微小性能改進。
然而,如果在搜索時使用同義詞,過去還需要注意另外一個問題。盡管更改同義詞規(guī)則不需要對文檔進行重新索引,但是如要更改的話,您必須暫時關閉再重新打開索引。這一點很有必要,因為分析器在下列時候才會創(chuàng)建實例:創(chuàng)建索引時,重啟節(jié)點時,以及重新打開已關閉的索引時。為了讓對同義詞規(guī)則文件所做的變更對索引可見,用戶必須首先在所有節(jié)點上更新文件,然后再關閉并重新打開索引。但是這個問題已經得以解決。
在查詢時對詞進行同義詞解析
es操作版本8.8.0
創(chuàng)建索引 PUT myindex { "settings": { "analysis": { "filter": { "my_synonyms": { "type": "synonym_graph", "synonyms": [ "看月亮,吃月餅=>中秋節(jié)", "雙十一,雙11=>購物", "免費,免費版,不要錢的,無償" ] } }, "analyzer": { "my_analyzer": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "my_synonyms" ] } } } }, "mappings": { "properties": { "content": { "type": "text", "analyzer": "standard", "search_analyzer": "my_analyzer" } } } } 展示數據 "hits": { "total": 4, "max_score": 1.0, "hits": [ { "_index": "myindex", "_type": "_doc", "_id": "luiwhIsB4MmTaMc6fVt7", "_score": 1.0, "_source": { "content": "無償" } }, { "_index": "myindex", "_type": "_doc", "_id": "lOiwhIsB4MmTaMc6a1uu", "_score": 1.0, "_source": { "content": "中秋節(jié)" } }, { "_index": "myindex", "_type": "_doc", "_id": "p-iwhIsB4MmTaMc68GuR", "_score": 1.0, "_source": { "content": "不要錢的" } }, { "_index": "myindex", "_type": "_doc", "_id": "kuiwhIsB4MmTaMc6NFsw", "_score": 1.0, "_source": { "content": "購物" } } ] }
試查詢
測試查詢分詞
上面我們一直在創(chuàng)建索引時直接指定同義詞列表。 但是,當你有大量同義詞時,將它們全部添加到索引中會很麻煩。 更好的方法是將它們存儲在一個文件中,然后動態(tài)地將它們加載到索引中。 使用同義詞文件有很多好處,其中包括:
方便維護大量的同義詞。
可以被不同的索引使用。
可以在不關閉索引的情況下動態(tài)重新加載
我們將創(chuàng)建的同義詞文件稱為 synonyms.txt,但可以任意命名,把同義詞維護進去,加載到es中 默認去讀取config目錄下
使用同義詞文件創(chuàng)建一個新索引,請注意我們將同義詞篩選器標記為了updateable(可更新)
PUT myindex { "settings": { "analysis": { "filter": { "my_synonyms": { "type": "synonym_graph", "synonyms_path": "analysis/synonyms.txt", "updateable": true } }, "analyzer": { "my_analyzer": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "my_synonyms" ] } } } }, "mappings": { "properties": { "content": { "type": "text", "analyzer": "standard", "search_analyzer": "my_analyzer" } } } }
測試同義詞
GET /myindex/_search { "took": 0, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "myindex", "_id": "1", "_score": 1, "_source": { "content": "齊魯" } }, { "_index": "myindex", "_id": "2", "_score": 1, "_source": { "content": "淄博" } }, { "_index": "myindex", "_id": "3", "_score": 1, "_source": { "content": "戴眼鏡" } } ] } } 測試請求: GET /myindex/_search { "query": { "match": { "content": "4眼仔" } } } 響應: { "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 2.634553, "hits": [ { "_index": "myindex", "_id": "3", "_score": 2.634553, "_source": { "content": "戴眼鏡" } } ] } }
審核編輯:黃飛
-
分析器
+關注
關注
0文章
93瀏覽量
12598 -
代碼
+關注
關注
30文章
4858瀏覽量
69549 -
Elasticsearch
+關注
關注
0文章
30瀏覽量
2892
原文標題:ElasticSearch同義詞解析
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
linux安裝配置ElasticSearch之源碼安裝
MPLAB仿真程序崩潰
基于同義詞典的裝備信息集成應用研究
什么是跨導放大器(Transconductance Ampl

自然語言處理技術入門之基于關鍵詞生成文本的技術實現過程

哈工大PyLTP工具實踐:NLP任務中四大必備技術(附代碼)
ElasticSearch是什么?應用場景是什么?
射頻設計中“Bypass”和“Decoupling”的概念
淺談封裝基板和PCB的區(qū)別和關系
Elasticsearch保姆級入門

評論