文本类型族编辑

文本类型族包括以下字段类型

  • text,用于全文内容的传统字段类型,例如电子邮件正文或产品描述。
  • match_only_texttext 的空间优化变体,它禁用评分,并且在需要位置的查询中执行速度较慢。它最适合索引日志消息。

文本字段类型编辑

用于索引全文值的字段,例如电子邮件正文或产品描述。这些字段是 analyzed,也就是说它们被传递给 分析器 以将字符串转换为单个词语列表,然后进行索引。分析过程允许 Elasticsearch 在每个全文字段中搜索单个词语。文本字段不用于排序,很少用于聚合(尽管 显著文本聚合 是一个值得注意的例外)。

text 字段最适合非结构化但人类可读的内容。如果您需要索引非结构化的机器生成内容,请参阅 映射非结构化内容

如果您需要索引结构化内容,例如电子邮件地址、主机名、状态代码或标签,您可能应该使用 keyword 字段。

以下是一个文本字段映射的示例

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        full_name: {
          type: 'text'
        }
      }
    }
  }
)
puts response
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "full_name": {
        "type":  "text"
      }
    }
  }
}

将字段用作文本和关键字编辑

有时,同时拥有全文 (text) 和关键字 (keyword) 版本的同一字段非常有用:一个用于全文搜索,另一个用于聚合和排序。这可以通过 多字段 实现。

文本字段的参数编辑

以下参数被 text 字段接受

analyzer

用于 text 字段的 分析器,在索引时和搜索时都使用(除非被 search_analyzer 覆盖)。默认为默认索引分析器,或 standard 分析器

eager_global_ordinals

是否在刷新时急切加载全局序数?接受 truefalse(默认)。在经常用于(显著)术语聚合的字段上启用此选项是一个好主意。

fielddata

字段是否可以在内存中使用字段数据进行排序、聚合或脚本?接受 truefalse(默认)。

fielddata_frequency_filter

专家设置,允许在启用 fielddata 时决定哪些值加载到内存中。默认情况下,所有值都会被加载。

fields

多字段允许对同一字符串值进行多种方式索引,以用于不同的目的,例如一个字段用于搜索,另一个多字段用于排序和聚合,或者同一字符串值由不同的分析器进行分析。

index

字段是否可搜索?接受 true(默认)或 false

index_options

应在索引中存储哪些信息,用于搜索和突出显示目的。默认为 positions

index_prefixes

如果启用,则将 2 到 5 个字符的词语前缀索引到单独的字段中。这允许前缀搜索更有效地运行,但代价是索引更大。

index_phrases

如果启用,则将两个词语的组合(短语)索引到单独的字段中。这允许精确短语查询(无松弛)更有效地运行,但代价是索引更大。请注意,当停用词未被移除时,这效果最好,因为包含停用词的短语不会使用辅助字段,并且会回退到标准短语查询。接受 truefalse(默认)。

norms

在评分查询时是否应考虑字段长度。接受 true(默认)或 false

position_increment_gap

应在字符串数组的每个元素之间插入的虚假词语位置数量。默认为分析器上配置的 position_increment_gap,该值默认为 100。选择 100 是因为它可以防止具有合理大松弛度(小于 100)的短语查询跨字段值匹配词语。

store

字段值是否应与 _source 字段分开存储和检索。接受 truefalse(默认)。如果不存在支持合成 _sourcekeyword 子字段,则此参数将自动设置为 true,用于 TSDB 索引(将 index.mode 设置为 time_series 的索引)。

search_analyzer

text 字段上搜索时应使用的 analyzer。默认为 analyzer 设置。

search_quote_analyzer

在遇到短语时,搜索时应使用的 analyzer。默认为 search_analyzer 设置。

similarity

应使用哪种评分算法或相似度。默认为 BM25

term_vector

是否应为字段存储词语向量。默认为 no

meta

有关字段的元数据。

合成 _source编辑

合成 _source 仅对 TSDB 索引(将 index.mode 设置为 time_series 的索引)普遍可用。对于其他索引,合成 _source 处于技术预览阶段。技术预览中的功能可能会在将来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。

text 字段支持 合成 _source,如果它们具有支持合成 _sourcekeyword 子字段,或者如果 text 字段将 store 设置为 true。无论哪种方式,它可能都没有 copy_to

如果使用子 keyword 字段,则值的排序方式与 keyword 字段的值排序方式相同。默认情况下,这意味着按排序顺序删除重复项。所以

response = client.indices.create(
  index: 'idx',
  body: {
    mappings: {
      _source: {
        mode: 'synthetic'
      },
      properties: {
        text: {
          type: 'text',
          fields: {
            raw: {
              type: 'keyword'
            }
          }
        }
      }
    }
  }
)
puts response

response = client.index(
  index: 'idx',
  id: 1,
  body: {
    text: [
      'the quick brown fox',
      'the quick brown fox',
      'jumped over the lazy dog'
    ]
  }
)
puts response
PUT idx
{
  "mappings": {
    "_source": { "mode": "synthetic" },
    "properties": {
      "text": {
        "type": "text",
        "fields": {
          "raw": {
            "type": "keyword"
          }
        }
      }
    }
  }
}
PUT idx/_doc/1
{
  "text": [
    "the quick brown fox",
    "the quick brown fox",
    "jumped over the lazy dog"
  ]
}

将变成

{
  "text": [
    "jumped over the lazy dog",
    "the quick brown fox"
  ]
}

重新排序文本字段会影响 短语跨度 查询。有关更多详细信息,请参阅有关 position_increment_gap 的讨论。您可以通过确保短语查询上的 slop 参数小于 position_increment_gap 来避免这种情况。这是默认设置。

如果 text 字段将 store 设置为 true,则会保留顺序和重复项。

response = client.indices.create(
  index: 'idx',
  body: {
    mappings: {
      _source: {
        mode: 'synthetic'
      },
      properties: {
        text: {
          type: 'text',
          store: true
        }
      }
    }
  }
)
puts response

response = client.index(
  index: 'idx',
  id: 1,
  body: {
    text: [
      'the quick brown fox',
      'the quick brown fox',
      'jumped over the lazy dog'
    ]
  }
)
puts response
PUT idx
{
  "mappings": {
    "_source": { "mode": "synthetic" },
    "properties": {
      "text": { "type": "text", "store": true }
    }
  }
}
PUT idx/_doc/1
{
  "text": [
    "the quick brown fox",
    "the quick brown fox",
    "jumped over the lazy dog"
  ]
}

将变成

{
  "text": [
    "the quick brown fox",
    "the quick brown fox",
    "jumped over the lazy dog"
  ]
}

fielddata 映射参数编辑

text 字段默认情况下是可搜索的,但默认情况下不可用于聚合、排序或脚本。如果您尝试使用脚本对 text 字段进行排序、聚合或访问值,您将看到一个异常,表明文本字段上的字段数据默认情况下是禁用的。要在内存中加载字段数据,请在您的字段上设置 fielddata=true

在内存中加载字段数据可能会消耗大量内存。

字段数据是在聚合、排序或脚本中访问全文字段的分析令牌的唯一方法。例如,像 New York 这样的全文字段将被分析为 newyork。要对这些令牌进行聚合,需要字段数据。

在启用字段数据之前编辑

通常没有必要在文本字段上启用字段数据。字段数据存储在堆中的 字段数据缓存 中,因为计算它很昂贵。计算字段数据会导致延迟峰值,而增加堆使用量会导致集群性能问题。

大多数想要对文本字段做更多操作的用户使用 多字段映射,即同时拥有用于全文搜索的 text 字段和用于聚合的未分析的 keyword 字段,如下所示

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        my_field: {
          type: 'text',
          fields: {
            keyword: {
              type: 'keyword'
            }
          }
        }
      }
    }
  }
)
puts response
res, err := es.Indices.Create(
	"my-index-000001",
	es.Indices.Create.WithBody(strings.NewReader(`{
	  "mappings": {
	    "properties": {
	      "my_field": {
	        "type": "text",
	        "fields": {
	          "keyword": {
	            "type": "keyword"
	          }
	        }
	      }
	    }
	  }
	}`)),
)
fmt.Println(res, err)
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "my_field": { 
        "type": "text",
        "fields": {
          "keyword": { 
            "type": "keyword"
          }
        }
      }
    }
  }
}

