成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Elasticsearch 查詢革新:探索 Wildcard 類型的高效模糊匹配策略

云計算 分布式
相比 ES 在精確查詢場景優秀的性能表現(即 term keyword 的高效,平穩在毫秒級的返回),wildcard 字段在模糊查詢場景下的使用還是需要研發人員根據實際場景測試選擇。

1、背景

在生產使用中,Elasticsearch 除了精確匹配的要求,也會有模糊查詢的場景。

2、解決方案探討

面對這種問題 ,傳統的解決方案有兩種:

2.1 方案一:ngram 分詞器

使用 ngram 分詞器對存入的數據進行精細化的拆分,利用細顆粒度的 token 進行快速的召回。

這是一個利用空間換時間的方案,細化查詢所需的詞根內容,利用精確匹配結果大范圍的命中來達到模糊效果。

PUT test-005
{
  "settings": {
    "index.max_ngram_diff": 10,
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 10,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "my_analyzer",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}
 
POST test-005/_bulk
{"index":{"_id":1}}
{"title":"英文官網承認劉強東一度被捕的原因是涉嫌性侵"}
{"index":{"_id":2}}
{"title":"別提了朋友哥哥劉強東窗事發了"}
{"index":{"_id":3}}
{"title":"劉強東施效顰,沒想到竟然收獲了流量"}
{"index":{"_id":4}}
{"title":"劉強東是誰?我不認識"}
 
POST test-005/_search
{
  "query": {
    "match_phrase": {
      "title": "劉強東"
    }
  }
}
  • 優點:召回快,性能消耗小;
  • 缺點:有不小的空間消耗,顆粒度越細,消耗越大。同時,有一定的學習成本,需要對分詞器有成熟的了解,不適合新手。

這里有個明顯的使用案例,如下圖所示,使用 ngram 的 test2 索引比原來使用 keyword 的索引空間大小大了接近10倍。

圖片圖片

2.2 方案二:wildcard 查詢

使用 wildcard 查詢,這是一項支持通配符的模糊檢索功能,有點類似 SQL 中的 like 匹配。

為了實現通配符和正則表達式的查詢,Ealsticsearch 依賴的 Lucene4.0 會將輸入的字符串模式構建成一個DFA (Deterministic Finite Automaton),而帶有通配符的pattern構造出來的DFA可能會很復雜,開銷很大。

具體分析:

https://elasticsearch.cn/article/171 

https://elasticsearch.cn/article/186

  • 優點:使用簡單,也不需要額外的存儲資源。
  • 缺點:性能消耗巨大,濫用則可能會造成線上事故。

面對兩個各有所長,甚至有點“臥龍鳳雛”的方案,ES 在 7.9 版本推出了 wildcard 字段類型來解決模糊匹配的場景需求。

3、wildcard 類型使用詳解

Elasticsearch 的 wildcard 字段類型最早在 7.9 版本中引入。這個版本加入了對 wildcard 類型的支持,旨在改善模糊匹配的查詢效率和性能,特別是在處理大量文本數據時。這一新特性主要針對了之前版本中 wildcard 查詢的性能問題,提供了更高效的方式來處理通配符和正則表達式的搜索需求。

圖片圖片

https://www.elastic.co/guide/en/elasticsearch/reference/7.9/release-highlights.html

我們先來看下 wildcard 類型怎么使用:

先定義一個 wildcard 類型的字段

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "my_wildcard": {
        "type": "wildcard"
      }
    }
  }
}

為其寫入一個文檔

PUT my-index-000001/_doc/1
{
  "my_wildcard" : "This string can be quite lengthy"
}

然后使用 wildcard 查詢如下所示:

GET my-index-000001/_search
{
  "query": {
    "wildcard": {
      "my_wildcard": "*quite*lengthy"
    }
  }
}

結果為

{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 3.8610575,
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 3.8610575,
        "_source" : {
          "my_wildcard" : "This string can be quite lengthy"
        }
      }
    ]
  }
}

有時候我們需要忽略大小寫,可以在 wildcard 查詢使用 case_insensitive 參數。

GET my-index-000001/_search
{
  "query": {
    "wildcard": {
      "my_wildcard": {
        "value": "*Quite*lengthy",
        "case_insensitive": true
      }
    }
  }
}

4、wildcard 原理

關于 wildcard 字段的實現,官方在推出該字段的時候發布了相關的說明:

