[Elasticsearch] 部分匹配 (三) - 查询期间的即时搜索
本章翻譯自Elasticsearch官方指南的Partial Matching一章。
查詢期間的即時(shí)搜索(Query-time Search-as-you-type)
如今讓我們來(lái)看看前綴匹配可以怎樣幫助全文搜索。
用戶已經(jīng)習(xí)慣于在完畢輸入之前就看到搜索結(jié)果了 - 這被稱為即時(shí)搜索(Instant Search, 或者Search-as-you-type)。這不僅讓用戶可以在更短的時(shí)間內(nèi)看到搜索結(jié)果。也可以引導(dǎo)他們得到真實(shí)存在于我們的索引中的結(jié)果。
比方。假設(shè)用戶輸入了johnnie walker bl,我們會(huì)在用戶輸入完畢前顯示Johnnie Walker Black Label和Johnnie Walker Blue Label相關(guān)的結(jié)果。
和往常一樣,有多種方式可以達(dá)到我們的目的。首先我們從最簡(jiǎn)單的方式開始。你不須要以不論什么的方式準(zhǔn)備你的數(shù)據(jù),就行在不論什么全文字段(Full-text Field)上實(shí)現(xiàn)即時(shí)搜索。
在短語(yǔ)匹配(Phrase Matching)中。我們介紹了match_phrase查詢,它可以依據(jù)單詞順序來(lái)匹配全部的指定的單詞。對(duì)于查詢期間的即時(shí)搜索,我們可以使用該查詢的一個(gè)特例,即match_phrase_prefix查詢:
{"match_phrase_prefix" : {"brand" : "johnnie walker bl"} }次查詢和match_phrase查詢的工作方式基本同樣。除了它會(huì)將查詢字符串中的最后一個(gè)單詞當(dāng)做一個(gè)前綴。換言之,前面的樣例會(huì)查找下面內(nèi)容:
- johnnie
- 緊接著的是walker
- 緊接著的是以bl開頭的單詞
假設(shè)我們將該查詢通過(guò)validate-query API運(yùn)行,它會(huì)產(chǎn)生例如以下的解釋:
"johnnie walker bl*"
和match_phrase查詢一樣。它可以接受一個(gè)slop參數(shù)(參見這里)來(lái)讓單詞間的順序和相對(duì)位置不那么嚴(yán)格:
{"match_phrase_prefix" : {"brand" : {"query": "walker johnnie bl", "slop": 10}} }可是,查詢字符串中的最后一個(gè)單詞總是會(huì)被當(dāng)做一個(gè)前綴。
在之前介紹prefix查詢的時(shí)候,我們談到了prefix查詢的一些須要注意的地方 - prefix查詢時(shí)怎樣消耗資源的。在使用match_phrase_prefix查詢的時(shí)候,也面臨著相同的問(wèn)題。一個(gè)前綴a你可以匹配很許多的詞條。匹配這么多的詞條不僅會(huì)消耗許多資源,同一時(shí)候?qū)τ谟脩舳砸彩菦]有多少用處的。
我們能夠通過(guò)將參數(shù)max_expansions設(shè)置成一個(gè)合理的數(shù)值來(lái)限制前綴擴(kuò)展(Prefix Expansion)的影響,比方50:
{"match_phrase_prefix" : {"brand" : {"query": "johnnie walker bl","max_expansions": 50}} }max_expansions參數(shù)會(huì)控制可以匹配該前綴的詞條的數(shù)量。它會(huì)找到首個(gè)以bl開頭的詞條然后開始收集(以字母表順序)直到全部以bl開頭的詞條都被遍歷了或者得到了比max_expansions很多其它的詞條。
不要忘了在用戶每敲入一個(gè)字符的時(shí)候。該查詢就要被運(yùn)行一次。因此它的速度須要快。假設(shè)第一個(gè)結(jié)果集不符合用戶的期望,那么他們就會(huì)繼續(xù)輸入直到得到他們須要的結(jié)果。
轉(zhuǎn)載于:https://www.cnblogs.com/yxwkf/p/5247811.html
總結(jié)
以上是生活随笔為你收集整理的[Elasticsearch] 部分匹配 (三) - 查询期间的即时搜索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [转载]双向广搜
- 下一篇: node.js Web应用框架Expre