自動補全
定義映射字段
下面的請求定義了一個名為 “book” 的 Elasticsearch 索引,其中包含一個 具有 “text” 數(shù)據(jù)類型和 “standard” 分析器且名為 “title” 的字段。此字段用于處理書籍標題的文本數(shù)據(jù)。定義了名為 “suggest” 的 “completion” 子字段,用于支持實時搜索建議的自動補全功能。
PUT /book
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "standard",
"fields": {
"suggest": {
"type": "completion"
}
}
}
}
}
}
建立索引
增加測試數(shù)據(jù)
PUT /book/_doc/1
{
"title":"散文精選"
}
PUT /book/_doc/2
{
"title":"三國演義"
}
PUT /book/_doc/3
{
"title":"三體二:黑暗森林"
}
測試自動補全
POST /book/_search
{
"suggest": {
"book-suggest": {
"prefix": "三",
"completion": {
"field": "title.suggest",
"size": 5
}
}
}
}
查詢結(jié)果如下:
自動糾錯
查詢語句
使用 “fuzzy” 參數(shù)來實現(xiàn)模糊匹配,即允許在查詢中包含一定數(shù)量的拼寫錯誤??梢愿鶕?jù)需要調(diào)整 “fuzziness” 的值,以容忍更多或更少的拼寫錯誤
POST /book/_search
{
"suggest": {
"book-suggest": {
"prefix": "三國眼",
"completion": {
"field": "title.suggest",
"size": 5,
"fuzzy": {
"fuzziness": 2
}
}
}
}
}
查詢結(jié)果
拼音補全與繁簡轉(zhuǎn)換
拼音分詞器(pinyin analyzer)通常需要自行引入,因為它不是 Elasticsearch 的默認分詞器??梢允褂?Elasticsearch 的插件來引入 pinyin 分詞器,以便在索引中使用它。
安裝 elasticsearch-analysis-pinyin 插件
選擇與自己版本一致的版本,插件地址:
https://github.com/medcl/elasticsearch-analysis-pinyin/releases
elasticsearch-analysis-pinyin分詞器目前沒有下載即可使用的安裝包,需要自己下載源碼進行編譯??梢栽陧椖磕夸?code>elasticsearch-analysis-pinyin\target\releases看到編譯后的結(jié)果elasticsearch-analysis-pinyin-7.17.11.zip
然后在es的安裝目錄下plugins目錄下新建pinyin目錄,并將解壓后的文件復(fù)制到該目錄下
重啟es,啟動日志中已經(jīng)加載了拼音插件
定義索引與映射
PUT /book_pinyin
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"pinyin_analyzer": {
"tokenizer": "my_pinyin"
}
},
"tokenizer": {
"my_pinyin": {
"type": "pinyin",
"keep_separate_first_letter": false,
"keep_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"lowercase": true,
"remove_duplicated_term": true
}
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "standard",
"fields": {
"suggest": {
"type": "completion",
"analyzer": "pinyin_analyzer"
}
}
}
}
}
}
建立拼音自動補全索引
測試拼音自動補全
- 增加測試數(shù)據(jù)
PUT /book_pinyin/_doc/1 { "title":"散文精選" } PUT /book_pinyin/_doc/2 { "title":"三國演義" } PUT /book_pinyin/_doc/3 { "title":"三體二:黑暗森林" } PUT /book_pinyin/_doc/4 { "title":"三國演義" }
- 執(zhí)行檢索
POST /book_pinyin/_search
{
"suggest": {
"book-suggest": {
"prefix": "san",
"completion": {
"field": "title.suggest",
"size": 5,
"fuzzy": {
"fuzziness": 2
}
}
}
}
}
測試繁簡轉(zhuǎn)換自動補全
我們這里實現(xiàn)了拼音轉(zhuǎn)換后已經(jīng)實現(xiàn)了繁簡轉(zhuǎn)換
代碼實現(xiàn)
demo結(jié)構(gòu)
簡單創(chuàng)建一個springboot項目,使用html實現(xiàn)了一個簡單的demo
實現(xiàn)效果如下:
demo獲取
自動補全-官方文檔
Completion Suggester 是 Elasticsearch 提供的自動補全和搜索即時提示
的功能。這是一種導(dǎo)航功能,可引導(dǎo)用戶在鍵入時找到相關(guān)結(jié)果,從而提高搜索準確性。請注意,它不適用于拼寫校正或類似 term 或 phrase suggesters 的“您是不是要這樣說”功能。
理想情況下,自動補全功能應(yīng)該與用戶輸入同步,以提供與用戶已經(jīng)鍵入的內(nèi)容相關(guān)的即時反饋。因此,Completion Suggester 針對速度進行了優(yōu)化。該建議器使用數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)快速查找,但構(gòu)建和存儲這些數(shù)據(jù)結(jié)構(gòu)是昂貴的,并且存儲在內(nèi)存中
。
映射(Mapping)
要使用此功能,需要為字段指定一個特殊的映射,以便為快速補全建議索引字段值。
PUT music
{
"mappings": {
"properties": {
"suggest": {
"type": "completion"
},
"title": {
"type": "keyword"
}
}
}
}
映射支持以下參數(shù):
- analyzer:用于索引的分析器,默認為 simple。
- search_analyzer:用于搜索的分析器,默認為與 “analyzer” 相同。
- preserve_separators:保留分隔符,默認為 true。如果禁用,您可能會找到以 “Foo Fighters” 開頭的字段,如果建議輸入為 “foof”。
- preserve_position_increments:啟用位置增量,默認為 true。如果禁用并使用停用詞分析器,建議輸入 “b” 時,您可能會得到以 “The Beatles” 開頭的字段。請注意:如果能夠豐富數(shù)據(jù),也可以通過索引兩個輸入 “Beatles” 和 “The Beatles” 來實現(xiàn),無需更改簡單分析器。
- max_input_length:限制單個輸入的長度,默認為 50 個 UTF-16 代碼點。此限制僅在索引時使用,以減少每個輸入字符串的字符總數(shù),以防止底層數(shù)據(jù)結(jié)構(gòu)膨脹。在大多數(shù)情況下,默認值不會對使用產(chǎn)生影響,因為前綴建議很少會增長到比一小撮字符長的前綴。
索引(Indexing)
索引建議與索引其他字段的數(shù)據(jù)相似。建議由輸入和可選的權(quán)重屬性組成。輸入是建議查詢中預(yù)期匹配的文本,而權(quán)重確定建議的評分。索引建議的示例如下:
PUT music/_doc/1?refresh
{
"suggest" : {
"input": [ "Nevermind", "Nirvana" ],
"weight" : 34
}
}
支持以下參數(shù):
- input:要存儲的輸入,可以是字符串數(shù)組或僅為字符串。此字段是必需的。該值不能包含以下 UTF-16 控制字符:\u0000(null)、\u001f(信息分隔符一)、\u001e(信息分隔符二)。
- weight:正整數(shù)或包含正整數(shù)的字符串,用于定義權(quán)重,可用于排列建議。此字段是可選的。
您還可以使用以下簡化形式,但請注意,在簡化形式中不能為建議指定權(quán)重。
PUT music/_doc/1?refresh
{
"suggest" : [ "Nevermind", "Nirvana" ]
}
查詢(Querying)
建議查詢與通常查詢相似,不同之處在于您必須將建議類型指定為 “completion”。建議是近實時的,這意味著通過 “refresh” 可以立即顯示新建議,已刪除的文檔永遠不會被顯示。
下面是一個查詢的示例:
POST music/_search?pretty
{
"suggest": {
"song-suggest": {
"prefix": "nir",
"completion": {
"field": "suggest"
}
}
}
}
在查詢結(jié)果中,Elasticsearch 將返回與用戶輸入前綴匹配的建議。您可以使用這些建議為用戶提供搜索建議。
自動補全建議還支持模糊查詢和正則表達式查詢,以處理用戶輸入中的拼寫錯誤或其他變化
。這些查詢可以通過 "fuzzy"
和 "regex"
參數(shù)進行配置。
請注意,默認情況下,“_source” 元數(shù)據(jù)字段是啟用的,以便返回建議的源數(shù)據(jù)。建議的權(quán)重通過 “_score” 返回。默認情況下,建議返回完整文檔的 “_source”。如果 _source 大小會影響性能,可以使用源過濾來減小 _source 大小。
以上是使用 Completion Suggester 的基本概述。根據(jù)需求,您可以進一步配置和定制自動補全建議。 Completion Suggester 可以考慮索引中的所有文檔。對于如何查詢文檔子集的詳細信息,請查看上下文建議(Context Suggester)。
如果一個建議查詢跨越多個分片,建議會在兩個階段執(zhí)行,最后一個階段從分片中獲取相關(guān)文檔,這意味著當建議跨多個分片時,在單個分片上執(zhí)行建議請求會更有效,因為建議涵蓋多個分片時需要執(zhí)行文檔提取開銷。為了獲得最佳的自動補全性能,建議將自動補全索引到單個分片索引中
。如果由于分片大小而導(dǎo)致堆內(nèi)存使用過高,仍建議將索引分成多個分片,而不是為了優(yōu)化自動補全性能。
跳過重復(fù)建議
查詢可能會返回來自不同文檔的重復(fù)建議。通過將 "skip_duplicates" 設(shè)置為 true
,可以修改此行為。設(shè)置為 true 時,此選項會減慢搜索
,因為需要訪問更多的建議以查找前 N 個。
模糊查詢(自動糾錯)
Completion Suggester 還支持模糊查詢,這意味著您可以在搜索中出現(xiàn)拼寫錯誤,仍然可以獲得結(jié)果。
例如,以下是一個使用模糊查詢的查詢示例:
POST music/_search?pretty
{
"suggest": {
"song-suggest": {
"prefix": "nor",
"completion": {
"field": "suggest",
"fuzzy": {
"fuzziness": 2
}
}
}
}
}
模糊查詢會根據(jù)查詢前綴與建議前綴的最長匹配來對建議進行評分。模糊查詢支持各種參數(shù),如 “fuzziness”、“transpositions”、“min_length”、“prefix_length” 和 “unicode_aware”,可以用于調(diào)整匹配的寬松程度和性能。
正則表達式查詢
Completion Suggester 還支持正則表達式查詢,這意味著您可以使用正則表達式來表示前綴。
例如,以下是一個使用正則表達式查詢的示例:文章來源:http://www.zghlxwxcb.cn/news/detail-729513.html
POST music/_search?pretty
{
"suggest": {
"song-suggest": {
"regex": "n[ever|i]r",
"completion": {
"field": "suggest"
}
}
}
}
正則表達式查詢可以包含各種參數(shù),如 “flags” 和 “max_determinized_states”,以用于調(diào)整匹配的方式和性能。文章來源地址http://www.zghlxwxcb.cn/news/detail-729513.html
到了這里,關(guān)于Elasticsearch實現(xiàn)檢索詞自動補全(檢索詞補全,自動糾錯,拼音補全,繁簡轉(zhuǎn)換) 包含demo的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!