Partial Matching

結(jié)構(gòu)化數(shù)據(jù)

PUT /my_index
{
    "mappings": {
        "address": {
            "properties": {
                "postcode": {
                    "type":  "string",
                    "index": "not_analyzed"
                }
            }
        }
    }
}

索引一些postcode

PUT /my_index/address/1
{ "postcode": "W1V 3DG" }

PUT /my_index/address/2
{ "postcode": "W2F 8HW" }

PUT /my_index/address/3
{ "postcode": "W1F 7HW" }

PUT /my_index/address/4
{ "postcode": "WC1N 1LZ" }

PUT /my_index/address/5
{ "postcode": "SW5 0BE" }

prefix前綴查詢

為了找到所有以W1開始的郵編,可以使用prefix

GET /my_index/address/_search
{
    "query": {
        "prefix": {
            "postcode": "W1"
        }
    }
}

prefix查詢是一個詞級別的底層查詢,它不會在搜索之前分析查詢字符串。
默認(rèn)情況prefix查詢不做相關(guān)度評分計算,只是將所有匹配的文檔返回
prefix查詢和prefix過濾器這兩者實際的區(qū)別就是過濾器是可以被緩存的,而查詢不行。
es只能在倒排索引中找到存在的詞,但是我們并沒有對這些postcode索引進行特殊處理。
那么prefix查詢是如何工作的呢?
索引如下:

Term:          Doc IDs:
-------------------------
"SW5 0BE"    |  5
"W1F 7HW"    |  3
"W1V 3DG"    |  1
"W2F 8HW"    |  2
"WC1N 1LZ"   |  4
-------------------------

1、掃描詞列表并查找到第一個以W1開始的詞。
2、搜集關(guān)聯(lián)的文檔ID。
3、移動到下一個詞。
4、如果這個詞也是以W1開頭,查詢跳回到第二步再重復(fù)執(zhí)行,知道下一個詞不為W1為止。
前綴越多所需訪問的詞越多,當(dāng)字段中詞的集合很小時,可以放心使用。

通配符與正則表達(dá)式查詢

wildcard通配符查詢也是一種底層基于詞的查詢,使用標(biāo)準(zhǔn)的shell通配符查詢
?匹配任意字符,*匹配0或多個字符

GET /my_index/address/_search
{
    "query": {
        "wildcard": {
            "postcode": "W?F*HW" (1)
        }
    }
}

regexp正則式查詢

GET /my_index/address/_search
{
    "query": {
        "regexp": {
            "postcode": "W[0-9].+" (1)
        }
    }
}

wildcard和regexp查詢的工作方式與prefix查詢完全一樣。這需要注意性能問題。
數(shù)據(jù)在索引時的預(yù)處理有助于提高前綴匹配的效率,而wildcard和regexp查詢只能在查詢時完成。
prefix、wildcard、regexp查詢是基于詞操作的,如果用他們來查詢analyzed字段,它們會檢查字段里面的每個詞,而不是將字段作為整體來處理。
需要注意的是“Quick”在索引里是“quick”

查詢時輸入即搜索(即時搜索instant search)

短語匹配match_phrase的一種特殊形式,match_phrase_prefix

{
    "match_phrase_prefix" : {
        "brand" : "johnnie walker bl"
    }
}

查詢行為與match_phrase一致,但是只使用最后一個詞作為前綴使用
接受slop參數(shù)
同樣也存在資源消耗問題,可以通過設(shè)置max_expansions參數(shù)來限制前綴擴展的影響,控制可以與前綴匹配詞的數(shù)量

{
    "match_phrase_prefix" : {
        "brand" : {
            "query":          "johnnie walker bl",
            "max_expansions": 50
        }
    }
}

需要注意:每當(dāng)用戶多輸入一個字符時,查詢又會執(zhí)行一遍。

索引時優(yōu)化

Ngrams在部分匹配的應(yīng)用

單個詞的查找 要比 在詞列表中盲目挨個查找的效率要高得多。在搜索之前準(zhǔn)備好供部分匹配的數(shù)據(jù)可以提高搜索的性能。
在索引時準(zhǔn)備數(shù)據(jù)以為著要選擇合適的分析連,這里部分匹配使用的工具是n-gram。
可以將n-gram看成一個在詞語上滑動窗口,n代表這個窗口的長度

長度 1(unigram): [ q, u, i, c, k ]
長度 2(bigram): [ qu, ui, ic, ck ]
長度 3(trigram): [ qui, uic, ick ]
長度 4(four-gram): [ quic, uick ]
長度 5(five-gram): [ quick ]

索引 輸入即搜索

github:https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/blob/cn/130_Partial_Matching/35_Search_as_you_type.asciidoc

Ngrams在復(fù)合詞中的應(yīng)用

github:https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/blob/cn/130_Partial_Matching/40_Compound_words.asciidoc

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • multi_match查詢 默認(rèn)情況下,查詢的類型是 best_fields , 這表示它會為每個字段生成一個 m...
    2fc2a81494ac閱讀 946評論 0 0
  • Neil Zhu,簡書ID Not_GOD,University AI 創(chuàng)始人 & Chief Scientist...
    朱小虎XiaohuZhu閱讀 13,287評論 0 5
  • 搜索機制 搜索的流程圖如下: 1,文檔寫入ES的時候,ES中會存儲兩份數(shù)據(jù)。一份是文檔的原始數(shù)據(jù),即_source...
    吃火龍果吐芝麻閱讀 2,450評論 0 2
  • 前言 type 類型介紹 text: 默認(rèn)分詞,將字符串分成若干個詞,創(chuàng)建索引。同時,保存一份不分詞的字符串,保存...
    run_bd11閱讀 585評論 0 0
  • 為了演示不同類型的 ElasticSearch 的查詢,我們將使用書文檔信息的集合(有以下字段:title(標(biāo)題)...
    jinshan閱讀 1,075評論 0 2

友情鏈接更多精彩內(nèi)容