日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

设置Elasticsearch N-Gram字分析器的过程

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设置Elasticsearch N-Gram字分析器的过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說n-gram是一個大話題,這是輕描淡寫的。 進行快速搜索,您會發現自己盯著語言學和語言模型,數據挖掘或特定蛋白質的分解對首次亮相文化的衰落所隱含的信息量。

好吧,我在跟那最后一個開玩笑。 但是,如果您是開發人員,希望使用Elasticsearch在應用程序中進行搜索,那么您很有可能需要以實用的方式使用n-gram分析器來進行某些搜索,并且可能需要一些針對性的信息才能獲得您的搜索以期望的方式表現。 在Elasticsearch中使用n-gram搜索可以做的事情有很多可能性。 該博客將使您開始思考如何在搜索中使用它們。

一個例子

首先,讓我們在這里縮小一下范圍。 在很多情況下,使用n-gram可能是指搜索句子,而您的gram則是指句子中的單詞。 但是對于今天,我想集中討論單個單詞的細分。 n元語法世界中的單個單詞稱為帶狀皰疹。

讓我們進一步縮小自己的范圍,假設我們想使用此搜索進行近似匹配。 在應用程序中,要搜索單詞(名稱,用戶名)或類似于單詞的數據(電話號碼),然后以與搜索單詞緊密匹配的形式向搜索者提供更多信息,這并不少見。 在這里,我們還希望部分匹配該單詞,而不是總是在前面,也不總是在結尾。

為了便于參考,請假裝我們有一個可以按名稱查找動物的站點。 也許這是獸醫辦公室的前線,而該辦公室希望首先以寵物的名字進行所有查找。 當然,您可能會發現自己Swift擴大了搜索范圍,以包括其他條件,但舉個例子,假設該辦公室的所有愛狗人士都瘋了,必須使用狗的名字。

分析儀

現在讓我們考慮一下分析儀的需求。 首先,我們已經知道我們想要某種n-gram。 我們想要部分匹配。 其次,上面我們已經決定要搜索單詞內的部分匹配項。 在這種情況下,這將僅在一定程度上,正如我們稍后將看到的那樣,但是現在我們可以確定我們需要NGram令牌生成器,而不是僅保留從令牌開頭開始保留n-gram的Edge NGram令牌生成器。

ElasticSearch Ngrams允許最小和最大克數。 從最小值開始,我們要匹配多少個名字? 好的,默認值為1,但是由于我們已經在處理單個單詞的數據,所以如果我們使用一個字母(一個字母組合),我們肯定會得到太多的結果。 實際上,同樣的事情也將適用于二元組。 但是,足夠多的人養著三個字母的寵物,我們最好不要走,否則我們可能永遠不會在搜索結果中返回名為“ Ace”和“ Rex”的幼犬。 現在我們知道我們的最小克數將是3。 最大克呢? 默認值為2,我們已經超過了最小值。 我們的目標是盡可能多地包含潛在的準確匹配項,但在索引大小存儲方面仍然不會發瘋。

考慮選擇一個過大的數字(例如52),并為3個字符至52個字符之間的所有可能可能性分解名稱,您會發現隨著數據的增長,這很快就會加起來。 這里有些妥協,因為在某些情況下,您最終可能會排除超出最大語法的數據。

解決此排除問題的方法有兩種,一種是包含您的字段的第二個映射并使用其他分析器(例如標準分析器),或者使用第二種映射并受益于精確匹配的速度和準確性字詞查詢。

在我們的案例中,我們將利用將單獨的分析器用于搜索和索引的功能。 我們假設最大值之后的數據與我們的搜索無關,在這種情況下,它極有可能與搜索無關。

因此,這里我們創建索引,然后設置自定義分析器。 關于整體內容,這里的示例將有些簡單,但是我希望它們有助于理解。

注意:稍微偏離主題,但是在現實生活中,您將需要以一種更可重用的方式進行操作,例如模板,以便您可以輕松使用別名和版本并更新索引,但是為此例如,我只是展示了卷曲索引創建的最簡單設置。

這是我們的第一個分析器,創建一個自定義分析器,并使用ngram_tokenizer和我們的設置。 如果您在這里,則可能知道這一點,但是令牌生成器用于將字符串分解為術語或令牌流。 您可以根據需要在此處添加空格和許多其他選項:

curl -XPUT 'localhost:9200/searchpets' -d '{"settings" : {"analysis" : {"analyzer" : {"ngram_analyzer" : {"tokenizer" : "ngram_tokenizer"}},"tokenizer" : {"ngram_tokenizer" : {"type" : "nGram","min_gram" : "3","max_gram" : "8"}}}}}'

我們對此索引創建的響應為{“ acknowledged”:true}。 優秀的。

好了,既然有了索引,使用新的分析儀時數據將是什么樣?

curl -XGET'localhost:9200/searchpets/_analyze?analyzer=ngram_analyzer' -d 'Raven'

響應是:

{"tokens":[{"token":"Rav","start_offset":0,"end_offset":3,"type":"word","position":1},{"token":"Rave","start_offset":0,"end_offset":4,"type":"word","position":2},{"token":"Raven","start_offset":0,"end_offset":5,"type":"word","position":3},{"token":"ave","start_offset":1,"end_offset":4,"type":"word","position":4},{"token":"aven","start_offset":1,"end_offset":5,"type":"word","position":5},{"token":"ven","start_offset":2,"end_offset":5,"type":"word","position":6}]}

這是合理的。 所有令牌都在3到5個字符之間生成(因為單詞少于8個,所以很明顯)。

好的,太好了,現在將其應用于字段。 而且,是的,您絕對可以一步一步完成所有操作,我只是將其分解。

$ curl -XPUT 'http://localhost:9200/searchpets/_mapping/pet' -d ' {"pet": {"properties": {"name": {"type": "string","analyzer": "ngram_analyzer"}}} } '

我們在現場測試分析:

curl -XGET 'http://localhost:9200/searchpets/_analyze?field=pet.name' -d 'Raven';

再一次,我們得到了我們期望的結果:

{"tokens":[{"token":"Rav","start_offset":0,"end_offset":3,"type":"word","position":1},{"token":"Rave","start_offset":0,"end_offset":4,"type":"word","position":2},{"token":"Raven","start_offset":0,"end_offset":5,"type":"word","position":3},{"token":"ave","start_offset":1,"end_offset":4,"type":"word","position":4},{"token":"aven","start_offset":1,"end_offset":5,"type":"word","position":5},{"token":"ven","start_offset":2,"end_offset":5,"type":"word","position":6}]}

現在,假設我已經繼續并在此處添加了一些記錄,并針對以下內容運行簡單的匹配查詢:{“ query”:{“ match”:{“ name”:“ Pegasus”}}}。

利用我的數據,我們可以得到以下信息:

"hits": {"total": 2,"max_score": 0.29710895,"hits": [{"_index": "searchpets","_type": "pet","_id": "3","_score": 0.29710895,"_source": {"name": "Pegasus"}},{"_index": "searchpets","_type": "pet","_id": "2","_score": 0.0060450486,"_source": {"name": "Degas"}}] } }

我們獲得最接近的匹配以及可能實際上是用戶正在尋找的關閉選項。

定制分析儀

好的,但是現在我們正在使用一個非常基本的分析器案例。 如果我們需要一個自定義分析器,以便能夠處理在搜索和索引上需要不同的分詞器的情況,該怎么辦? 如果我們想用關鍵字標記器來限制搜索怎么辦?

讓我們對其進行更改,以使用針對n元語法的過濾器來設置自定義分析器。 由于我們在下一次搜索中使用了tokenizer關鍵字和match查詢,因此在顯示的這些測試用例中,此處的結果實際上與之前的結果相同,但是您會注意到它們的評分方式有所不同。

$ curl -XPUT 'localhost:9200/searchpets' -d '{"settings": {"analysis": {"analyzer": {"namegrams": {"type": "custom","tokenizer": "keyword","filter": ["ngrams_filter"]}},"filter": {"ngrams_filter": {"type": "ngram","min_gram": 3,"max_gram": 8}}}} }'

現在,我們像以前一樣添加映射和數據:

curl -XPUT 'http://localhost:9200/searchpets/_mapping/pet' -d ' {"pet": {"properties": {"name": {"type": "string","analyzer": "namegrams"}}} } '

我運行另一個匹配查詢:{“ query”:{“ match”:{“ name”:“ Pegasus”}}},響應為:

hits": { "total": 2, "max_score": 1.1884358, "hits": [{"_index": "searchpets","_type": "pet","_id": "2","_score": 1.1884358,"_source": {"name": "Pegasus"}},{"_index": "searchpets","_type": "pet","_id": "3","_score": 0.08060065,"_source": {"name": "Degas"}} ] }

因此,我們進行了設置,并基于關鍵字標記器和n-grams過濾器獲得了期望的結果和評分。 假設我們正在做一些更復雜的查詢。 我們可能還添加了其他一些過濾器或標記器。 情況看起來不錯,對嗎? 好吧,差不多。

我前面提到的所有這些要記住的一個小因素。 我們有一個最大的8克。 那么,當我們擁有一個超過該大小的名稱作為搜索條件時,會發生什么呢? 好吧,根據您的搜索,您可能不會獲得任何數據。

您可能沒有想到這里會發生什么! 您如何避免這種情況? 一種方法是使用不同的index_analyzer和search_analyzer。 拆分這些內容可以使您更好地控制搜索。

因此,假設我們對原始搜索所說的一切都是真實的,那么您的最終設置將是這樣。 我不會深入探討查詢本身的詳細信息,但是我們將假定它將使用指定的search_analyzer(我建議閱讀ES文檔中有關如何選擇分析器進行搜索的層次結構)。

注意:這里的search_ngram分析器上的小寫標記器會標準化標記文本,因此所有數字都將被剝離。 此示例適用于此示例,但是使用不同的數據可能會導致意外的結果。

$ curl -XPUT 'localhost/searchpets' -d '{"settings": {"analysis": {"analyzer": {"namegrams": {"type": "custom","tokenizer": "keyword","filter": ["ngrams_filter"]},"search_ngram": {"type": "custom","tokenizer": "lowercase","filter": ["truncate_filter"]}},"filter": {"ngrams_filter": {"type": "ngram","min_gram": 3,"max_gram": 8},"truncate_filter": {"type": "truncate","length": 8}}}} } ’

然后,最后,我們再次設置映射:

curl -XPUT 'http://localhost:9200/searchpets/_mapping/pet' -d ' {"pet": {"properties": {"name": {"type": "string","index_analyzer": "namegrams","search_analyzer": "search_trigram"}}} }'

最后的想法

那里有。 但是,這使得假設超過8個字符的數據不太重要。 如果您要擁有比最大克數更大的數據,并且類似的數據,您可能會發現自己需要進一步調整。

在Elastisearch中使用n-gram搜索可以做的事情有很多可能性。 我希望這可以讓您開始思考如何在搜索中使用它們。

翻譯自: https://www.javacodegeeks.com/2015/11/anatomy-of-setting-up-an-elasticsearch-n-gram-word-analyzer.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的设置Elasticsearch N-Gram字分析器的过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。