使用 my_field 字段进行搜索。

使用 my_field.keyword 字段进行聚合、排序或在脚本中使用。

text 字段上启用字段数据编辑

您可以使用 更新映射 API 在现有 text 字段上启用字段数据,如下所示

response = client.indices.put_mapping(
  index: 'my-index-000001',
  body: {
    properties: {
      my_field: {
        type: 'text',
        fielddata: true
      }
    }
  }
)
puts response
res, err := es.Indices.PutMapping(
	[]string{"my-index-000001"},
	strings.NewReader(`{
	  "properties": {
	    "my_field": {
	      "type": "text",
	      "fielddata": true
	    }
	  }
	}`),
)
fmt.Println(res, err)
PUT my-index-000001/_mapping
{
  "properties": {
    "my_field": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

您为 my_field 指定的映射应包含该字段的现有映射,以及 fielddata 参数。

fielddata_frequency_filter 映射参数编辑

字段数据过滤可用于减少加载到内存中的术语数量,从而减少内存使用量。可以通过频率过滤术语

频率过滤器允许您仅加载文档频率介于minmax值之间的术语,这些值可以表示为绝对数字(当数字大于1.0时)或百分比(例如0.011%1.0100%)。频率是按段计算的。百分比基于具有字段值的文档数量,而不是段中的所有文档。

可以通过指定段应包含的最小文档数量来完全排除小段,该数量由min_segment_size指定。

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        tag: {
          type: 'text',
          fielddata: true,
          fielddata_frequency_filter: {
            min: 0.001,
            max: 0.1,
            min_segment_size: 500
          }
        }
      }
    }
  }
)
puts response
res, err := es.Indices.Create(
	"my-index-000001",
	es.Indices.Create.WithBody(strings.NewReader(`{
	  "mappings": {
	    "properties": {
	      "tag": {
	        "type": "text",
	        "fielddata": true,
	        "fielddata_frequency_filter": {
	          "min": 0.001,
	          "max": 0.1,
	          "min_segment_size": 500
	        }
	      }
	    }
	  }
	}`)),
)
fmt.Println(res, err)
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "tag": {
        "type": "text",
        "fielddata": true,
        "fielddata_frequency_filter": {
          "min": 0.001,
          "max": 0.1,
          "min_segment_size": 500
        }
      }
    }
  }
}

仅匹配文本字段类型编辑

text的变体,它以空间效率为代价换取了位置查询的评分和效率。此字段有效地以与仅索引文档的text字段相同的方式存储数据(index_options: docs)并禁用规范(norms: false)。术语查询的执行速度与text字段一样快,甚至更快,但是需要位置的查询(例如match_phrase查询)执行速度较慢,因为它们需要查看_source文档以验证短语是否匹配。所有查询都返回等于1.0的常数分数。

分析不可配置:文本始终使用默认分析器(默认情况下为standard)进行分析。

跨度查询不支持此字段,请改用间隔查询,或者如果绝对需要跨度查询,请使用text字段类型。

除此之外,match_only_text支持与text相同的查询。与text一样,它不支持排序,并且对聚合的支持有限。

response = client.indices.create(
  index: 'logs',
  body: {
    mappings: {
      properties: {
        "@timestamp": {
          type: 'date'
        },
        message: {
          type: 'match_only_text'
        }
      }
    }
  }
)
puts response
PUT logs
{
  "mappings": {
    "properties": {
      "@timestamp": {
        "type": "date"
      },
      "message": {
        "type": "match_only_text"
      }
    }
  }
}

仅匹配文本字段的参数编辑

接受以下映射参数

fields

多字段允许对同一字符串值进行多种方式索引,以用于不同的目的,例如一个字段用于搜索,另一个多字段用于排序和聚合,或者同一字符串值由不同的分析器进行分析。

meta

有关字段的元数据。