fielddata
编辑
默认情况下,大多数字段都被编入索引,这使得它们可以搜索。但是,对脚本中的字段值进行排序,聚合和访问需要使用不同的搜索访问模式。
搜索需要回答“哪个文档包含此术语?”的问题。虽然排序和聚合需要回答一个不同的问题:“ 这个文档的价值是什么?” 。
doc_values
对于此数据访问模式,大多数字段可以使用磁盘上的索引时间,但text
字段不支持doc_values
。
相反,text
字段使用称为查询时的内存中数据结构 fielddata
。第一次将字段用于聚合,排序或脚本时,此数据结构是根据需要构建的。它是通过从磁盘读取每个段的整个反向索引,反转术语↔︎文档关系,并将结果存储在内存中的JVM堆中构建的。
text
默认情况下,在字段上禁用Fielddata编辑
Fielddata可能会消耗大量的堆空间,尤其是在加载高基数text
字段时。一旦fielddata已加载到堆中,它将在该段的生命周期内保留。此外,加载fielddata是一个昂贵的过程,可能会导致用户遇到延迟命中。这就是默认情况下禁用fielddata的原因。
如果您尝试对text
字段上的脚本进行排序,聚合或访问,您将看到以下异常:
默认情况下,在文本字段上禁用Fielddata。设置
fielddata=true
为[your_field_name
],以便通过反转索引来加载内存中的fielddata。请注意,这可能会占用大量内存。
在启用fielddata 编辑之前
在启用fielddata之前,请考虑使用text
字段进行聚合,排序或脚本的原因。这样做通常没有意义。
在索引之前分析文本字段,以便New York
通过搜索new
或查找可以找到类似的值 york
。当您可能需要调用单个存储桶时terms
,此字段上的聚合将返回new
存储桶和york
存储桶New York
。
相反,您应该有一个text
用于全文搜索的字段,以及一个 启用了聚合的未分析keyword
字段doc_values
,如下所示:
PUT my_index
{
“映射”:{
“_doc”:{
“properties”:{
“my_field”:{
“type”:“text”,
“fields”:{
“keyword”:{
“type”:“关键字”
}
}
}
}
}
}
}
在text
字段上启用fielddata编辑
您可以text
使用PUT映射API在现有字段 上启用fielddata ,如下所示:
PUT my_index / _mapping / _doc
{
“properties”:{
“my_field”:{
“type”:“text”,
“fielddata”:是的
}
}
}
fielddata_frequency_filter
编辑
Fielddata过滤可用于减少加载到内存中的术语数量,从而减少内存使用量。条款可按频率过滤:
频率过滤器允许您仅加载文档频率介于a min
和max
值之间的术语,该值可以表示为绝对数字(当数字大于1.0时)或百分比(例如,0.01
是1%
和1.0
是100%
)。每段计算频率 。百分比基于具有该字段值的文档数,而不是该段中的所有文档。
通过指定细分受众群应包含的最小文档数量,可以完全排除小细分min_segment_size
:
PUT my_index
{
“映射”:{
“_doc”:{
“properties”:{
“标签”: {
“type”:“text”,
“fielddata”:是的,
“fielddata_frequency_filter”:{
“min”:0.001,
“max”:0.1,
“min_segment_size”:500
}
}
}
}
}
}