您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么使用Elasticsearch中的Span Query”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Span查詢是低級的位置查詢,提供對指定術語的順序和鄰近性的專家控制。它們通常用于實現對法律文件或專利的非常具體的查詢。
Span query 指的是es的區間查詢,通過該語句用戶可以精準控制多個輸入詞的先后順序,以及多個關鍵詞在文檔中的前后距離
注意:不能將Span查詢與非Span查詢混合使用(span_multi查詢除外)。
POST index_name/_analyze { "field": "name", "text": "邊建軍" } 結果: { "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的默認標準分詞
與普通的term檢索類似,用來獲取某個字段包含特定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)); 備注: 可以是擴展MultiTermQueryBuilder類的任何構建器。 例如:FuzzyQueryBuilder, PrefixQueryBuilder, RangeQueryBuilder, RegexpQueryBuilder或WildcardQueryBuilder。
如果與查詢匹配的術語數量超過了布爾查詢限制(默認為1024),span_multi查詢將遇到太多子句失敗。為了避免無限制的擴展,可以將多術語查詢的rewrite方法設置為top_terms_* rewrite。或者,如果您僅在前綴查詢上使用span_multi,則可以激活文本字段的index_prefixes字段選項。這會將字段上的任何前綴查詢重寫為與索引前綴匹配的單個詞查詢。
從文檔開始位置至end結束位置進行關鍵詞查找,當end設置為1時,那么關鍵詞必須匹配在文檔開頭。
{ "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可以用來對多個關鍵詞進行順序查找。
模板: 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)); 備注:有結果返回 如果slop改為0時,將不會有數據返回
其中in_order需要設置為true,且后一個關鍵詞的start_offset減去前一個end_offset的值必須小于等于slop
可以指定多個查詢子句,每種查詢返回的數據進行合并處理
模板: 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)); 備注:相當于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)); 備注:相當于match query中的must not include用于定義包含的span查詢;exclude用于定義排除的span查詢
span containing與span within用法相同,只是底層調用的Lucene方法不同而已,效果是一樣的。
這個查詢內部會有多個子查詢,但是會設定某個子查詢優先級更高,作用更大,通過關鍵字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”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。