技術共有

Elasticsearch: レトリーバーの紹介 - すべてを検索

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

著者: from Elasticジェフ・ヴェスタル, ジャック・コンラドソン

8.14 では、Elasticsearch に「レトリバー」と呼ばれる新しい検索機能が導入されました。この記事を読んで、そのシンプルさと効率性、そして検索操作をどのように強化できるかについて学びましょう。

レトリバーは、Elasticsearch の検索 API に追加された新しい抽象化レイヤーです。これらは、単一の _search API 呼び出しで複数段階の取得パイプラインを構成する機能を提供します。このアーキテクチャにより、複雑な検索クエリに対する複数の Elasticsearch API 呼び出しの必要性がなくなり、アプリケーションの検索ロジックが簡素化されます。また、多くの場合、複数のクエリの結果を結合する必要があるクライアント側のロジックの必要性も軽減されます。

レトリーバーの初期タイプ

初回リリースでは3種類のレトリバーが付属。それぞれのレトリバーは特定の目的のために設計されており、組み合わせることで複雑な検索を実行できます。

利用可能なタイプは次のとおりです。

  • 標準 - 従来のクエリでトップレベルのドキュメントを返します。これらのタイプは、既存のクエリ DSL リクエスト構文をサポートすることで下位互換性があり、自分のペースでクローラー フレームワークに移行できます。
  • ケーエヌエヌ - kNN 検索で上位のドキュメントを返します。
  • ロシア連邦 - 相互融合アルゴリズムを使用して、ユーザーによる調整をまったく行わないか、最小限に抑えながら、複数の第 1 段階のレトリバーを単一の結果セットに結合してランク付けします。 RRF リトリーバーは、そのフィルター要素がその子リトリーバーに伝播される複合リトリーバーです。

レトリバーとどう違うの?なぜ役に立つのでしょうか?

従来のクエリの場合、クエリは全体的な検索 API 呼び出しの一部です。レトリバーは、個別に使用したり、簡単に組み合わせたりできる独立したエンティティとして設計されているという点で異なります。このモジュール式のアプローチにより、検索戦略を設計する際の柔軟性が向上します。

レトリバーは、検索操作の順序とロジックを明確にすることで検索操作を定義する階層構造である「レトリーバー ツリー」の一部として設計されています。この構造により、複雑な検索がより管理しやすくなり、開発者にとって理解しやすくなり、将来的に新しい機能を簡単に追加できるようになります。

Retriever はコンポーザビリティをサポートしているため、パイプラインを構築し、さまざまな取得戦略を統合できます。これにより、さまざまな検索の組み合わせを簡単にテストできます。また、ドキュメントのスコア付けとフィルタリングの方法をより詳細に制御できるようになります。たとえば、最小スコアしきい値を指定したり、スコアに影響を与えずに複雑なフィルターを適用したり、パフォーマンスの最適化のために terminate_after などのパラメーターを使用したりできます。

従来のクエリ要素との下位互換性を維持し、それらを適切な取得要素に自動的に変換します。

検索使用例

レトリバーの使用例をいくつか見てみましょう。 IMDB サンプル データ セットを使用します。

付属のものを実行できます ジュピターノート、IMDB データをサーバーレス検索プロジェクトにインポートし、次の例を自分で実行してください。

高レベルの設定は次のとおりです。

  • 概要 - 映画の短い概要
  • 名前 - 映画の名前
  • overview_dense - e5-small モデルから生成された dense_vector
  • overview_sparse - Elastic の ELSER モデルを使用したスパース ベクトル。
  • フィールドのみを使用し、_source:false を設定すると、名前と概要のテキスト バージョンが返されます。

標準 - すべてのテキストを検索します。

  1. GET /imdb_movies/_search?pretty
  2. {
  3. "retriever": {
  4. "standard": {
  5. "query": {
  6. "term": {
  7. "overview": "clueless"
  8. }
  9. }
  10. }
  11. },
  12. "size": 3,
  13. "fields": [
  14. "names",
  15. "overview"
  16. ],
  17. "_source": false
  18. }

