您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“怎么使用Elasticsearch中的Span Query”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
Span查詢是低級的位置查詢,提供對指定術(shù)語的順序和鄰近性的專家控制。它們通常用于實(shí)現(xiàn)對法律文件或?qū)@姆浅>唧w的查詢。
Span query 指的是es的區(qū)間查詢,通過該語句用戶可以精準(zhǔn)控制多個(gè)輸入詞的先后順序,以及多個(gè)關(guān)鍵詞在文檔中的前后距離
注意:不能將Span查詢與非Span查詢混合使用(span_multi查詢除外)。
POST index_name/_analyze { "field": "name", "text": "邊建軍" } 結(jié)果: { "tokens" : [ { "token" : "邊", "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 } ] } 備注: name字段的分詞為Es的默認(rèn)標(biāo)準(zhǔn)分詞
與普通的term檢索類似,用來獲取某個(gè)字段包含特定term的文檔。
{ "from": 0, "size": 10, "query": { "bool": { "must": [ { "span_term": { "name": { "value": "杜建新", "boost": 2 } } } ], "adjust_pure_negative": true, "boost": 1 } } } boolQueryBuilder.must(QueryBuilders.spanTermQuery("name", q).boost(2));
{ "from": 0, "size": 10, "query": { "bool": { "must": [ { "span_multi": { "match": { "prefix": { "name": { "value": "杜建新", "boost": 1 } } }, "boost": 1 } } ], "adjust_pure_negative": true, "boost": 1 } } } PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("name", q); boolQueryBuilder.must(QueryBuilders.spanMultiTermQueryBuilder(prefixQueryBuilder)); 或者 MultiTermQueryBuilder multiTermQueryBuilder = QueryBuilders.prefixQuery("name", q); boolQueryBuilder.must(QueryBuilders.spanMultiTermQueryBuilder(multiTermQueryBuilder)); 備注: 可以是擴(kuò)展MultiTermQueryBuilder類的任何構(gòu)建器。 例如:FuzzyQueryBuilder, PrefixQueryBuilder, RangeQueryBuilder, RegexpQueryBuilder或WildcardQueryBuilder。
如果與查詢匹配的術(shù)語數(shù)量超過了布爾查詢限制(默認(rèn)為1024),span_multi查詢將遇到太多子句失敗。為了避免無限制的擴(kuò)展,可以將多術(shù)語查詢的rewrite方法設(shè)置為top_terms_* rewrite?;蛘?,如果您僅在前綴查詢上使用span_multi,則可以激活文本字段的index_prefixes字段選項(xiàng)。這會將字段上的任何前綴查詢重寫為與索引前綴匹配的單個(gè)詞查詢。
從文檔開始位置至end結(jié)束位置進(jìn)行關(guān)鍵詞查找,當(dāng)end設(shè)置為1時(shí),那么關(guān)鍵詞必須匹配在文檔開頭。
{ "from": 0, "size": 10, "query": { "bool": { "must": [ { "span_first": { "match": { "span_term": { "name": { "value": "杜建新", "boost": 1 } } }, "end": 2, "boost": 1 } } ], "adjust_pure_negative": true, "boost": 1 } } } SpanQueryBuilder spanQueryBuilder = QueryBuilders.spanTermQuery("name", q); boolQueryBuilder.must(QueryBuilders.spanFirstQuery(spanQueryBuilder, 4));
span near可以用來對多個(gè)關(guān)鍵詞進(jìn)行順序查找。
模板: spanNearQuery(spanTermQuery("field","value1"), 12) .addClause(spanTermQuery("field","value2")) .addClause(spanTermQuery("field","value3")) .inOrder(false); 案例: { "from": 0, "size": 10, "query": { "bool": { "must": [ { "span_near": { "clauses": [ { "span_term": { "name": { "value": "邊", "boost": 1 } } }, { "span_term": { "name": { "value": "軍", "boost": 1 } } } ], "slop": 1, "in_order": true, "boost": 1 } } ], "adjust_pure_negative": true, "boost": 1 } } } SpanQueryBuilder spanQueryBuilder_1 = QueryBuilders.spanTermQuery("name", q); SpanQueryBuilder spanQueryBuilder_2 = QueryBuilders.spanTermQuery("name", q); boolQueryBuilder.must(QueryBuilders.spanNearQuery(spanQueryBuilder_1, 2) .addClause(spanQueryBuilder_2).inOrder(true)); 備注:有結(jié)果返回 如果slop改為0時(shí),將不會有數(shù)據(jù)返回
其中in_order需要設(shè)置為true,且后一個(gè)關(guān)鍵詞的start_offset減去前一個(gè)end_offset的值必須小于等于slop
可以指定多個(gè)查詢子句,每種查詢返回的數(shù)據(jù)進(jìn)行合并處理
模板: spanOrQuery(spanTermQuery("field","value1")) .addClause(spanTermQuery("field","value2")) .addClause(spanTermQuery("field","value3")); 案例: { "from": 0, "size": 10, "query": { "bool": { "must": [ { "span_or": { "clauses": [ { "span_term": { "name": { "value": "邊", "boost": 1 } } }, { "span_term": { "name": { "value": "軍", "boost": 1 } } } ], "boost": 1 } } ], "adjust_pure_negative": true, "boost": 1 } } } SpanQueryBuilder spanQueryBuilder_1 = QueryBuilders.spanTermQuery("name", q); SpanQueryBuilder spanQueryBuilder_2 = QueryBuilders.spanTermQuery("name", q); boolQueryBuilder.must(QueryBuilders.spanOrQuery(spanQueryBuilder_1) .addClause(spanQueryBuilder_2)); 備注:相當(dāng)于match query里的should語句 查詢子句可以更換為任意的span query
模板: spanNotQuery( spanTermQuery("field","value1"), spanTermQuery("field","value2")); 案例: { "from": 0, "size": 10, "query": { "bool": { "must": [ { "span_not": { "include": { "span_term": { "name": { "value": "杜", "boost": 1 } } }, "exclude": { "span_term": { "name": { "value": "新", "boost": 1 } } }, "pre": 0, "post": 0, "boost": 1 } } ], "adjust_pure_negative": true, "boost": 1 } } } SpanQueryBuilder spanQueryBuilder_1 = QueryBuilders.spanTermQuery("name", q); SpanQueryBuilder spanQueryBuilder_2 = QueryBuilders.spanTermQuery("name", q); boolQueryBuilder.must(QueryBuilders.spanNotQuery(spanQueryBuilder_1, spanQueryBuilder_2)); 備注:相當(dāng)于match query中的must not include用于定義包含的span查詢;exclude用于定義排除的span查詢
span containing與span within用法相同,只是底層調(diào)用的Lucene方法不同而已,效果是一樣的。
這個(gè)查詢內(nèi)部會有多個(gè)子查詢,但是會設(shè)定某個(gè)子查詢優(yōu)先級更高,作用更大,通過關(guān)鍵字little和big來指定。
模板: spanContainingQuery( spanNearQuery(spanTermQuery("field1","bar"), 5) .addClause(spanTermQuery("field1","baz")) .inOrder(true), spanTermQuery("field1","foo")); 案例: { "from": 0, "size": 10, "query": { "bool": { "must": [ { "span_containing": { "big": { "span_term": { "name": { "value": "杜", "boost": 1 } } }, "little": { "span_term": { "name": { "value": "新", "boost": 1 } } }, "boost": 1 } } ], "adjust_pure_negative": true, "boost": 1 } } } SpanQueryBuilder spanQueryBuilder_1 = QueryBuilders.spanTermQuery("name", q); SpanQueryBuilder spanQueryBuilder_2 = QueryBuilders.spanTermQuery("name", q); boolQueryBuilder.must(QueryBuilders.spanContainingQuery(spanQueryBuilder_1, spanQueryBuilder_2));
模板: spanWithinQuery( spanNearQuery(spanTermQuery("field1", "bar"), 5) .addClause(spanTermQuery("field1", "baz")) .inOrder(true), spanTermQuery("field1", "foo"));
“怎么使用Elasticsearch中的Span Query”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。