搜索引擎會對文檔和查詢進(jìn)行分析并將其拆解為最小的單元(通常稱為詞元,實際上就是抽象的符號)。搜索時,匹配過程會使用簡單字串相似度,所以如果查詢中有一些十分微小的拼寫錯誤(例如“hous”,只比“house”少一個字母 e)或者使用名詞的復(fù)數(shù)形式(“houses”),即使文檔中包含名詞的單數(shù)形式(“house”),搜索引擎也不會匹配到這份文檔。詞干提取器或模糊查詢等工具雖然可以解決一些最常見的此類問題,但是它們并不能消除相關(guān)聯(lián)的概念或想法之間的差異,也不能將文檔或查詢中稍有不同的單詞用法視為等同。
這時同義詞就派上了大用場。同義詞的英文 synonym 來自于希臘語,分別是前綴σ?ν(syn,表示“一起”)和?νομα(ónoma,表示“名稱”)。從它的詞源可以看出,同義詞表示的是在同一語言或領(lǐng)域中具有完全或基本相同意思的不同詞語。實際上,同義詞的范圍非常廣泛,包括一般同義詞(“疲勞”和“困倦”)、縮寫(英鎊的兩種寫法“l(fā)b.”和“pound”)、電商搜索中產(chǎn)品的不同拼寫(“iPod”和“i-Pod”)、細(xì)微的語言差異(例如均表示電梯的英式英語“l(fā)ift”和美式英語“elevator”)、專業(yè)用詞和普通用詞(例如“犬”和“狗”),甚至單純表示同一概念的兩種方式(“宇宙”和“太空”)。通過提供恰當(dāng)?shù)耐x詞規(guī)則,搜索工程師能夠就哪些詞在各自領(lǐng)域內(nèi)具有相似意思并應(yīng)該采取相似處理方法提供相關(guān)信息。
同義詞用于提高搜索質(zhì)量并擴(kuò)大匹配范圍。 例如,搜索oil的用戶可能希望找到包含原油或石油的文檔,盡管這三個詞完全不同。
在我們的很多情況下,我們希望在搜索時,有時能夠使用一個詞的同義詞來進(jìn)行搜索,這樣我們能搜索出來更多相關(guān)的內(nèi)容。我們可以通過 text analysis 來幫助我們形成同義詞
索引時使用同義詞和搜索時使用同義詞的對比
同義詞在分析器中使用,其既可在索引時使用,也可在搜索時使用。關(guān)于在 Elasticsearch 中如何使用同義詞篩選器,最常見的問題之一就是:“我應(yīng)該索引時使用,還是搜索時使用,還是同時都用?” 我們首先看一下在索引時應(yīng)用同義詞篩選。這意味著會在索引后的文檔中對字詞進(jìn)行一次性替換或擴(kuò)展,結(jié)果將一直保存在搜索索引中。
索引時使用同義詞有幾個劣勢:
由于必須對所有同義詞進(jìn)行索引,所以索引規(guī)模會變大。
搜索得分(依賴于字詞統(tǒng)計數(shù)據(jù))可能會受影響,因為同義詞也會計算在內(nèi),所以不常見單詞的統(tǒng)計數(shù)據(jù)會存在偏差。
除非進(jìn)行重新索引,否則無法針對既有文檔更改同義詞規(guī)則。
最后兩條尤其是巨大劣勢。索引時應(yīng)用同義詞的唯一潛在好處是性能好,因為您在前期已費心完成了擴(kuò)展過程,所以無需再在每次查詢時完成一遍擴(kuò)展過程,這有可能致使需要與更多的字詞進(jìn)行匹配。然而這一點在實踐中通常并非真正的問題。
相反,在搜索時所用的分析工具中使用同義詞則可以避免很多上述問題:
索引規(guī)模不受影響。
語料庫中的字詞統(tǒng)計數(shù)據(jù)保持不變。
如需變更同義詞規(guī)則,無需對文檔進(jìn)行重新索引。
這些優(yōu)勢通常要高出唯一的劣勢,即每次查詢時都必須執(zhí)行同義詞擴(kuò)展操作,這有可能導(dǎo)致需要匹配更多字詞。不僅如此,搜索時擴(kuò)展同義詞還能夠允許使用更加復(fù)雜的synonym_graph詞元篩選器,這一工具能夠正確處理多單詞同義詞,并且僅可在搜索分析器中使用。
一般而言,搜索時使用同義詞的優(yōu)勢通常要高于索引時使用同義詞可能實現(xiàn)的微小性能改進(jìn)。
然而,如果在搜索時使用同義詞,過去還需要注意另外一個問題。盡管更改同義詞規(guī)則不需要對文檔進(jìn)行重新索引,但是如要更改的話,您必須暫時關(guān)閉再重新打開索引。這一點很有必要,因為分析器在下列時候才會創(chuàng)建實例:創(chuàng)建索引時,重啟節(jié)點時,以及重新打開已關(guān)閉的索引時。為了讓對同義詞規(guī)則文件所做的變更對索引可見,用戶必須首先在所有節(jié)點上更新文件,然后再關(guān)閉并重新打開索引。但是這個問題已經(jīng)得以解決。
在查詢時對詞進(jìn)行同義詞解析
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" } } } } 展示數(shù)據(jù) "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)建索引時直接指定同義詞列表。 但是,當(dāng)你有大量同義詞時,將它們?nèi)刻砑拥剿饕袝苈闊?更好的方法是將它們存儲在一個文件中,然后動態(tài)地將它們加載到索引中。 使用同義詞文件有很多好處,其中包括:
方便維護(hù)大量的同義詞。
可以被不同的索引使用。
可以在不關(guān)閉索引的情況下動態(tài)重新加載
我們將創(chuàng)建的同義詞文件稱為 synonyms.txt,但可以任意命名,把同義詞維護(hù)進(jìn)去,加載到es中 默認(rèn)去讀取config目錄下
使用同義詞文件創(chuàng)建一個新索引,請注意我們將同義詞篩選器標(biāo)記為了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眼仔" } } } 響應(yīng): { "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": "戴眼鏡" } } ] } }
審核編輯:黃飛
-
分析器
+關(guān)注
關(guān)注
0文章
93瀏覽量
12562 -
代碼
+關(guān)注
關(guān)注
30文章
4830瀏覽量
69091 -
Elasticsearch
+關(guān)注
關(guān)注
0文章
30瀏覽量
2855
原文標(biāo)題:ElasticSearch同義詞解析
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
linux安裝配置ElasticSearch之源碼安裝
MPLAB仿真程序崩潰
基于同義詞典的裝備信息集成應(yīng)用研究
什么是跨導(dǎo)放大器(Transconductance Ampl
![什么是跨導(dǎo)放大器(Transconductance Ampl](https://file1.elecfans.com//web2/M00/A4/C8/wKgZomUMNayAU0kfAAAo-2YbSa8444.gif)
自然語言處理技術(shù)入門之基于關(guān)鍵詞生成文本的技術(shù)實現(xiàn)過程
![自然語言處理技術(shù)入門之基于關(guān)鍵<b class='flag-5'>詞</b>生成文本的技術(shù)實現(xiàn)過程](https://file1.elecfans.com//web2/M00/A7/1D/wKgZomUMQniAUw7HAAAYAGMnKsQ688.png)
哈工大PyLTP工具實踐:NLP任務(wù)中四大必備技術(shù)(附代碼)
EDA增強(qiáng)數(shù)據(jù)的方法
ElasticSearch是什么?應(yīng)用場景是什么?
射頻設(shè)計中“Bypass”和“Decoupling”的概念
淺談封裝基板和PCB的區(qū)別和關(guān)系
Elasticsearch保姆級入門
![<b class='flag-5'>Elasticsearch</b>保姆級入門](https://file1.elecfans.com/web2/M00/A2/A9/wKgaomTxkkmAXaHeAABNlxc0RJE051.png)
評論