elasticsearch 關(guān)鍵詞查詢-實(shí)現(xiàn)like查詢(轉(zhuǎn))

來(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呻澜,一起剝皮案震驚了整個(gè)濱河市递礼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羹幸,老刑警劉巖脊髓,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異栅受,居然都是意外死亡将硝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門屏镊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)依疼,“玉大人,你說(shuō)我怎么就攤上這事而芥÷砂眨” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵棍丐,是天一觀的道長(zhǎng)误辑。 經(jīng)常有香客問我沧踏,道長(zhǎng),這世上最難降的妖魔是什么稀余? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任悦冀,我火速辦了婚禮,結(jié)果婚禮上睛琳,老公的妹妹穿的比我還像新娘盒蟆。我一直安慰自己,他們只是感情好师骗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布历等。 她就那樣靜靜地躺著,像睡著了一般辟癌。 火紅的嫁衣襯著肌膚如雪寒屯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天黍少,我揣著相機(jī)與錄音寡夹,去河邊找鬼。 笑死厂置,一個(gè)胖子當(dāng)著我的面吹牛菩掏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昵济,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼智绸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了访忿?” 一聲冷哼從身側(cè)響起瞧栗,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎海铆,沒想到半個(gè)月后迹恐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡游添,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年系草,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唆涝。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖唇辨,靈堂內(nèi)的尸體忽然破棺而出廊酣,到底是詐尸還是另有隱情,我是刑警寧澤赏枚,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布亡驰,位于F島的核電站晓猛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏凡辱。R本人自食惡果不足惜戒职,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望透乾。 院中可真熱鬧洪燥,春花似錦、人聲如沸乳乌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)汉操。三九已至再来,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磷瘤,已是汗流浹背芒篷。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留采缚,地道東北人针炉。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像仰担,于是被迫代替她去往敵國(guó)和親糊识。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • ## 寫在前面 前段時(shí)間在實(shí)時(shí)獲取SQLServer數(shù)據(jù)庫(kù)變化時(shí)候摔蓝,整個(gè)過程可謂是坎坷赂苗。然后就想在這里記錄一下。 ...
    留歌_36閱讀 1,124評(píng)論 0 0
  • !/usr/bin/env python -- coding: utf-8 -- '''根據(jù)某個(gè)traceId去調(diào)...
    小七奇奇閱讀 633評(píng)論 0 0
  • es種有兩種查詢模式贮尉,一種是像傳遞URL參數(shù)一樣去傳遞查詢語(yǔ)句拌滋,被稱為簡(jiǎn)單搜索或查詢字符串(query strin...
    會(huì)武功的蚊子閱讀 542評(píng)論 1 3
  • 昨天在學(xué)校的情感墻上看到一則真實(shí)的小故事魏铅,事情經(jīng)過是這樣的:一對(duì)情侶在吵架昌犹,然后女生氣急了就說(shuō)了句“滾”,結(jié)果男生...
    是王哦閱讀 361評(píng)論 0 0
  • 萬(wàn)丈高樓千萬(wàn)家览芳,鋼筋水泥藏夏蛙斜姥。 夜半三更傾天雨,胡同深處落地花。
    大熊爸爸閱讀 223評(píng)論 0 2