入力中検索フィールドタイプ

search_as_you_type フィールドタイプは、入力中の補完ユースケースに対応するクエリを即座にサポートするように最適化されたテキストのようなフィールドです。これは、インデックスされたテキスト値全体に部分的に一致するクエリによって効率的に一致できる用語をインデックスするために分析される一連のサブフィールドを作成します。プレフィックス補完(つまり、入力の先頭から始まる用語の一致)とインフィックス補完(つまり、入力内の任意の位置での用語の一致)の両方がサポートされています。

このタイプのフィールドをマッピングに追加する際

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "my_field": {
  6. "type": "search_as_you_type"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. my_field: {
  7. type: 'search_as_you_type'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response

Js

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

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "my_field": {
  6. "type": "search_as_you_type"
  7. }
  8. }
  9. }
  10. }

次のフィールドが作成されます

my_field マッピングで設定されたように分析されます。アナライザーが設定されていない場合、
デフォルトのインデックスアナライザーが使用されます
my_field._2gram my_field のアナライザーをシングルトークンフィルターのシングルサイズ2でラップします
my_field._3gram my_field のアナライザーをシングルトークンフィルターのシングルサイズ3でラップします
my_field._index_prefix my_field._3gram のアナライザーをエッジngramトークンフィルターでラップします

サブフィールドのシングルサイズは、max_shingle_size マッピングパラメータで設定できます。デフォルトは3で、このパラメータの有効な値は整数値2 - 4(含む)です。シングルサブフィールドは、2からmax_shingle_sizeを含む各シングルサイズのために作成されます。my_field._index_prefix サブフィールドは、max_shingle_size を持つシングルサブフィールドのアナライザーを使用して常に自身のアナライザーを構築します。

max_shingle_size を増加させることで、より多くの連続した用語を持つクエリの一致が改善されますが、インデックスサイズが大きくなります。デフォルトの max_shingle_size は通常十分です。

同じ入力テキストは、インデックスされたドキュメントがルートフィールド my_field の値を持つときに、自動的にこれらのフィールドにインデックスされ、異なる分析チェーンを持ちます。

Python

  1. resp = client.index(
  2. index="my-index-000001",
  3. id="1",
  4. refresh=True,
  5. document={
  6. "my_field": "quick brown fox jump lazy dog"
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 1,
  4. refresh: true,
  5. body: {
  6. my_field: 'quick brown fox jump lazy dog'
  7. }
  8. )
  9. puts response

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 1,
  4. refresh: "true",
  5. document: {
  6. my_field: "quick brown fox jump lazy dog",
  7. },
  8. });
  9. console.log(response);

コンソール

  1. PUT my-index-000001/_doc/1?refresh
  2. {
  3. "my_field": "quick brown fox jump lazy dog"
  4. }

