ElasticSearch 索引映射和通配符
ElasticSearch index mapping and wildcards
我有一个 C# 应用程序,它使用 NEST 读取和写入 ElasticSearch 数据库。我正在存储 Dictionary<string, object>
类型的文档
我还在创建索引后即时设置一些映射。我是通过 NEST 调用来完成的,见下文:
elastic.Map<Dictionary<string, object>>(m => m
.Index(indexName)
.Type("DataRecord")
.AutoMap().AllField(a => a.Enabled(false))
.Dynamic()
.DynamicTemplates(dt => dt
.DynamicTemplate("pv_values_template", t => t
.Match("ch_*")
.Mapping(m2 => m2
.Number(n => n
.Store(false)
.DocValues())))));
该调用接受一个 indexName
,这当然是我的索引的名称。我这样做是为了告诉 ElasticSearch 设置到 Dictionary<string, object>
文档的特定映射(不能提前完成,因为类型是 object
)
现在,在这个项目中,我将文档存储在不同的索引上,例如:
acme_company_2017
acme_company_2016
acme_company_2015
and so on...
每年都会创建一个新索引,设置映射并存储内容,每次都很好。
然后回读文件出现问题:
当我回读文档时,我使用的是一个特殊索引:
acme_company_*
这样我就可以在事先不知道年份的情况下检索所有年份的所有东西,只需获取数据库中存储的所有数据即可。见下文:
var dataRecordsArray = elastic.Search<Dictionary<string, object>>(searchDescriptor => searchDescriptor
.Index("acme_company_*")
.Type("DataRecord")
.Query(query =>
query.Term(dataRecord => dataRecord["GroupId"], groupId) &&
query.DateRange(dateRangeQueryDescriptor => dateRangeQueryDescriptor
.Field(dataRecord => dataRecord["DateTime"])
.GreaterThanWithStartOption(startTime.UtcDateTime, includeStartTime)
.LessThanWithEndOption(endTime.UtcDateTime, includeEndTime)))
.Size(MaximumNumberOfReturnedDocs)
.Sort(dataRecord => dataRecord.Ascending(data => data["DateTime"])))
.Documents.ToArray();
当我这样做时,ElasticSearch 引擎抱怨我选择的索引缺少映射。我知道 acme_company_*
不是 acme_company_2017
的同一个字符串,但在映射方面不应该相同吗?
这是我得到的实际错误:
No mapping found for [DateTime] in order to sort on
DateTime
是 Dictionary<string, object>
文档中的一个键。当我回读文档时,如果我提供完全相同的索引(例如 acme_company_2015
),一切正常
请注意,从给定年份到结束年份遍历索引(并将结果连接在一起)不是一种选择,因为系统必须是可扩展的。此外,索引可能跨越更短的时间,例如一个月甚至更短
我会在这里回答自己,
事实证明,当使用 acme_company_*
时,我什至匹配了另一组我没有提到的索引(即 acme_company_metadata
),它们没有映射。
解决方案是只匹配 acme_company_<year>
索引,排除 acme_company_metadata
。可以收紧正则表达式以仅匹配年份
我有一个 C# 应用程序,它使用 NEST 读取和写入 ElasticSearch 数据库。我正在存储 Dictionary<string, object>
我还在创建索引后即时设置一些映射。我是通过 NEST 调用来完成的,见下文:
elastic.Map<Dictionary<string, object>>(m => m
.Index(indexName)
.Type("DataRecord")
.AutoMap().AllField(a => a.Enabled(false))
.Dynamic()
.DynamicTemplates(dt => dt
.DynamicTemplate("pv_values_template", t => t
.Match("ch_*")
.Mapping(m2 => m2
.Number(n => n
.Store(false)
.DocValues())))));
该调用接受一个 indexName
,这当然是我的索引的名称。我这样做是为了告诉 ElasticSearch 设置到 Dictionary<string, object>
文档的特定映射(不能提前完成,因为类型是 object
)
现在,在这个项目中,我将文档存储在不同的索引上,例如:
acme_company_2017
acme_company_2016
acme_company_2015
and so on...
每年都会创建一个新索引,设置映射并存储内容,每次都很好。
然后回读文件出现问题:
当我回读文档时,我使用的是一个特殊索引:
acme_company_*
这样我就可以在事先不知道年份的情况下检索所有年份的所有东西,只需获取数据库中存储的所有数据即可。见下文:
var dataRecordsArray = elastic.Search<Dictionary<string, object>>(searchDescriptor => searchDescriptor
.Index("acme_company_*")
.Type("DataRecord")
.Query(query =>
query.Term(dataRecord => dataRecord["GroupId"], groupId) &&
query.DateRange(dateRangeQueryDescriptor => dateRangeQueryDescriptor
.Field(dataRecord => dataRecord["DateTime"])
.GreaterThanWithStartOption(startTime.UtcDateTime, includeStartTime)
.LessThanWithEndOption(endTime.UtcDateTime, includeEndTime)))
.Size(MaximumNumberOfReturnedDocs)
.Sort(dataRecord => dataRecord.Ascending(data => data["DateTime"])))
.Documents.ToArray();
当我这样做时,ElasticSearch 引擎抱怨我选择的索引缺少映射。我知道 acme_company_*
不是 acme_company_2017
的同一个字符串,但在映射方面不应该相同吗?
这是我得到的实际错误:
No mapping found for [DateTime] in order to sort on
DateTime
是 Dictionary<string, object>
文档中的一个键。当我回读文档时,如果我提供完全相同的索引(例如 acme_company_2015
),一切正常
请注意,从给定年份到结束年份遍历索引(并将结果连接在一起)不是一种选择,因为系统必须是可扩展的。此外,索引可能跨越更短的时间,例如一个月甚至更短
我会在这里回答自己,
事实证明,当使用 acme_company_*
时,我什至匹配了另一组我没有提到的索引(即 acme_company_metadata
),它们没有映射。
解决方案是只匹配 acme_company_<year>
索引,排除 acme_company_metadata
。可以收紧正则表达式以仅匹配年份