程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> [Elasticsearch] 部分匹配 (三)

[Elasticsearch] 部分匹配 (三)

編輯:關於C++

 

 

查詢期間的即時搜索(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更多的詞條。

    不要忘了在用戶每敲入一個字符的時候,該查詢就要被執行一次,因此它的速度需要快。如果第一個結果集不符合用戶的期望,那麼他們就會繼續輸入直到得到他們需要的結果。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved