Elasticsearch クエリのイノベーション: ワイルドカード型の効率的なファジー マッチング戦略の検討

Elasticsearch クエリのイノベーション: ワイルドカード型の効率的なファジー マッチング戦略の検討

1. 背景

本番環境での使用では、Elasticsearch では完全一致だけでなく、あいまいなクエリ シナリオも必要になります。

2. 解決策についての議論

この問題には、従来から 2 つの解決策があります。

2.1 ソリューション1: ngramトークナイザー

ngram トークナイザーを使用して、保存されたデータに対してきめ細かいセグメンテーションを実行し、きめ細かいトークンを使用して高速な呼び出しを行います。

これは、スペースを使用して時間を節約し、クエリに必要なルート コンテンツを絞り込み、正確な一致結果を持つ幅広いヒットを使用してファジー効果を実現するソリューションです。

 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 ソリューション 2: ワイルドカード クエリ

ワイルドカード クエリを使用します。これは、ワイルドカードをサポートするあいまい検索機能であり、SQL の like 一致に似ています。

ワイルドカードおよび正規表現クエリを実装するために、Ealsticsearch が依存する Lucene4.0 は、入力文字列パターンを DFA (決定性有限オートマトン) に構築します。ただし、ワイルドカード パターンを使用して構築された DFA は複雑でコストがかかる可能性があります。

具体的な分析:

https://elasticsearch.cn/article/171

https://elasticsearch.cn/article/186

  • 利点: 使いやすく、追加のストレージ リソースを必要としません。
  • デメリット: 膨大なパフォーマンスを消費し、乱用するとオンライン事故を引き起こす可能性があります。

それぞれに長所があり、一部は互換性に欠ける 2 つのソリューションに直面した ES は、あいまい一致シナリオのニーズを解決するために、バージョン 7.9 でワイルドカード フィールド タイプを導入しました。

3. ワイルドカード型の使用方法の詳細な説明

Elasticsearch のワイルドカード フィールド タイプは、バージョン 7.9 で初めて導入されました。このバージョンでは、特に大量のテキスト データを処理する場合に、クエリの効率とファジー マッチングのパフォーマンスを向上させることを目的として、ワイルドカード タイプのサポートが追加されました。この新しい機能は、主に以前のバージョンのワイルドカード クエリのパフォーマンスの問題に対処し、ワイルドカードと正規表現の検索要件をより効率的に処理する方法を提供します。

写真

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

まず、ワイルドカード型の使い方を見てみましょう。

まずワイルドカードタイプのフィールドを定義します

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

文書を書く

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

ワイルドカード クエリは次のようになります。

 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" } } ] } }

大文字と小文字を区別しない場合は、ワイルドカード クエリで case_insensitive パラメータを使用できます。

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

4. ワイルドカード原則

ワイルドカード フィールドの実装に関しては、このフィールドのリリース時に公式から関連する指示が発表されました。

新しいワイルドカード フィールドは、次の 2 つのデータ構造を使用して、ワイルドカードと正規表現の検索を自動的に高速化します。

  • 文字列内のすべての 3 文字シーケンスの n-gram インデックス。
  • 「バイナリ ドキュメント値」には、元のドキュメントの完全な値が格納されます。まず、基礎レイヤーでは依然として ngram セグメンテーションを使用してファジー クエリ シナリオを実装しますが、ここでの ngram 粒度は 3 であり、機能的にはファジー クエリのニーズを満たし、ワイルドカード クエリの高パフォーマンスを保証します。

次に、ES で一般的に使用される doc 値形式が使用されます。ここでの主な効果は、doc 値形式の比較的高い圧縮率が活用され、自動クエリ検証によって n-gram 構文マッチングによって一致候補が生成されることです。

5. テスト

それでは、ワイルドカードの実際のパフォーマンスを見てみましょう。

5.1 スペースのサイズ

次の図に示すように、ワイルドカード フィールドを使用したインデックスは、元のインデックスとあまり変わらないことがわかります。

写真

5.2 クエリ効率

クエリDSL

キーワードタイプ

ワイルドカードタイプ

ワイルドカード: 「red bean」

715ミリ秒

71ミリ秒

ワイルドカード:”006-612014”

633ミリ秒

22ミリ秒

ワイルドカード:"55"

584ミリ秒

188ミリ秒

ワイルドカード:”11”

1359ミリ秒

357ミリ秒

注: 詳細なインデックス情報はここでは省略します。これは同じインデックスの比較テストであることを知っておくだけで十分です。