kNN - すべての密なベクトルを検索!

  1. GET /imdb_movies/_search?pretty
  2. {
  3. "retriever": {
  4. "knn": {
  5. "field": "overview_dense",
  6. "query_vector_builder": {
  7. "text_embedding": {
  8. "model_id": ".multilingual-e5-small_linux-x86_64",
  9. "model_text": "clueless slackers"
  10. }
  11. },
  12. "k": 5,
  13. "num_candidates": 5
  14. }
  15. },
  16. "size": 3,
  17. "fields": [
  18. "names",
  19. "overview"
  20. ],
  21. "_source": false
  22. }

text_expansion - すべてのスパース ベクトルを検索します。

  1. GET /imdb_movies/_search?pretty
  2. {
  3. "retriever": {
  4. "standard": {
  5. "query": {
  6. "text_expansion": {
  7. "overview_sparse": {
  8. "model_id": ".elser_model_2_linux-x86_64",
  9. "model_text": "clueless slackers"
  10. }
  11. }
  12. }
  13. }
  14. },
  15. "size": 3,
  16. "fields": [
  17. "names",
  18. "overview"
  19. ],
  20. "_source": false
  21. }

rrf - すべてを組み合わせます!

  1. GET /imdb_movies/_search?pretty
  2. {
  3. "retriever": {
  4. "rrf": {
  5. "retrievers": [
  6. {
  7. "standard": {
  8. "query": {
  9. "term": {
  10. "overview": "clueless slackers"
  11. }
  12. }
  13. }
  14. },
  15. {
  16. "knn": {
  17. "field": "overview_dense",
  18. "query_vector_builder": {
  19. "text_embedding": {
  20. "model_id": ".multilingual-e5-small_linux-x86_64",
  21. "model_text": "clueless slackers"
  22. }
  23. },
  24. "k": 5,
  25. "num_candidates": 5
  26. }
  27. },
  28. {
  29. "standard": {
  30. "query": {
  31. "text_expansion": {
  32. "overview_sparse": {
  33. "model_id": ".elser_model_2_linux-x86_64",
  34. "model_text": "clueless slackers"
  35. }
  36. }
  37. }
  38. }
  39. }
  40. ],
  41. "rank_window_size": 5,
  42. "rank_constant": 1
  43. }
  44. },
  45. "size": 3,
  46. "fields": [
  47. "names",
  48. "overview"
  49. ],
  50. "_source": false
  51. }

レトリーバーの現在の限界

レトリーバーには、ユーザーが注意しなければならない特定の制限があります。たとえば、複合レトリーバーを使用すると、要素のみをクエリできます。これにより、関心事がより明確に分離され、過剰なネストや独立した構成に伴う複雑さが回避されます。さらに、子レトリバーは、複合レトリバーをレトリーバー ツリーの一部に制限する要素を使用してはなりません。

これらの制限により、複雑な取得戦略を使用する場合でもパフォーマンスと構成可能性が向上します。

レトリーバーは当初テクノロジー プレビューとしてリリースされるため、API は変更される可能性があります

結論は

検索者は、Elasticsearch の検索機能と使いやすさにおいて重要な前進を表します。これらはパイプライン形式でチェーンでき、各取得者がそのロジックを適用し、結果をチェーン内の次の項目に渡します。レトリバーは、より構造化され、柔軟で効率的な検索操作を可能にすることで、検索エクスペリエンスを大幅に向上させることができます。

次のリソースでは、レトリバーについて詳しく説明します。

上記のコードを自分で試してみてください。走れるよ付属のjupyterノートブック, IMDB データを Elastic Serverless Search プロジェクトにインポートします。

自分で試してみる準備はできましたか?始める無料トライアル
Elastic 認定を取得したいですか?次回調べてくださいElasticsearchエンジニアトレーニングいつ始めるか!

オリジナル:Elasticsearch リトリーバー - Elasticsearch で検索リトリーバーを使用する方法 — Elastic Search Labs