文本类型族
编辑文本类型族编辑
文本类型族包括以下字段类型
-
text
,用于全文内容的传统字段类型,例如电子邮件正文或产品描述。 -
match_only_text
,text
的空间优化变体,它禁用评分,并且在需要位置的查询中执行速度较慢。它最适合索引日志消息。
文本字段类型编辑
用于索引全文值的字段,例如电子邮件正文或产品描述。这些字段是 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
字段接受
用于 |
|
是否在刷新时急切加载全局序数?接受 |
|
字段是否可以在内存中使用字段数据进行排序、聚合或脚本?接受 |
|
专家设置,允许在启用 |
|
多字段允许对同一字符串值进行多种方式索引,以用于不同的目的,例如一个字段用于搜索,另一个多字段用于排序和聚合,或者同一字符串值由不同的分析器进行分析。 |
|
字段是否可搜索?接受 |
|
应在索引中存储哪些信息,用于搜索和突出显示目的。默认为 |
|
如果启用,则将 2 到 5 个字符的词语前缀索引到单独的字段中。这允许前缀搜索更有效地运行,但代价是索引更大。 |
|
如果启用,则将两个词语的组合(短语)索引到单独的字段中。这允许精确短语查询(无松弛)更有效地运行,但代价是索引更大。请注意,当停用词未被移除时,这效果最好,因为包含停用词的短语不会使用辅助字段,并且会回退到标准短语查询。接受 |
|
在评分查询时是否应考虑字段长度。接受 |
|
应在字符串数组的每个元素之间插入的虚假词语位置数量。默认为分析器上配置的 |
|
字段值是否应与 |
|
在 |
|
在遇到短语时,搜索时应使用的 |
|
应使用哪种评分算法或相似度。默认为 |
|
是否应为字段存储词语向量。默认为 |
|
有关字段的元数据。 |
合成 _source
编辑
合成 _source
仅对 TSDB 索引(将 index.mode
设置为 time_series
的索引)普遍可用。对于其他索引,合成 _source
处于技术预览阶段。技术预览中的功能可能会在将来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。
text
字段支持 合成 _source
,如果它们具有支持合成 _source
的 keyword
子字段,或者如果 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
这样的全文字段将被分析为 new
和 york
。要对这些令牌进行聚合,需要字段数据。
在启用字段数据之前编辑
通常没有必要在文本字段上启用字段数据。字段数据存储在堆中的 字段数据缓存 中,因为计算它很昂贵。计算字段数据会导致延迟峰值,而增加堆使用量会导致集群性能问题。
大多数想要对文本字段做更多操作的用户使用 多字段映射,即同时拥有用于全文搜索的 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)
在 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)
fielddata_frequency_filter
映射参数编辑
字段数据过滤可用于减少加载到内存中的术语数量,从而减少内存使用量。可以通过频率过滤术语
频率过滤器允许您仅加载文档频率介于min
和max
值之间的术语,这些值可以表示为绝对数字(当数字大于1.0时)或百分比(例如0.01
是1%
,1.0
是100%
)。频率是按段计算的。百分比基于具有字段值的文档数量,而不是段中的所有文档。
可以通过指定段应包含的最小文档数量来完全排除小段,该数量由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" } } } }
仅匹配文本字段的参数编辑
接受以下映射参数