溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用Elasticsearch中的Span Query

發(fā)布時(shí)間:2021-11-17 13:50:51 來源:億速云 閱讀:898 作者:iii 欄目:大數(shù)據(jù)

本篇內(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查詢除外)。

數(shù)據(jù)準(zhǔn)備階段

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)分詞

Span Term Query

與普通的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));

Span Multi Term Query

{
  "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è)詞查詢。

Span First Query

從文檔開始位置至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 query

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

Span Or Query

可以指定多個(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

Span Not 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 Query

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));

Span Within Query

模板:
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í)用文章!

向AI問一下細(xì)節(jié)

免責(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)容。

AI