91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

怎么使用Elasticsearch中的Span Query

發布時間:2021-11-17 13:50:51 來源:億速云 閱讀:903 作者:iii 欄目:大數據

本篇內容介紹了“怎么使用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的默認標準分詞

Span Term Query

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

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

備注:
可以是擴展MultiTermQueryBuilder類的任何構建器。
例如:FuzzyQueryBuilder, PrefixQueryBuilder, RangeQueryBuilder, RegexpQueryBuilder或WildcardQueryBuilder。

如果與查詢匹配的術語數量超過了布爾查詢限制(默認為1024),span_multi查詢將遇到太多子句失敗。為了避免無限制的擴展,可以將多術語查詢的rewrite方法設置為top_terms_* rewrite。或者,如果您僅在前綴查詢上使用span_multi,則可以激活文本字段的index_prefixes字段選項。這會將字段上的任何前綴查詢重寫為與索引前綴匹配的單個詞查詢。

Span First Query

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

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

Span Or Query

可以指定多個查詢子句,每種查詢返回的數據進行合并處理

模板:
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

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

備注:相當于match query中的must not
include用于定義包含的span查詢;exclude用于定義排除的span查詢

Span Containing Query

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

Span Within Query

模板:
spanWithinQuery(
        spanNearQuery(spanTermQuery("field1", "bar"), 5)     
            .addClause(spanTermQuery("field1", "baz"))
            .inOrder(true),
        spanTermQuery("field1", "foo"));

“怎么使用Elasticsearch中的Span Query”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丹巴县| 临桂县| 营口市| 资兴市| 和田县| 海宁市| 和政县| 长白| 镇宁| 新竹市| 黎城县| 新邵县| 舞钢市| 石嘴山市| 桓仁| 菏泽市| 麻城市| 长丰县| 安庆市| 青铜峡市| 铅山县| 册亨县| 常州市| 洛浦县| 什邡市| 怀来县| 平阳县| 松溪县| 岳池县| 蒙阴县| 新宁县| 惠东县| 揭西县| 灵宝市| 电白县| 诸暨市| 新竹市| 黔西县| 象州县| 永春县| 敦化市|