入力中検索ユースケースに対応するための最も効率的なクエリ方法は、通常、ルート search_as_you_type フィールドとそのシングルサブフィールドをターゲットにした multi_match タイプの bool_prefix クエリです。これは、クエリ用語を任意の順序で一致させることができますが、シングルサブフィールド内で用語が順序通りに含まれている場合、ドキュメントのスコアが高くなります。

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. query={
  4. "multi_match": {
  5. "query": "brown f",
  6. "type": "bool_prefix",
  7. "fields": [
  8. "my_field",
  9. "my_field._2gram",
  10. "my_field._3gram"
  11. ]
  12. }
  13. },
  14. )
  15. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. body: {
  4. query: {
  5. multi_match: {
  6. query: 'brown f',
  7. type: 'bool_prefix',
  8. fields: [
  9. 'my_field',
  10. 'my_field._2gram',
  11. 'my_field._3gram'
  12. ]
  13. }
  14. }
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. query: {
  4. multi_match: {
  5. query: "brown f",
  6. type: "bool_prefix",
  7. fields: ["my_field", "my_field._2gram", "my_field._3gram"],
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. GET my-index-000001/_search
  2. {
  3. "query": {
  4. "multi_match": {
  5. "query": "brown f",
  6. "type": "bool_prefix",
  7. "fields": [
  8. "my_field",
  9. "my_field._2gram",
  10. "my_field._3gram"
  11. ]
  12. }
  13. }
  14. }

コンソール-結果

  1. {
  2. "took" : 44,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 1,
  13. "relation" : "eq"
  14. },
  15. "max_score" : 0.8630463,
  16. "hits" : [
  17. {
  18. "_index" : "my-index-000001",
  19. "_id" : "1",
  20. "_score" : 0.8630463,
  21. "_source" : {
  22. "my_field" : "quick brown fox jump lazy dog"
  23. }
  24. }
  25. ]
  26. }
  27. }

クエリ用語を厳密に順序通りに一致させるドキュメントを検索するには、またはフレーズクエリの他のプロパティを使用するには、ルートフィールドに対して match_phrase_prefix クエリ](/read/elasticsearch-8-15/75ea6f189133f3ff.md) を使用します。最後の用語を正確に一致させる必要がある場合は、match_phrase クエリ も使用できます。フレーズクエリを使用することは、match_bool_prefix クエリを使用するよりも効率が悪い場合があります。

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. query={
  4. "match_phrase_prefix": {
  5. "my_field": "brown f"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. body: {
  4. query: {
  5. match_phrase_prefix: {
  6. my_field: 'brown f'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. query: {
  4. match_phrase_prefix: {
  5. my_field: "brown f",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET my-index-000001/_search
  2. {
  3. "query": {
  4. "match_phrase_prefix": {
  5. "my_field": "brown f"
  6. }
  7. }
  8. }

search_as_you_type フィールドに特有のパラメータ

次のパラメータは、search_as_you_type フィールドのマッピングで受け入れられ、このフィールドタイプに特有です

  • max_shingle_size
  • (オプション、整数)作成する最大シングルサイズ。有効な値は 2(含む)から 4(含む)です。デフォルトは 3 です。
    2 とこの値の間の各整数のためにサブフィールドが作成されます。たとえば、3 の値は、my_field._2grammy_field._3gram の2つのサブフィールドを作成します。
    より多くのサブフィールドは、より特定のクエリを可能にしますが、インデックスサイズが増加します。

テキストフィールドとしてのフィールドタイプのパラメータ

次のパラメータは、search_as_you_type フィールドのマッピングで受け入れられ、その性質上、text データタイプのフィールドを構成する際の動作に似ています。特に記載がない限り、これらのオプションはルートフィールドのサブフィールドを同じ方法で構成します。

  • analyzer
  • text フィールドに使用されるべき analyzer、インデックス時と検索時の両方(search_analyzer によってオーバーライドされない限り)。デフォルトはデフォルトのインデックスアナライザー、または standard アナライザー です。
  • index
  • フィールドは検索可能であるべきですか? true(デフォルト)または false を受け入れます。
  • index_options
  • 検索およびハイライト目的でインデックスに保存されるべき情報。デフォルトは positions です。
  • norms
  • クエリのスコアリング時にフィールドの長さを考慮するべきかどうか。true または false を受け入れます。このオプションはルートフィールドとシングルサブフィールドを構成し、そのデフォルトは true です。プレフィックスサブフィールドは false です。
  • store
  • フィールド値は、_source フィールドから別々に保存および取得可能であるべきですか。true または false(デフォルト)を受け入れます。このオプションはルートフィールドのみを構成し、サブフィールドは構成しません。
  • search_analyzer
  • analyzer が検索時に text フィールドで使用されるべきです。デフォルトは analyzer 設定です。
  • search_quote_analyzer
  • フレーズが出現したときに検索時に使用されるべき analyzer 。デフォルトは search_analyzer 設定です。
  • similarity
  • どのスコアリングアルゴリズムまたは類似性が使用されるべきか。デフォルトは BM25 です。
  • term_vector
  • フィールドのために用語ベクターが保存されるべきか。デフォルトは no です。このオプションはルートフィールドとシングルサブフィールドを構成しますが、プレフィックスサブフィールドは構成しません。

プレフィックスクエリの最適化

ルートフィールドまたはそのサブフィールドのいずれかに対して prefix クエリを行うと、クエリは ._index_prefix サブフィールドに対する term クエリに書き換えられます。これは、prefix テキストフィールドに対するクエリの典型的なものよりも効率的に一致します。各シングルの特定の長さまでのプレフィックスが ._index_prefix サブフィールドの用語として直接インデックスされるためです。

._index_prefix サブフィールドのアナライザーは、通常はシングルとして生成されないフィールドの値の末尾にある用語のプレフィックスもインデックスするようにシングルビルディングの動作をわずかに修正します。たとえば、quick brown fox の値が search_as_you_type フィールドに max_shingle_size が3の状態でインデックスされると、brown foxfox のプレフィックスも ._index_prefix サブフィールドにインデックスされます。._3gram サブフィールドに用語として表示されないにもかかわらず、これによりフィールドの入力内のすべての用語の補完が可能になります。

合成 _source

合成 _source は、一般的に TSDB インデックス(index.modetime_series に設定されているインデックス)に対してのみ利用可能です。他のインデックスに対しては、合成 _source は技術プレビュー中です。技術プレビューの機能は、将来のリリースで変更または削除される可能性があります。Elastic は問題を修正するために作業しますが、技術プレビューの機能は公式 GA 機能のサポート SLA の対象ではありません。

search_as_you_type フィールドは、デフォルト構成で 合成 _source をサポートします。合成 _source は、copy_to と一緒に使用することはできません。