セマンティックテキストフィールドタイプ

この機能はベータ版であり、変更される可能性があります。デザインとコードは公式GA機能よりも成熟しておらず、保証なしでそのまま提供されています。ベータ機能は公式GA機能のサポートSLAの対象外です。

  1. `````semantic_text`````フィールドタイプは、埋め込みを生成するために使用される推論エンドポイント識別子を指定します。推論エンドポイントは、[推論APIを作成する](/read/elasticsearch-8-15/6b7f8edc0ca95c25.md)ことによって作成できます。このフィールドタイプと[`````semantic`````クエリ](/read/elasticsearch-8-15/0841af9d0321790c.md)タイプは、データに対してセマンティック検索を実行するのを簡単にします。
  2. `````semantic_text`````を使用すると、データの埋め込みを生成する方法や、インデックスを作成する方法を指定する必要がなくなります。推論エンドポイントは、埋め込み生成、インデックス作成、および使用するクエリを自動的に決定します。
  3. #### Python
  4. ``````python
  5. resp = client.indices.create(
  6. index="my-index-000001",
  7. mappings={
  8. "properties": {
  9. "inference_field": {
  10. "type": "semantic_text",
  11. "inference_id": "my-elser-endpoint"
  12. }
  13. }
  14. },
  15. )
  16. print(resp)
  17. `

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. inference_field: {
  6. type: "semantic_text",
  7. inference_id: "my-elser-endpoint",
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "inference_field": {
  6. "type": "semantic_text",
  7. "inference_id": "my-elser-endpoint"
  8. }
  9. }
  10. }
  11. }

セマンティックテキストフィールドのパラメータ

  • inference_id
  • (必須、文字列) フィールドの埋め込みを生成するために使用される推論エンドポイント。エンドポイントを作成するには、推論APIを作成するを使用してください。

推論エンドポイントの検証

  1. 推論エンドポイントを削除すると、その推論エンドポイントを`````inference_id`````として定義した`````semantic_text`````フィールドを持つインデックスでのドキュメントの取り込みとセマンティッククエリが失敗します。削除する前に、`````semantic_text`````フィールドで推論エンドポイントが使用されているかどうかを確認してください。
  2. ## 自動テキストチャンク化
  3. 推論エンドポイントには、処理できるテキストの量に制限があります。セマンティック検索で大量のテキストを使用できるようにするために、`````semantic_text`````は必要に応じて小さなパッセージを自動的に生成します。これを*チャンク*と呼びます。
  4. 各チャンクには、テキストのサブパッセージと、それから生成された対応する埋め込みが含まれます。クエリを実行する際には、各ドキュメントの個々のパッセージが自動的に検索され、最も関連性の高いパッセージがスコアを計算するために使用されます。
  5. ドキュメントは、100語のオーバーラップを持つ250語のセクションに分割され、各セクションは前のセクションと100語を共有します。このオーバーラップは連続性を確保し、入力テキストの重要な文脈情報がハードブレークによって失われるのを防ぎます。
  6. ## セマンティックテキスト構造
  7. ドキュメントが取り込まれると、`````semantic_text`````フィールドは次の構造を持ちます:
  8. [](#08ac29f8fbac92b4f7fd58f00fb1fc25)
  9. #### コンソール-結果
  10. ``````console-result
  11. "inference_field": {
  12. "text": "these are not the droids you're looking for",
  13. "inference": {
  14. "inference_id": "my-elser-endpoint",
  15. "model_settings": {
  16. "task_type": "sparse_embedding"
  17. },
  18. "chunks": [
  19. {
  20. "text": "these are not the droids you're looking for",
  21. "embeddings": {
  22. (...)
  23. }
  24. }
  25. ]
  26. }
  27. }
  28. `
フィールドは、元のテキストと推論結果の両方を収容するオブジェクト構造になります。
埋め込みを生成するために使用されるinference_id
モデル設定、タスクタイプおよび次元/類似性(該当する場合)。
推論結果はチャンクにグループ化され、それぞれに対応するテキストと埋め込みが含まれます。

semantic_textを参照して、semantic_textsemanticクエリを使用したセマンティック検索について詳しく学んでください。

