搜索引擎會(huì)對(duì)文檔和查詢進(jìn)行分析并將其拆解為最小的單元(通常稱為詞元,實(shí)際上就是抽象的符號(hào))。搜索時(shí),匹配過(guò)程會(huì)使用簡(jiǎn)單字串相似度,所以如果查詢中有一些十分微小的拼寫(xiě)錯(cuò)誤(例如“hous”,只比“house”少一個(gè)字母 e)或者使用名詞的復(fù)數(shù)形式(“houses”),即使文檔中包含名詞的單數(shù)形式(“house”),搜索引擎也不會(huì)匹配到這份文檔。詞干提取器或模糊查詢等工具雖然可以解決一些最常見(jiàn)的此類問(wèn)題,但是它們并不能消除相關(guān)聯(lián)的概念或想法之間的差異,也不能將文檔或查詢中稍有不同的單詞用法視為等同。
這時(shí)同義詞就派上了大用場(chǎng)。同義詞的英文 synonym 來(lái)自于希臘語(yǔ),分別是前綴σ?ν(syn,表示“一起”)和?νομα(ónoma,表示“名稱”)。從它的詞源可以看出,同義詞表示的是在同一語(yǔ)言或領(lǐng)域中具有完全或基本相同意思的不同詞語(yǔ)。實(shí)際上,同義詞的范圍非常廣泛,包括一般同義詞(“疲勞”和“困倦”)、縮寫(xiě)(英鎊的兩種寫(xiě)法“l(fā)b.”和“pound”)、電商搜索中產(chǎn)品的不同拼寫(xiě)(“iPod”和“i-Pod”)、細(xì)微的語(yǔ)言差異(例如均表示電梯的英式英語(yǔ)“l(fā)ift”和美式英語(yǔ)“elevator”)、專業(yè)用詞和普通用詞(例如“犬”和“狗”),甚至單純表示同一概念的兩種方式(“宇宙”和“太空”)。通過(guò)提供恰當(dāng)?shù)耐x詞規(guī)則,搜索工程師能夠就哪些詞在各自領(lǐng)域內(nèi)具有相似意思并應(yīng)該采取相似處理方法提供相關(guān)信息。
同義詞用于提高搜索質(zhì)量并擴(kuò)大匹配范圍。 例如,搜索oil的用戶可能希望找到包含原油或石油的文檔,盡管這三個(gè)詞完全不同。
在我們的很多情況下,我們希望在搜索時(shí),有時(shí)能夠使用一個(gè)詞的同義詞來(lái)進(jìn)行搜索,這樣我們能搜索出來(lái)更多相關(guān)的內(nèi)容。我們可以通過(guò) text analysis 來(lái)幫助我們形成同義詞
索引時(shí)使用同義詞和搜索時(shí)使用同義詞的對(duì)比
同義詞在分析器中使用,其既可在索引時(shí)使用,也可在搜索時(shí)使用。關(guān)于在 Elasticsearch 中如何使用同義詞篩選器,最常見(jiàn)的問(wèn)題之一就是:“我應(yīng)該索引時(shí)使用,還是搜索時(shí)使用,還是同時(shí)都用?” 我們首先看一下在索引時(shí)應(yīng)用同義詞篩選。這意味著會(huì)在索引后的文檔中對(duì)字詞進(jìn)行一次性替換或擴(kuò)展,結(jié)果將一直保存在搜索索引中。
索引時(shí)使用同義詞有幾個(gè)劣勢(shì):
由于必須對(duì)所有同義詞進(jìn)行索引,所以索引規(guī)模會(huì)變大。
搜索得分(依賴于字詞統(tǒng)計(jì)數(shù)據(jù))可能會(huì)受影響,因?yàn)橥x詞也會(huì)計(jì)算在內(nèi),所以不常見(jiàn)單詞的統(tǒng)計(jì)數(shù)據(jù)會(huì)存在偏差。
除非進(jìn)行重新索引,否則無(wú)法針對(duì)既有文檔更改同義詞規(guī)則。
最后兩條尤其是巨大劣勢(shì)。索引時(shí)應(yīng)用同義詞的唯一潛在好處是性能好,因?yàn)槟谇捌谝奄M(fèi)心完成了擴(kuò)展過(guò)程,所以無(wú)需再在每次查詢時(shí)完成一遍擴(kuò)展過(guò)程,這有可能致使需要與更多的字詞進(jìn)行匹配。然而這一點(diǎn)在實(shí)踐中通常并非真正的問(wèn)題。
相反,在搜索時(shí)所用的分析工具中使用同義詞則可以避免很多上述問(wèn)題:
索引規(guī)模不受影響。
語(yǔ)料庫(kù)中的字詞統(tǒng)計(jì)數(shù)據(jù)保持不變。
如需變更同義詞規(guī)則,無(wú)需對(duì)文檔進(jìn)行重新索引。
這些優(yōu)勢(shì)通常要高出唯一的劣勢(shì),即每次查詢時(shí)都必須執(zhí)行同義詞擴(kuò)展操作,這有可能導(dǎo)致需要匹配更多字詞。不僅如此,搜索時(shí)擴(kuò)展同義詞還能夠允許使用更加復(fù)雜的synonym_graph詞元篩選器,這一工具能夠正確處理多單詞同義詞,并且僅可在搜索分析器中使用。
一般而言,搜索時(shí)使用同義詞的優(yōu)勢(shì)通常要高于索引時(shí)使用同義詞可能實(shí)現(xiàn)的微小性能改進(jìn)。
然而,如果在搜索時(shí)使用同義詞,過(guò)去還需要注意另外一個(gè)問(wèn)題。盡管更改同義詞規(guī)則不需要對(duì)文檔進(jìn)行重新索引,但是如要更改的話,您必須暫時(shí)關(guān)閉再重新打開(kāi)索引。這一點(diǎn)很有必要,因?yàn)榉治銎髟谙铝袝r(shí)候才會(huì)創(chuàng)建實(shí)例:創(chuàng)建索引時(shí),重啟節(jié)點(diǎn)時(shí),以及重新打開(kāi)已關(guān)閉的索引時(shí)。為了讓對(duì)同義詞規(guī)則文件所做的變更對(duì)索引可見(jiàn),用戶必須首先在所有節(jié)點(diǎn)上更新文件,然后再關(guān)閉并重新打開(kāi)索引。但是這個(gè)問(wèn)題已經(jīng)得以解決。
在查詢時(shí)對(duì)詞進(jìn)行同義詞解析
es操作版本8.8.0
創(chuàng)建索引 PUT myindex { "settings": { "analysis": { "filter": { "my_synonyms": { "type": "synonym_graph", "synonyms": [ "看月亮,吃月餅=>中秋節(jié)", "雙十一,雙11=>購(gòu)物", "免費(fèi),免費(fèi)版,不要錢的,無(wú)償" ] } }, "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": "無(wú)償" } }, { "_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": "購(gòu)物" } } ] }
試查詢
測(cè)試查詢分詞
上面我們一直在創(chuàng)建索引時(shí)直接指定同義詞列表。 但是,當(dāng)你有大量同義詞時(shí),將它們?nèi)刻砑拥剿饕袝?huì)很麻煩。 更好的方法是將它們存儲(chǔ)在一個(gè)文件中,然后動(dòng)態(tài)地將它們加載到索引中。 使用同義詞文件有很多好處,其中包括:
方便維護(hù)大量的同義詞。
可以被不同的索引使用。
可以在不關(guān)閉索引的情況下動(dòng)態(tài)重新加載
我們將創(chuàng)建的同義詞文件稱為 synonyms.txt,但可以任意命名,把同義詞維護(hù)進(jìn)去,加載到es中 默認(rèn)去讀取config目錄下
使用同義詞文件創(chuàng)建一個(gè)新索引,請(qǐ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" } } } }
測(cè)試同義詞
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": "戴眼鏡" } } ] } } 測(cè)試請(qǐng)求: 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瀏覽量
12529 -
代碼
+關(guān)注
關(guān)注
30文章
4802瀏覽量
68744 -
Elasticsearch
+關(guān)注
關(guān)注
0文章
29瀏覽量
2842
原文標(biāo)題:ElasticSearch同義詞解析
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論