來(lái)源:https://blog.csdn.net/qq_22612245/article/details/82432107
背景:我們項(xiàng)目需要對(duì)es索引里面的一個(gè)字段進(jìn)行關(guān)鍵詞(中文+英文+數(shù)字混合唬格,中文偏多)搜索悯辙,相當(dāng)于關(guān)系型數(shù)據(jù)庫(kù)的like操作帆阳。要實(shí)現(xiàn)這個(gè)功能,我們首先想到的方式是用*通配符氨距,但是實(shí)際應(yīng)用場(chǎng)景查詢語(yǔ)句會(huì)很復(fù)雜桑逝,*通配符的方式顯得不夠友好,導(dǎo)致慢查詢俏让,甚至內(nèi)存溢出楞遏。
考慮到實(shí)際應(yīng)用場(chǎng)景茬暇,一次查詢會(huì)查詢多個(gè)字段,我們項(xiàng)目采用query_string query方式寡喝,下面只考慮關(guān)鍵詞字段糙俗。
數(shù)據(jù)準(zhǔn)備
創(chuàng)建索引 es_test_index??
PUT? 127.0.0.1:9200/es_test_index
{
? ? "order": 0,
? ? "index_patterns": [
? ? ? ? "es_test_index"
? ? ],
? ? "settings": {
? ? ? ? "index": {
? ? ? ? ? ? "max_result_window": "30000",
? ? ? ? ? ? "refresh_interval": "60s",
? ? ? ? ? ? "number_of_shards": "3",
? ? ? ? ? ? "number_of_replicas": "1"
? ? ? ? }
? ? },
? ? "mappings": {
? ? ? ? "logs": {
? ? ? ? ? ? "_all": {
? ? ? ? ? ? ? ? "enabled": false
? ? ? ? ? ? },
? ? ? ? ? ? "properties": {
? ? ? ? ? ? ? ? "search_word": {
? ? ? ? ? ? ? ? ? ? "type": "keyword"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
方式一
{
? ? "profile":true,
? ? "from":0,
? ? "size":100,
? ? "query":{
? ? ? ? "query_string":{
? ? ? ? ? ? "query":"search_word:(*中國(guó)* NOT *美國(guó)* AND *VIP* AND *經(jīng)濟(jì)* OR *金融*)",
? ? ? ? ? ? "default_operator":"and"
? ? ? ? }
? ? }
}
采用*通配符的方式,相當(dāng)于wildcard query预鬓,只是query_string能支持查詢多個(gè)關(guān)鍵詞巧骚,并且可以用 AND OR? NOT進(jìn)行連接,會(huì)更加靈活格二。
{
? ? "query": {
? ? ? ? "wildcard" : { "search_word" : "*中國(guó)*" }
? ? }
}
在我們的應(yīng)用場(chǎng)景中劈彪,關(guān)鍵詞前后都有*通配符,這個(gè)查詢會(huì)非常慢顶猜,因?yàn)樵摬樵冃枰闅vindex里面的每個(gè)term沧奴。官方文檔解釋:Matches documents that have fields matching a wildcard expression (not analyzed). Supported wildcards are *, which matches any character sequence (including the empty one), and ?, which matches any single character. Note that this query can be slow, as it needs to iterate over many terms. In order to prevent extremely slow wildcard queries, a wildcard term should not start with one of the wildcards * or ?. 官方文檔建議避免以*開頭,但是我們要實(shí)現(xiàn)全匹配长窄,前后都需要*通配符滔吠,可想而知效率是非常慢的。
在我們的實(shí)際項(xiàng)目中抄淑,我們發(fā)現(xiàn)用戶有時(shí)候會(huì)輸入很多個(gè)關(guān)鍵詞屠凶,再加上其他的查詢條件驰后,單個(gè)查詢的壓力很大肆资,導(dǎo)致了大量的超時(shí)。所以灶芝,我們決定換種方式實(shí)現(xiàn)like查詢郑原。
在仔細(xì)研究官方文檔后,發(fā)現(xiàn)可以用standard分詞+math_pharse查詢實(shí)現(xiàn)夜涕。
重新創(chuàng)建索引
PUT? 127.0.0.1:9200/es_test_index
{
? ? "order": 0,
? ? "index_patterns": [
? ? ? ? "es_test_index_2"
? ? ],
? ? "settings": {
? ? ? ? "index": {
? ? ? ? ? ? "max_result_window": "30000",
? ? ? ? ? ? "refresh_interval": "60s",
? ? ? ? ? ? "analysis": {
? ? ? ? ? ? ? ? "analyzer": {
? ? ? ? ? ? ? ? ? ? "custom_standard": {
? ? ? ? ? ? ? ? ? ? ? ? "type": "custom",
? ? ? ? ? ? ? ? ? ? ? ? "tokenizer": "standard",
? ? ? ? ? ? ? ? ? ? ? ? "char_filter": [
? ? ? ? ? ? ? ? ? ? ? ? ? ? "my_char_filter"
? ? ? ? ? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? ? ? ? ? "filter": "lowercase"
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? "char_filter": {
? ? ? ? ? ? ? ? ? ? "my_char_filter": {
? ? ? ? ? ? ? ? ? ? ? ? "type": "mapping",
? ? ? ? ? ? ? ? ? ? ? ? "mappings": [
? ? ? ? ? ? ? ? ? ? ? ? ? ? "· => xxDOT1xx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "+ => xxPLUSxx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "- => xxMINUSxx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "\" => xxQUOTATIONxx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "( => xxLEFTBRACKET1xx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ") => xxRIGHTBRACKET1xx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "& => xxANDxx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "| => xxVERTICALxx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "—=> xxUNDERLINExx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "/=> xxSLASHxx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "犯犁!=> xxEXCLAxx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "?=> xxDOT2xx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "【=>xxLEFTBRACKET2xx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "】 => xxRIGHTBRACKET2xx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "`=>xxapostrophexx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ".=>xxDOT3xx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "#=>xxhashtagxx",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ",=>xxcommaxx"
? ? ? ? ? ? ? ? ? ? ? ? ]
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? },
? ? ? ? ? ? "number_of_shards": "3",
? ? ? ? ? ? "number_of_replicas": "1"
? ? ? ? }
? ? },
? ? "mappings": {
? ? ? ? "logs": {
? ? ? ? ? ? "_all": {
? ? ? ? ? ? ? ? "enabled": false
? ? ? ? ? ? },
? ? ? ? ? ? "properties": {
? ? ? ? ? ? ? ? "search_text": {
? ? ? ? ? ? ? ? ? ? "analyzer": "custom_standard",
? ? ? ? ? ? ? ? ? ? "type": "text"
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? "search_word": {
? ? ? ? ? ? ? ? ? ? "type": "keyword"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
注意看上面的索引女器,我創(chuàng)建了兩個(gè)字段酸役,search_word 跟方式一相同,為了對(duì)比兩種方式的性能驾胆。 search_text :為了使用分析器涣澡,將type設(shè)置為text ,分析器設(shè)置為custom_standard 丧诺。
custom_standard組成:
字符過濾器char_filter:采用了mapping char filter 即接受原始文本作為字符流輸入入桂,把某些字符(自定義)轉(zhuǎn)換為另外的字符。因?yàn)榉衷~器采用了standard分詞器驳阎,它會(huì)去掉大多數(shù)的符號(hào)抗愁,但是關(guān)鍵詞搜索的過程可能會(huì)帶有這些符號(hào)馁蒂,如果去掉的話,會(huì)使搜索出來(lái)的結(jié)果不準(zhǔn)確蜘腌。比如 搜索 紅+黃沫屡,分詞之后 變成 紅 黃,那么撮珠,搜索出來(lái)的結(jié)果可能包含 紅+黃谁鳍,紅黃 ,而紅黃并不是我們想要的劫瞳。因此倘潜,運(yùn)用字符過濾器,把+轉(zhuǎn)換成字符串xxPLUSxx志于,那么在分詞的時(shí)候涮因,+就不會(huì)被去掉了。
分詞器:standard? 該分詞器對(duì)英文比較友好伺绽,對(duì)于中文分詞會(huì)分為單個(gè)字這樣养泡。
詞元過濾器filter:lowercase? 把分詞過后的詞元變?yōu)樾憽?/p>
準(zhǔn)備工作就緒,我們準(zhǔn)備查詢了奈应,現(xiàn)在我們采用match_pharse查詢方式澜掩。
方式二:
{
? ? "from": 0,
? ? "size": 100,
? ? "query": {
? ? ? ? "query_string": {
? ? ? ? ? ? "query": "search_text:(\"中國(guó)\" NOT \"美國(guó)\" AND \"VIP\" AND \"經(jīng)濟(jì)\" OR \"金融\")",
? ? ? ? ? ? "default_operator": "and"
? ? ? ? }
? ? }
}
我們來(lái)看下為什么match_phrase查詢能實(shí)現(xiàn)關(guān)鍵詞左右模糊匹配。
match_phrase 查詢首先將查詢字符串進(jìn)行分詞(如果不進(jìn)行其他的參數(shù)設(shè)置杖挣,分詞器采用創(chuàng)建索引時(shí)search_text字段的分詞器custom_standard肩榕,如果不明白可以參考官方文檔https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis.html),然后對(duì)這些詞項(xiàng)進(jìn)行搜索惩妇,但只保留那些包含 全部 搜索詞項(xiàng)株汉,且 位置 與搜索詞項(xiàng)相同的文檔。 換句話說(shuō)歌殃,match_phrase查詢不僅匹配字乔妈,還匹配位置。比如氓皱,search_text字段包含的內(nèi)容是:當(dāng)代中國(guó)正處于高速發(fā)展時(shí)期路召。? ? 我們搜索關(guān)鍵詞:中國(guó)??
索引的時(shí)候 search_text經(jīng)過分詞器分為
我們可以用以下api查詢分詞效果
127.0.0.1:9200/es_test_index_2/_analyze
{
"analyzer": "custom_standard",
? "text":? "當(dāng)代中國(guó)正處于高速發(fā)展時(shí)期"
}
返回結(jié)果:
{
? ? "tokens": [
? ? ? ? {
? ? ? ? ? ? "token": "當(dāng)",
? ? ? ? ? ? "start_offset": 0,
? ? ? ? ? ? "end_offset": 1,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 0
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "token": "代",
? ? ? ? ? ? "start_offset": 1,
? ? ? ? ? ? "end_offset": 2,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 1
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "token": "中",
? ? ? ? ? ? "start_offset": 2,
? ? ? ? ? ? "end_offset": 3,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 2
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "token": "國(guó)",
? ? ? ? ? ? "start_offset": 3,
? ? ? ? ? ? "end_offset": 4,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 3
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "token": "正",
? ? ? ? ? ? "start_offset": 4,
? ? ? ? ? ? "end_offset": 5,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 4
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "token": "處",
? ? ? ? ? ? "start_offset": 5,
? ? ? ? ? ? "end_offset": 6,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 5
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "token": "于",
? ? ? ? ? ? "start_offset": 6,
? ? ? ? ? ? "end_offset": 7,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 6
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "token": "高",
? ? ? ? ? ? "start_offset": 7,
? ? ? ? ? ? "end_offset": 8,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 7
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "token": "速",
? ? ? ? ? ? "start_offset": 8,
? ? ? ? ? ? "end_offset": 9,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 8
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "token": "發(fā)",
? ? ? ? ? ? "start_offset": 9,
? ? ? ? ? ? "end_offset": 10,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 9
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "token": "展",
? ? ? ? ? ? "start_offset": 10,
? ? ? ? ? ? "end_offset": 11,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 10
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "token": "時(shí)",
? ? ? ? ? ? "start_offset": 11,
? ? ? ? ? ? "end_offset": 12,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 11
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "token": "期",
? ? ? ? ? ? "start_offset": 12,
? ? ? ? ? ? "end_offset": 13,
? ? ? ? ? ? "type": "<IDEOGRAPHIC>",
? ? ? ? ? ? "position": 12
? ? ? ? }
? ? ]
}
我們可以看到經(jīng)過分詞之后,search_text會(huì)被分為單個(gè)的字并且還帶有位置信息波材。位置信息可以被存儲(chǔ)在倒排索引中股淡,因此 match_phrase 查詢這類對(duì)詞語(yǔ)位置敏感的查詢, 就可以利用位置信息去匹配包含所有查詢?cè)~項(xiàng)各聘,且各詞項(xiàng)順序也與我們搜索指定一致的文檔揣非,中間不夾雜其他詞項(xiàng)。
在搜索的時(shí)候躲因,關(guān)鍵詞“中國(guó)”也會(huì)經(jīng)過分詞被分為“中”? “國(guó)”兩個(gè)字早敬,然后 match_phrase 查詢會(huì)在倒排索引中檢查是否包含詞項(xiàng)“中”和“國(guó)”并且“中”出現(xiàn)的位置只比“國(guó)”出現(xiàn)的位置大1忌傻。這樣就剛好可以實(shí)現(xiàn)like模糊匹配。
實(shí)際上match_phrase查詢會(huì)比簡(jiǎn)單的query查詢更高搞监,一個(gè) match 查詢僅僅是看詞條是否存在于倒排索引中水孩,而一個(gè) match_phrase 查詢是必須計(jì)算并比較多個(gè)可能重復(fù)詞項(xiàng)的位置。Lucene nightly benchmarks 表明一個(gè)簡(jiǎn)單的 term 查詢比一個(gè)短語(yǔ)查詢大約快 10 倍琐驴,比鄰近查詢(有 slop 的短語(yǔ) 查詢)大約快 20 倍俘种。當(dāng)然,這個(gè)代價(jià)指的是在搜索時(shí)而不是索引時(shí)绝淡。
通常宙刘,match_phrase 的額外成本并不像這些數(shù)字所暗示的那么嚇人。事實(shí)上牢酵,性能上的差距只是證明一個(gè)簡(jiǎn)單的 term 查詢有多快悬包。標(biāo)準(zhǔn)全文數(shù)據(jù)的短語(yǔ)查詢通常在幾毫秒內(nèi)完成,因此實(shí)際上都是完全可用馍乙,即使是在一個(gè)繁忙的集群上布近。
在某些特定病理案例下,短語(yǔ)查詢可能成本太高了丝格,但比較少見撑瞧。一個(gè)典型例子就是DNA序列,在序列里很多同樣的詞項(xiàng)在很多位置重復(fù)出現(xiàn)显蝌。在這里使用高 slop 值會(huì)到導(dǎo)致位置計(jì)算大量增加预伺。
下面我們來(lái)看看兩種方式的查詢效率:
我們用es_test_index_2 索引,里面 search_text是按照方式二定義的琅束,search_word是按照方式一定義的扭屁,對(duì)兩個(gè)字段導(dǎo)入相同的數(shù)據(jù)。
對(duì)該索引導(dǎo)入了25302條數(shù)據(jù)涩禀,11.3mb
方式一:*通配符
{
? ? "profile":true,
? ? "from":0,
? ? "size":100,
? ? "query":{
? ? ? ? "query_string":{
? ? ? ? ? ? "query":"search_word:(NOT *新品* AND *經(jīng)典* OR *秒殺* NOT *預(yù)付*)",
? ? ? ? ? ? "fields": [],
? ? ? ? ? ? "type": "best_fields",
? ? ? ? ? ? "default_operator": "and",
? ? ? ? ? ? "max_determinized_states": 10000,
? ? ? ? ? ? "enable_position_increments": true,
? ? ? ? ? ? "fuzziness": "AUTO",
? ? ? ? ? ? "fuzzy_prefix_length": 0,
? ? ? ? ? ? "fuzzy_max_expansions": 50,
? ? ? ? ? ? "phrase_slop": 0,
? ? ? ? ? ? "escape": false,
? ? ? ? ? ? "auto_generate_synonyms_phrase_query": true,
? ? ? ? ? ? "fuzzy_transpositions": true,
? ? ? ? ? ? "boost": 1
? ? ? ? }
? ? }
}
方式二:match_phrase方式
{
? ? "from": 0,
? ? "size": 100,
? ? "query": {
? ? ? ? "query_string": {
? ? ? ? ? ? "query": "search_text:(NOT \"新品\" AND \"經(jīng)典\" OR \"秒殺\" NOT \"預(yù)付\")",
? ? ? ? ? ? "fields": [],
? ? ? ? ? ? "type": "best_fields",
? ? ? ? ? ? "default_operator": "and",
? ? ? ? ? ? "max_determinized_states": 10000,
? ? ? ? ? ? "enable_position_increments": true,
? ? ? ? ? ? "fuzziness": "AUTO",
? ? ? ? ? ? "fuzzy_prefix_length": 0,
? ? ? ? ? ? "fuzzy_max_expansions": 50,
? ? ? ? ? ? "phrase_slop": 0,
? ? ? ? ? ? "escape": false,
? ? ? ? ? ? "auto_generate_synonyms_phrase_query": true,
? ? ? ? ? ? "fuzzy_transpositions": true,
? ? ? ? ? ? "boost": 1
? ? ? ? }
? ? }
}
查詢結(jié)果:
方式一:
方式二:
從上面可以看出時(shí)間差別還是很大的,當(dāng)需要查詢的關(guān)鍵詞很多的時(shí)候然眼,優(yōu)化效果會(huì)更好艾船。大家可以自行去驗(yàn)證。
好啦高每,關(guān)鍵詞like查詢解決啦屿岂。
補(bǔ)充點(diǎn):
一、
上述我們用的match_phrase查詢屬于精確匹配鲸匿,即必須相鄰才能被查出來(lái)爷怀。如果我們想要查詢 “中國(guó)經(jīng)濟(jì)”,能讓包含“中國(guó)當(dāng)代經(jīng)濟(jì)”的文檔也能查得出來(lái)带欢,我們可以用match_phrase查詢的參數(shù) slop(默認(rèn)為0) 來(lái)實(shí)現(xiàn):—slop不為0的match_phrase查詢稱為鄰近查詢
{
? ? "from":0,
? ? "size":300,
? ? "query":{
? ? ? ? "match_phrase" : {
? ? ? ? ? ? "search_text" :
? ? ? ? ? ? {
? ? ? ? ? ? ? ? "query":"中國(guó)經(jīng)濟(jì)",
? ? ? ? ? ? ? ? "slop":2
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
slop 參數(shù)告訴 match_phrase 查詢?cè)~條相隔多遠(yuǎn)時(shí)仍然能將文檔視為匹配 运授。 相隔多遠(yuǎn)的意思是為了讓查詢和文檔匹配你需要移動(dòng)詞條多少次烤惊? 將slop設(shè)置成2 那么 包含“中國(guó)當(dāng)代經(jīng)濟(jì)”的文檔也能被查詢出來(lái)。
在query_string query中可以這樣寫:
{
? ? "from": 0,
? ? "size": 100,
? ? "query": {
? ? ? ? "query_string": {
? ? ? ? ? ? "query": "search_text:(\"中國(guó)經(jīng)濟(jì)\"~2)",
? ? ? ? ? ? "default_operator": "and"
? ? ? ? }
當(dāng)然你也可以運(yùn)用query_string查詢的參數(shù) phrase_slop 來(lái)設(shè)置默認(rèn)的slop的長(zhǎng)度吁朦。詳情參考https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
二柒室、
在使用短語(yǔ)查詢的時(shí)候,會(huì)有一些意外的情況出現(xiàn)逗宜,比如:
PUT /my_index/groups/1
{
? ? "names": [ "John Abraham", "Lincoln Smith"]
}
或者
PUT /my_index/groups/1
{
? ? "names": "John Abraham, Lincoln Smith"
}
然后我們?cè)谶\(yùn)行一個(gè)Abraham ?Lincoln 短語(yǔ)查詢的時(shí)候
GET /my_index/groups/_search
{
? ? "query": {
? ? ? ? "match_phrase": {
? ? ? ? ? ? "names": "Abraham Lincoln"
? ? ? ? }
? ? }
}
我們會(huì)發(fā)現(xiàn)文檔會(huì)匹配到上述文檔雄右,實(shí)際上,我們不希望這樣的匹配出現(xiàn)纺讲,字段names 不管是text數(shù)組形式擂仍,還是text形式,經(jīng)過分詞之后熬甚,都是?John Abraham ?Lincoln Smith ?防楷,而?Abraham ?Lincoln 屬于相鄰的,所以短語(yǔ)查詢能夠匹配到则涯。
在這樣的情況下复局,我們可以這樣解決,將這個(gè)字段存為數(shù)組
DELETE /my_index/groups/
PUT /my_index/_mapping/groups
{
? ? "properties": {
? ? ? ? "names": {
? ? ? ? ? ? "type":? ? ? ? ? ? ? ? "string",
? ? ? ? ? ? "position_increment_gap": 100
? ? ? ? }
? ? }
}
position_increment_gap 設(shè)置告訴 Elasticsearch 應(yīng)該為數(shù)組中每個(gè)新元素增加當(dāng)前詞條 position 的指定值粟判。 所以現(xiàn)在當(dāng)我們?cè)偎饕?names 數(shù)組時(shí)亿昏,會(huì)產(chǎn)生如下的結(jié)果:
* Position 1: john
* Position 2: abraham
* Position 103: lincoln
* Position 104: smith
現(xiàn)在我們的短語(yǔ)查詢可能無(wú)法匹配該文檔因?yàn)?abraham 和 lincoln 之間的距離為 100 。 為了匹配這個(gè)文檔你必須添加值為 100 的 slop 档礁。position_increment_gap默認(rèn)是100.
另外角钩,我們也可以在自定義分析器的時(shí)候設(shè)置該參數(shù)。
PUT my_index
{
? "settings": {
? ? "analysis": {
? ? ? "analyzer": {
? ? ? ? "my_custom_analyzer": {
? ? ? ? ? "type":? ? ? "custom",
? ? ? ? ? "tokenizer": "standard",
? ? ? ? ? "char_filter": [
? ? ? ? ? ? "html_strip"
? ? ? ? ? ],
? ? ? ? ? "filter": [
? ? ? ? ? ? "lowercase",
? ? ? ? ? ? "asciifolding"
? ? ? ? ? ],
? ? ? ? “position_increment_gap":101
? ? ? ? }
? ? ? }
? ? }
? }
}
參考文檔:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-custom-analyzer.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-standard-tokenizer.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-mapping-charfilter.html
---------------------
作者:stellaYdc
來(lái)源:CSDN
轉(zhuǎn)載自:https://blog.csdn.net/qq_22612245/article/details/82432107