まとめると、単一数字のあいまいクエリなど、あいまい検索フィールドの識別力が低い場合、最適化効率 rt は以前のものの約 1/3 になります。識別力が高い場合、最適化効率 rt は以前の約 1/15 となり、明らかな効果が現れます。

6. まとめ

1. ワイルドカード フィールド タイプは、ファジー クエリの主な要件を満たし、比較的高いクエリ パフォーマンスも提供すると言えます。

2. ワイルドカードは、ngram トークナイザーに比べてスペース面で大きな利点があります。

3. ワイルドカードには大きな利点がありますが、クエリの効率はデータの識別に密接に関係しています。識別力が低いシナリオでは、効率とパフォーマンスの消費が依然として非常に深刻です。

4. 正確なクエリ シナリオでの ES の優れたパフォーマンス (つまり、用語キーワードの高効率とミリ秒単位の安定した戻り値) と比較すると、ファジー クエリ シナリオでのワイルドカード フィールドの使用には、R&D 担当者が実際のシナリオに基づいてテストおよび選択する必要があります。

7. 著者について

Jin Duoan、Elastic 認定エキスパート、Elastic シニア運用保守エンジニア、Elasticsearch ナレッジ プラネット ゲスト、プラネット トップ アクティブ テクニカル エキスパート、サーチャー コミュニティ デイリー エディター

Mingyi Tianxia が原稿を確認し、いくつかの細かい調整を加えました。

<<:  クラウド管理と運用にAIを適用する方法

>>:  コンテナ環境で「アドレスが利用できません」というメッセージが表示されたことを思い出してください

推薦する

スターを追いかける宣伝チャネルをブランドマーケティングに適用するにはどうすればよいでしょうか?

スターを追いかけるファンがアイドルを宣伝するために使用するチャネルは、私たちがマーケティングプロモー...

エッジコンピューティングとクラウドコンピューティングを1分で理解する

過去 10 年間で、ローカル コンピューティングからクラウド コンピューティングへの移行が進み、シス...

evlgaming-512m メモリ KVM/10g ハードディスク/月額 3.5 米ドル

バジェット バージョンでは、Xeon E3-1230v2 U とハード ディスク RAID 1 が使...

#クリスマス/元旦# spinservers: 米国無制限トラフィックサーバー、59ドルから、1Gbps帯域幅、E3-1280v5/32gメモリ/1T NVMe

spinservers はクリスマスと元旦のプロモーションを開始しました。米国西海岸のシリコンバレー...

上位にランクインするために、コアキーワードを中心にウェブサイトを構築しましょう

SEO はますます競争が激しくなっています。業界の競争が比較的少なく、コンテンツと外部リンクに頼るだ...

vaicdn: 無料登録アクセス、フルシナリオ加速、インテリジェント防御、香港 CN2 を含む 29 の専用回線、世界中に 2600 以上のノード

vaicdnは現在、主に「インテリジェント加速とセキュリティ保護」の専門CDNサービスを提供しており...

SpartanHost - 3.5 ドル/KVM/512 メモリ/250g ハード ドライブ/1T トラフィック/シアトル/ダラス

新興企業の SpartanHost は、主にシアトルとダラスで、HDD と SSD、DDOS 保護、...

知虎陣地戦

「疑問があれば、答えはある。」これは質疑応答コミュニティ「知乎」の新しいスローガンで、公開前の昨年の...

勤勉なSEO担当者が上司に記事のランキングを上げる方法を教える

昨年6月28日以降、百度の度重なるアルゴリズム変更により、すべてのサイトが打撃を受け、仕事を探すしか...

プレーンテキストリンクに重みがないという主張はまったくのナンセンスである

SEO に触れたことのある人なら誰でも、外部リンクの形式は 1. アンカー テキスト形式、2. ハイ...

タオバオの売り手は小さくて美しい運営の考え方を持つべきだ

電子商取引の発展により、多くの若者がインターネット上で独自のビジネスを始めるようになりました。Tao...

Amazon re:Invent: イノベーションの再発明と加速

[51CTO.comからのオリジナル記事] 今年の流行病の影響を経験した後、多くの企業もデジタル変革...

interserver: US VPS - 50% オフ、月額 3 ドルから、2G メモリ/1 コア/1T ハードディスク/2T トラフィック/1Gbps 帯域幅

interserver (1999~) のような古い企業も VPS プロモーションを開始しました。米...

分散型高並列キャッシュ設計システム

概要キャッシュの概要キャッシュとはWiki でのキャッシュの定義: データへの後続のアクセスを高速化...