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