テキストタイプファミリー

テキストファミリーには以下のフィールドタイプが含まれます:

  • text、メールの本文や商品の説明などのフルテキストコンテンツのための従来のフィールドタイプ。
  • match_only_text、スコアリングを無効にし、位置が必要なクエリでは遅くなるtextのスペース最適化バリアント。ログメッセージのインデックス作成に最適です。

テキストフィールドタイプ

メールの本文や商品の説明など、フルテキスト値をインデックスするためのフィールドです。これらのフィールドはanalyzedであり、analyzerを通じて文字列を個々の用語のリストに変換してからインデックスされます。分析プロセスにより、Elasticsearchは各フルテキストフィールド内の個々の単語を検索できます。テキストフィールドはソートには使用されず、集約にはほとんど使用されません(ただし、significant text aggregationは顕著な例外です)。

textフィールドは、非構造的で人間が読みやすいコンテンツに最適です。非構造的な機械生成コンテンツをインデックスする必要がある場合は、Mapping unstructured contentを参照してください。

メールアドレス、ホスト名、ステータスコード、またはタグなどの構造化されたコンテンツをインデックスする必要がある場合は、keywordフィールドを使用する方が良いでしょう。

以下はテキストフィールドのマッピングの例です:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "full_name": {
  6. "type": "text"
  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. full_name: {
  7. type: 'text'
  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. full_name: {
  6. type: "text",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);

Console

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

テキストとキーワードの両方としてフィールドを使用する

時には、同じフィールドのフルテキスト(text)とキーワード(keyword)の両方のバージョンを持つことが便利です:一つはフルテキスト検索用、もう一つは集約とソート用です。これはmulti-fieldsを使用して実現できます。

テキストフィールドのパラメータ

以下のパラメータはtextフィールドで受け入れられます:

analyzer textフィールドに使用されるべきanalyzer、インデックス時と検索時の両方で(search_analyzerによってオーバーライドされない限り)。デフォルトはデフォルトインデックスアナライザー、またはstandard analyzerです。
eager_global_ordinals グローバルオーディナルをリフレッシュ時に早期にロードする必要がありますか?trueまたはfalse(デフォルト)を受け入れます。これを有効にすることは、(重要な)用語の集約に頻繁に使用されるフィールドでは良い考えです。
fielddata フィールドはソート、集約、またはスクリプトに使用するためにメモリ内フィールドデータを使用できますか?trueまたはfalse(デフォルト)を受け入れます。
fielddata_frequency_filter fielddataが有効な場合にメモリにロードする値を決定するための専門的な設定。デフォルトではすべての値がロードされます。
fields マルチフィールドは、異なる目的のために同じ文字列値を複数の方法でインデックスすることを可能にします。たとえば、検索用のフィールドと、ソートおよび集約用のマルチフィールド、または異なるアナライザーで分析された同じ文字列値です。
index フィールドは検索可能であるべきですか?true(デフォルト)またはfalseを受け入れます。
index_options 検索およびハイライト目的でインデックスに保存されるべき情報。デフォルトはpositionsです。
index_prefixes 有効にすると、2から5文字の間の用語プレフィックスが別のフィールドにインデックスされます。これにより、プレフィックス検索がより効率的に実行されますが、インデックスが大きくなります。
index_phrases 有効にすると、2語の組み合わせ(shingles)が別のフィールドにインデックスされます。これにより、正確なフレーズクエリ(スロップなし)がより効率的に実行されますが、インデックスが大きくなります。ストップワードが削除されない場合に最も効果的です。ストップワードを含むフレーズは補助フィールドを使用せず、標準のフレーズクエリに戻ります。trueまたはfalse(デフォルト)を受け入れます。
norms スコアリングクエリの際にフィールドの長さを考慮するべきか。true(デフォルト)またはfalseを受け入れます。
position_increment_gap 文字列の配列の各要素の間に挿入されるべき偽の用語位置の数。デフォルトはposition_increment_gapで、アナライザーで設定され、デフォルトは100です。100は、フレーズクエリが合理的に大きなスロップ(100未満)を持つ場合に、フィールド値をまたいで用語が一致するのを防ぐために選ばれました。
store フィールド値は、_sourceフィールドから別に保存され、取得可能であるべきですか?trueまたはfalse(デフォルト)を受け入れます。このパラメータは、index.modetime_seriesに設定されているTSDBインデックス(index.modetime_seriesに設定されているインデックス)に対してtrueに自動的に設定されます。keyword(491649a654160c3a.md#keyword-synthetic-source “Synthetic _source”)補助フィールドが合成_sourceをサポートしていない場合。
search_analyzer textフィールドで検索時に使用されるべきanalyzer. デフォルトはanalyzer設定です。
search_quote_analyzer フレーズが遭遇したときに検索時に使用されるべきanalyzer. デフォルトはsearch_analyzer設定です。
similarity 使用するスコアリングアルゴリズムまたは類似性。デフォルトはBM25です。
term_vector フィールドのために用語ベクターが保存されるべきか。デフォルトはnoです。
meta フィールドに関するメタデータ。

合成 _source

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

  1. サブ-`````keyword`````フィールドを使用する場合、値は`````keyword`````フィールドの値がソートされるのと同じ方法でソートされます。デフォルトでは、重複を削除してソートされます。したがって:
  2. #### Python
  3. ``````python
  4. resp = client.indices.create(
  5. index="idx",
  6. mappings={
  7. "_source": {
  8. "mode": "synthetic"
  9. },
  10. "properties": {
  11. "text": {
  12. "type": "text",
  13. "fields": {
  14. "raw": {
  15. "type": "keyword"
  16. }
  17. }
  18. }
  19. }
  20. },
  21. )
  22. print(resp)
  23. resp1 = client.index(
  24. index="idx",
  25. id="1",
  26. document={
  27. "text": [
  28. "the quick brown fox",
  29. "the quick brown fox",
  30. "jumped over the lazy dog"
  31. ]
  32. },
  33. )
  34. print(resp1)
  35. `

Ruby

  1. response = client.indices.create(
  2. index: 'idx',
  3. body: {
  4. mappings: {
  5. _source: {
  6. mode: 'synthetic'
  7. },
  8. properties: {
  9. text: {
  10. type: 'text',
  11. fields: {
  12. raw: {
  13. type: 'keyword'
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }
  20. )
  21. puts response
  22. response = client.index(
  23. index: 'idx',
  24. id: 1,
  25. body: {
  26. text: [
  27. 'the quick brown fox',
  28. 'the quick brown fox',
  29. 'jumped over the lazy dog'
  30. ]
  31. }
  32. )
  33. puts response

Js

  1. const response = await client.indices.create({
  2. index: "idx",
  3. mappings: {
  4. _source: {
  5. mode: "synthetic",
  6. },
  7. properties: {
  8. text: {
  9. type: "text",
  10. fields: {
  11. raw: {
  12. type: "keyword",
  13. },
  14. },
  15. },
  16. },
  17. },
  18. });
  19. console.log(response);
  20. const response1 = await client.index({
  21. index: "idx",
  22. id: 1,
  23. document: {
  24. text: [
  25. "the quick brown fox",
  26. "the quick brown fox",
  27. "jumped over the lazy dog",
  28. ],
  29. },
  30. });
  31. console.log(response1);

Console

  1. PUT idx
  2. {
  3. "mappings": {
  4. "_source": { "mode": "synthetic" },
  5. "properties": {
  6. "text": {
  7. "type": "text",
  8. "fields": {
  9. "raw": {
  10. "type": "keyword"
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }
  17. PUT idx/_doc/1
  18. {
  19. "text": [
  20. "the quick brown fox",
  21. "the quick brown fox",
  22. "jumped over the lazy dog"
  23. ]
  24. }

次のようになります:

Console-Result

  1. {
  2. "text": [
  3. "jumped over the lazy dog",
  4. "the quick brown fox"
  5. ]
  6. }

テキストフィールドの順序を変更すると、phraseおよびspanクエリに影響を与える可能性があります。詳細については、position_increment_gapに関する議論を参照してください。フレーズクエリのslopパラメータがposition_increment_gapよりも低いことを確認することで、これを回避できます。これはデフォルトです。

  1. #### Python
  2. ``````python
  3. resp = client.indices.create(
  4. index="idx",
  5. mappings={
  6. "_source": {
  7. "mode": "synthetic"
  8. },
  9. "properties": {
  10. "text": {
  11. "type": "text",
  12. "store": True
  13. }
  14. }
  15. },
  16. )
  17. print(resp)
  18. resp1 = client.index(
  19. index="idx",
  20. id="1",
  21. document={
  22. "text": [
  23. "the quick brown fox",
  24. "the quick brown fox",
  25. "jumped over the lazy dog"
  26. ]
  27. },
  28. )
  29. print(resp1)
  30. `

Ruby

  1. response = client.indices.create(
  2. index: 'idx',
  3. body: {
  4. mappings: {
  5. _source: {
  6. mode: 'synthetic'
  7. },
  8. properties: {
  9. text: {
  10. type: 'text',
  11. store: true
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response
  18. response = client.index(
  19. index: 'idx',
  20. id: 1,
  21. body: {
  22. text: [
  23. 'the quick brown fox',
  24. 'the quick brown fox',
  25. 'jumped over the lazy dog'
  26. ]
  27. }
  28. )
  29. puts response

Js

  1. const response = await client.indices.create({
  2. index: "idx",
  3. mappings: {
  4. _source: {
  5. mode: "synthetic",
  6. },
  7. properties: {
  8. text: {
  9. type: "text",
  10. store: true,
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);
  16. const response1 = await client.index({
  17. index: "idx",
  18. id: 1,
  19. document: {
  20. text: [
  21. "the quick brown fox",
  22. "the quick brown fox",
  23. "jumped over the lazy dog",
  24. ],
  25. },
  26. });
  27. console.log(response1);

Console

  1. PUT idx
  2. {
  3. "mappings": {
  4. "_source": { "mode": "synthetic" },
  5. "properties": {
  6. "text": { "type": "text", "store": true }
  7. }
  8. }
  9. }
  10. PUT idx/_doc/1
  11. {
  12. "text": [
  13. "the quick brown fox",
  14. "the quick brown fox",
  15. "jumped over the lazy dog"
  16. ]
  17. }

次のようになります:

Console-Result

  1. {
  2. "text": [
  3. "the quick brown fox",
  4. "the quick brown fox",
  5. "jumped over the lazy dog"
  6. ]
  7. }

フィールドデータマッピングパラメータ

  1. フィールドデータをメモリにロードすると、かなりのメモリを消費する可能性があります。
  2. フィールドデータは、集約、ソート、またはスクリプトでフルテキストフィールドから分析されたトークンにアクセスする唯一の方法です。たとえば、`````New York`````のようなフルテキストフィールドは`````new`````および`````york`````として分析されます。これらのトークンで集約するには、フィールドデータが必要です。
  3. ## フィールドデータを有効にする前に
  4. 通常、テキストフィールドでフィールドデータを有効にすることは意味がありません。フィールドデータは、計算が高価であるため、[フィールドデータキャッシュ](/read/elasticsearch-8-15/e814025c9e229ec0.md)とともにヒープに保存されます。フィールドデータの計算はレイテンシスパイクを引き起こす可能性があり、ヒープ使用量の増加はクラスターのパフォーマンス問題の原因となります。
  5. テキストフィールドでより多くのことを行いたいユーザーは、[`````text`````]フィールドをフルテキスト検索用に持ち、集約用に未分析の[`````keyword`````](/read/elasticsearch-8-15/491649a654160c3a.md)フィールドを持つ[multi-field mappings](/read/elasticsearch-8-15/e6000d5e836ad5dd.md)を使用することが多いです。次のように:
  6. #### Python
  7. ``````python
  8. resp = client.indices.create(
  9. index="my-index-000001",
  10. mappings={
  11. "properties": {
  12. "my_field": {
  13. "type": "text",
  14. "fields": {
  15. "keyword": {
  16. "type": "keyword"
  17. }
  18. }
  19. }
  20. }
  21. },
  22. )
  23. print(resp)
  24. `

Ruby

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

Go

  1. res, err := es.Indices.Create(
  2. "my-index-000001",
  3. es.Indices.Create.WithBody(strings.NewReader(`{
  4. "mappings": {
  5. "properties": {
  6. "my_field": {
  7. "type": "text",
  8. "fields": {
  9. "keyword": {
  10. "type": "keyword"
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }`)),
  17. )
  18. fmt.Println(res, err)

Js

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

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "my_field": {
  6. "type": "text",
  7. "fields": {
  8. "keyword": {
  9. "type": "keyword"
  10. }
  11. }
  12. }
  13. }
  14. }
  15. }
my_fieldフィールドを検索に使用します。
my_field.keywordフィールドを集約、ソート、またはスクリプトで使用します。

テキストフィールドでのフィールドデータの有効化

既存のtextフィールドでフィールドデータを有効にするには、update mapping APIを次のように使用します:

Python

  1. resp = client.indices.put_mapping(
  2. index="my-index-000001",
  3. properties={
  4. "my_field": {
  5. "type": "text",
  6. "fielddata": True
  7. }
  8. },
  9. )
  10. print(resp)

Ruby

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

Go

  1. res, err := es.Indices.PutMapping(
  2. []string{"my-index-000001"},
  3. strings.NewReader(`{
  4. "properties": {
  5. "my_field": {
  6. "type": "text",
  7. "fielddata": true
  8. }
  9. }
  10. }`),
  11. )
  12. fmt.Println(res, err)

Js

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

Console

  1. PUT my-index-000001/_mapping
  2. {
  3. "properties": {
  4. "my_field": {
  5. "type": "text",
  6. "fielddata": true
  7. }
  8. }
  9. }
my_fieldに指定するマッピングは、そのフィールドの既存のマッピングとfielddataパラメータを含むべきです。

フィールドデータ頻度フィルターマッピングパラメータ

フィールドデータフィルタリングは、メモリにロードされる用語の数を減らし、したがってメモリ使用量を減らすために使用できます。用語は頻度によってフィルタリングできます:

頻度フィルターは、ドキュメント頻度がminmaxの間にある用語のみをロードすることを許可します。これは、絶対数(数が1.0より大きい場合)またはパーセンテージ(例:0.011%で、1.0100%)として表現できます。頻度はセグメントごとに計算されます。パーセンテージは、フィールドに値を持つドキュメントの数に基づいており、セグメント内のすべてのドキュメントに基づいているわけではありません。

小さなセグメントは、min_segment_sizeでセグメントが含むべき最小ドキュメント数を指定することによって完全に除外できます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "tag": {
  6. "type": "text",
  7. "fielddata": True,
  8. "fielddata_frequency_filter": {
  9. "min": 0.001,
  10. "max": 0.1,
  11. "min_segment_size": 500
  12. }
  13. }
  14. }
  15. },
  16. )
  17. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. tag: {
  7. type: 'text',
  8. fielddata: true,
  9. fielddata_frequency_filter: {
  10. min: 0.001,
  11. max: 0.1,
  12. min_segment_size: 500
  13. }
  14. }
  15. }
  16. }
  17. }
  18. )
  19. puts response

Go

  1. res, err := es.Indices.Create(
  2. "my-index-000001",
  3. es.Indices.Create.WithBody(strings.NewReader(`{
  4. "mappings": {
  5. "properties": {
  6. "tag": {
  7. "type": "text",
  8. "fielddata": true,
  9. "fielddata_frequency_filter": {
  10. "min": 0.001,
  11. "max": 0.1,
  12. "min_segment_size": 500
  13. }
  14. }
  15. }
  16. }
  17. }`)),
  18. )
  19. fmt.Println(res, err)

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. tag: {
  6. type: "text",
  7. fielddata: true,
  8. fielddata_frequency_filter: {
  9. min: 0.001,
  10. max: 0.1,
  11. min_segment_size: 500,
  12. },
  13. },
  14. },
  15. },
  16. });
  17. console.log(response);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "tag": {
  6. "type": "text",
  7. "fielddata": true,
  8. "fielddata_frequency_filter": {
  9. "min": 0.001,
  10. "max": 0.1,
  11. "min_segment_size": 500
  12. }
  13. }
  14. }
  15. }
  16. }

マッチ専用テキストフィールドタイプ

textのバリアントで、スコアリングと位置クエリの効率をスペース効率と交換します。このフィールドは、textフィールドと同じ方法でデータを効果的に保存し、ドキュメントをインデックスするだけで(index_options: docs)ノルムを無効にします(norms: false)。用語クエリはtextフィールドと同じくらい速く、場合によってはそれよりも速く実行されますが、match_phraseクエリのように位置が必要なクエリは、フレーズが一致するかどうかを確認するために_sourceドキュメントを確認する必要があるため、遅くなります。すべてのクエリは、1.0に等しい定数スコアを返します。

分析は構成可能ではありません:テキストは常にデフォルトアナライザーstandardがデフォルト)で分析されます。

span queriesはこのフィールドではサポートされていません。代わりにinterval queriesを使用するか、絶対にspan queriesが必要な場合はtextフィールドタイプを使用してください。

それ以外は、match_only_texttextと同じクエリをサポートします。そして、textのように、ソートをサポートせず、集約には限られたサポートしかありません。

Python

  1. resp = client.indices.create(
  2. index="logs",
  3. mappings={
  4. "properties": {
  5. "@timestamp": {
  6. "type": "date"
  7. },
  8. "message": {
  9. "type": "match_only_text"
  10. }
  11. }
  12. },
  13. )
  14. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'logs',
  3. body: {
  4. mappings: {
  5. properties: {
  6. "@timestamp": {
  7. type: 'date'
  8. },
  9. message: {
  10. type: 'match_only_text'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.indices.create({
  2. index: "logs",
  3. mappings: {
  4. properties: {
  5. "@timestamp": {
  6. type: "date",
  7. },
  8. message: {
  9. type: "match_only_text",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

Console

  1. PUT logs
  2. {
  3. "mappings": {
  4. "properties": {
  5. "@timestamp": {
  6. "type": "date"
  7. },
  8. "message": {
  9. "type": "match_only_text"
  10. }
  11. }
  12. }
  13. }

マッチ専用テキストフィールドのパラメータ

以下のマッピングパラメータが受け入れられます:

fields マルチフィールドは、異なる目的のために同じ文字列値を複数の方法でインデックスすることを可能にします。たとえば、検索用のフィールドと、ソートおよび集約用のマルチフィールド、または異なるアナライザーで分析された同じ文字列値です。
meta フィールドに関するメタデータ。