セマンティックテキストインデックスのカスタマイズ

  1. データインデックスをカスタマイズしたい場合は、[`````sparse_vector`````](/read/elasticsearch-8-15/888a5235abbb544b.md)または[`````dense_vector`````](/read/elasticsearch-8-15/4f3a837ec0911c14.md)フィールドタイプを使用し、埋め込みを生成するために[推論プロセッサ](/read/elasticsearch-8-15/63f3b321ac81a067.md)を持つ取り込みパイプラインを作成します。[このチュートリアル](/read/elasticsearch-8-15/18d9630c558bb22f.md)では、そのプロセスを説明します。この場合、`````sparse_vector`````または`````dense_vector`````フィールドタイプを使用してインデックスをカスタマイズする代わりに、[`````semantic_query`````](/read/elasticsearch-8-15/0841af9d0321790c.md)を使用してフィールドデータをクエリすることはサポートされていません。
  2. ## セマンティックテキストフィールドの更新
  3. スクリプトを使用した更新は、`````semantic_text`````フィールドを含むインデックスではサポートされていません。スクリプトが非`````semantic_text`````フィールドをターゲットにしていても、インデックスに`````semantic_text`````フィールドが含まれている場合、更新は失敗します。
  4. ## copy_toサポート
  5. `````semantic_text`````フィールドタイプは、[`````copy_to`````フィールド](/read/elasticsearch-8-15/d491ec9c7d061b3b.md)のターゲットになることができます。これは、セマンティック検索のために他のフィールドの値を収集するために単一の`````semantic_text`````フィールドを使用できることを意味します。各値は別々に埋め込みが計算され、各フィールド値は結果の埋め込みの別々のチャンクセットです。
  6. これにより、`````semantic_text`````フィールドを持つドキュメントを更新するバルクリクエストおよび取り込みパイプラインに制限が課されます。この場合、`````semantic_text`````フィールドにコピーされるすべてのフィールド、`````semantic_text`````フィールド値を含むは、すべての埋め込みが正しく計算されることを保証するために値を持っている必要があります。
  7. 例えば、次のマッピング:
  8. #### Python
  9. ``````python
  10. resp = client.indices.create(
  11. index="test-index",
  12. mappings={
  13. "properties": {
  14. "infer_field": {
  15. "type": "semantic_text",
  16. "inference_id": "my-elser-endpoint"
  17. },
  18. "source_field": {
  19. "type": "text",
  20. "copy_to": "infer_field"
  21. }
  22. }
  23. },
  24. )
  25. print(resp)
  26. `

Js

  1. const response = await client.indices.create({
  2. index: "test-index",
  3. mappings: {
  4. properties: {
  5. infer_field: {
  6. type: "semantic_text",
  7. inference_id: "my-elser-endpoint",
  8. },
  9. source_field: {
  10. type: "text",
  11. copy_to: "infer_field",
  12. },
  13. },
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT test-index
  2. {
  3. "mappings": {
  4. "properties": {
  5. "infer_field": {
  6. "type": "semantic_text",
  7. "inference_id": "my-elser-endpoint"
  8. },
  9. "source_field": {
  10. "type": "text",
  11. "copy_to": "infer_field"
  12. }
  13. }
  14. }
  15. }
  1. #### Python
  2. ``````python
  3. resp = client.bulk(
  4. index="test-index",
  5. operations=[
  6. {
  7. "update": {
  8. "_id": "1"
  9. }
  10. },
  11. {
  12. "doc": {
  13. "infer_field": "updated inference field",
  14. "source_field": "updated source field"
  15. }
  16. }
  17. ],
  18. )
  19. print(resp)
  20. `

Js

  1. const response = await client.bulk({
  2. index: "test-index",
  3. operations: [
  4. {
  5. update: {
  6. _id: "1",
  7. },
  8. },
  9. {
  10. doc: {
  11. infer_field: "updated inference field",
  12. source_field: "updated source field",
  13. },
  14. },
  15. ],
  16. });
  17. console.log(response);

コンソール

  1. PUT test-index/_bulk
  2. {"update": {"_id": "1"}}
  3. {"doc": {"infer_field": "updated inference field", "source_field": "updated source field"}}

semantic_textフィールドとソースフィールドの両方がバルクリクエストで更新されることに注意してください。

制限

semantic_textフィールドタイプには、次の制限があります:

  • semantic_textフィールドは、現在nested fieldsの要素としてサポートされていません。
  • semantic_textフィールドは、他のフィールドのmulti-fieldsとして定義できず、他のフィールドをmulti-fieldsとして含むこともできません。