【问题标题】:ElasticSearch index mapping and wildcardsElasticSearch 索引映射和通配符
【发布时间】:2017-02-02 16:19:05
【问题描述】:

我有一个 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&lt;string, object&gt; 文档设置特定的映射(不能提前完成,因为类型是 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&lt;string, object&gt; 文档上的一个键。当我读回文档时,如果我提供相同的索引(例如 acme_company_2015),一切正常

请注意,循环从给定年份到结束年份的索引(并将结果连接在一起)不是一种选择,因为系统必须具有可扩展性。此外,索引可能跨越更短的时间,比如一个月甚至更短

【问题讨论】:

    标签: c# elasticsearch asp.net-web-api nest elasticsearch-2.0


    【解决方案1】:

    我会在这里回答自己,

    事实证明,当使用acme_company_* 时,我什至匹配了另一组我没有提到的索引(即acme_company_metadata),它们没有映射。

    解决方案是只匹配acme_company_&lt;year&gt; 索引,不包括acme_company_metadata。可以收紧正则表达式以仅匹配年份

    【讨论】:

    • 很高兴你找到答案 +1 :)
    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2016-01-12
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多