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

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

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

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

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

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ù)在索引時(shí)的預(yù)處理有助于提高前綴匹配的效率,而wildcard和regexp查詢只能在查詢時(shí)完成置济。
prefix解恰、wildcard、regexp查詢是基于詞操作的浙于,如果用他們來查詢analyzed字段修噪,它們會(huì)檢查字段里面的每個(gè)詞,而不是將字段作為整體來處理路媚。
需要注意的是“Quick”在索引里是“quick”

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

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

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

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

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

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

索引時(shí)優(yōu)化

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

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

長度 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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淤袜,一起剝皮案震驚了整個(gè)濱河市痒谴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铡羡,老刑警劉巖积蔚,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異烦周,居然都是意外死亡尽爆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門读慎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漱贱,“玉大人,你說我怎么就攤上這事夭委》ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長彪笼。 經(jīng)常有香客問我钻注,道長蚂且,這世上最難降的妖魔是什么配猫? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮杏死,結(jié)果婚禮上泵肄,老公的妹妹穿的比我還像新娘。我一直安慰自己淑翼,他們只是感情好腐巢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玄括,像睡著了一般冯丙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遭京,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天胃惜,我揣著相機(jī)與錄音,去河邊找鬼哪雕。 笑死船殉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斯嚎。 我是一名探鬼主播利虫,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼堡僻!你這毒婦竟也來了糠惫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤钉疫,失蹤者是張志新(化名)和其女友劉穎寞钥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陌选,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡理郑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咨油。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片您炉。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖役电,靈堂內(nèi)的尸體忽然破棺而出赚爵,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布冀膝,位于F島的核電站唁奢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窝剖。R本人自食惡果不足惜麻掸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赐纱。 院中可真熱鬧脊奋,春花似錦、人聲如沸疙描。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽起胰。三九已至久又,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間效五,已是汗流浹背地消。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留火俄,地道東北人犯建。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像瓜客,于是被迫代替她去往敵國和親适瓦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • multi_match查詢 默認(rèn)情況下谱仪,查詢的類型是 best_fields 玻熙, 這表示它會(huì)為每個(gè)字段生成一個(gè) m...
    2fc2a81494ac閱讀 818評(píng)論 0 0
  • Neil Zhu,簡書ID Not_GOD疯攒,University AI 創(chuàng)始人 & Chief Scientist...
    朱小虎XiaohuZhu閱讀 13,216評(píng)論 0 5
  • 搜索機(jī)制 搜索的流程圖如下: 1嗦随,文檔寫入ES的時(shí)候,ES中會(huì)存儲(chǔ)兩份數(shù)據(jù)敬尺。一份是文檔的原始數(shù)據(jù)枚尼,即_source...
    吃火龍果吐芝麻閱讀 2,334評(píng)論 0 2
  • 前言 type 類型介紹 text: 默認(rèn)分詞,將字符串分成若干個(gè)詞砂吞,創(chuàng)建索引署恍。同時(shí),保存一份不分詞的字符串蜻直,保存...
    run_bd11閱讀 512評(píng)論 0 0
  • 為了演示不同類型的 ElasticSearch 的查詢盯质,我們將使用書文檔信息的集合(有以下字段:title(標(biāo)題)...
    jinshan閱讀 1,016評(píng)論 0 2