新的 wildcard 字段使用以下兩種數據結構以這種方式自動加速通配符和正則表達式搜索:

  • 字符串中所有3個字符序列的  n-gram 索引。
  • 完整原始文檔值的 “二進制 doc value” 存儲。第一點,底層還是 ngram 的分詞去實現模糊查詢的場景,但是這里的 ngram 顆粒度是 3,從功能上滿足了模糊查詢的需求和保證了 wildcard 查詢的高性能。

第二點,使用了 ES 中常見的正排+列存數據存儲格式 doc value,在這里一個主要的效果就是在自動查詢驗證由 n-gram 語法匹配產生匹配候選的同時利用了doc value格式相對較高的壓縮比。

5、測試

現在來看下 wildcard 實際的表現。

5.1 空間大小

如下圖所示,可以看到使用 wildcard 字段的索引與原索引相差不大。

圖片圖片

5.2 查詢效率

查詢dsl

keyword類型

wildcard類型

wildcard:”紅豆”

715ms

71ms

wildcard:”006-612014”

633ms

22ms

wildcard:”55”

584ms

188ms

wildcard:”11”

1359ms

357ms

注:這里省卻了索引詳細信息,只需知道是同一個索引的比對測試。

綜上所述,在模糊搜索字段區分度很低的情況下 如:模糊查詢單個數字,此時優化效率rt大概是之前的1/3左右,區分度高的場景rt大概是之前的1/15左右,有明顯效果。

6、小結

1.可以說 wildcard 字段類型滿足了模糊查詢的主要需求,同時也提供了相對較高的查詢性能;

2.wildcard 針對于 ngram 分詞器有著不小的空間優勢。

3.wildcard 雖然有著不小的優勢,但是查詢效率與數據的區分度有著很強的關聯,在一些區分度較低的場景下效率與性能消耗依舊很嚴重。

4.相比 ES 在精確查詢場景優秀的性能表現(即 term keyword 的高效,平穩在毫秒級的返回),wildcard 字段在模糊查詢場景下的使用還是需要研發人員根據實際場景測試選擇。

7、作者介紹

金多安,Elastic 認證專家,Elastic資深運維工程師,死磕Elasticsearch知識星球嘉賓,星球Top活躍技術專家,搜索客社區日報責任編輯

銘毅天下審稿并做了部分微調。

責任編輯:武曉燕 來源: 銘毅天下Elasticsearch
相關推薦

2023-10-11 08:36:42

復合查詢腳本查詢

2023-11-30 16:42:21

2023-10-17 15:57:52

2023-09-16 18:35:53

二分查找算法

2010-10-29 16:41:12

Oracle模糊查詢

2023-09-28 09:03:56

開源搜索分析引擎

2014-05-15 14:51:21

IBM策略智慧城市

2023-09-08 08:18:02

字段索引Mapping

2025-03-04 09:02:25

JavaSPI機制

2024-10-18 11:39:55

MySQL數據檢索

2023-11-29 08:35:28

群多租戶ES運維

2024-07-19 09:10:37

2009-09-14 18:06:18

LINQ模糊查詢

2009-06-25 16:45:31

Hibernate

2010-01-15 15:28:00

void類型

2023-04-14 12:23:15

2011-07-21 09:33:40

組策略

2023-12-07 07:51:18

2022-06-23 06:55:05

數值索引數據檢索數值查詢
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文在线一区二区 | 精品乱人伦一区二区三区 | www国产成人免费观看视频,深夜成人网 | 久久国产三级 | 成av人电影在线 | 国产免费拔擦拔擦8x高清 | 99re国产 | 欧美在线国产精品 | 欧美五月婷婷 | 亚洲一区二区三区在线 | 中文字幕第49页 | 国产精品夜夜夜一区二区三区尤 | 91素人| 亚洲视频一区 | 久久国产综合 | 国产精品美女 | 99久久日韩精品免费热麻豆美女 | www.天堂av.com | 性国产丰满麻豆videosex | 久久久久久久久一区 | 国产精品色 | 国产人成精品一区二区三 | 久久精品国产99国产精品 | 99精品久久久久久久 | 81精品国产乱码久久久久久 | 亚洲欧美一区二区三区视频 | 一级毛片视频 | 欧美日韩综合一区 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 欧美三级久久久 | 一区二区三区四区不卡视频 | 国产免费一区二区三区 | 亚洲欧美日韩中文字幕一区二区三区 | 国产精品久久久久aaaa樱花 | 国产精品久久久久久久久免费高清 | 欧美日韩一二三区 | 亚洲a视| 精品久久国产视频 | 一区二区视频在线观看 | 日韩欧美一区二区三区免费观看 | 日韩欧美在线不卡 |