繁体   English   中英

ElasticSearch索引映射和通配符

[英]ElasticSearch index mapping and wildcards

我有一个使用NEST读写ElasticSearch数据库的C#应用​​程序。 我正在存储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 ,但它不应该是相同的,映射明智?

这是我得到的实际错误:

找不到[DateTime]的映射以进行排序

DateTimeDictionary<string, object>文档上的键。 当我读回文档时,如果我提供完全相同的索引(例如acme_company_2015 ),则一切正常

请注意,由于系统必须具有可伸缩性,因此无法选择从给定年份到结束年份的索引之间循环(并将结果合并在一起)。 此外,索引的时间可能较短,例如一个月或更短

我会在这里回答自己

原来,当使用acme_company_*我甚至匹配了我没有提到的另一组没有映射的索引(即acme_company_metadata )。

解决方案是仅匹配acme_company_<year>索引,不包括acme_company_metadata 可以收紧正则表达式以仅匹配年份

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM