結(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 ]