首页 > 解决方案 > 字典项目的 ElasticSearch/NEST 索引策略

问题描述

我有一个包含字段的文档模型,该字段是一个字典,可以采用任何值,如下所示:

public class Document
{
    public string Id { get; set; }

    public string Description { get; set; }

    public Dictionary<string, object> Permissions { get; set; }

    public Dictionary<string, object> Metadata { get; set; }
}

例如

client.IndexDocument(new Document
{
    Id = "4",
    Description = "ordinary document",
    Metadata = new Dictionary<string, object>
    {
        { "publish_date", new DateTime(1930, 10, 11) },
        { "author_country", "RU" },
        { "salary", 2590.00 },
        { "likes", 23 },
    }
})

映射是自动完成的,因此默认分析器会更改字典的值,例如:将字符串更改为小写或删除破折号,因此此代码不会返回任何结果:

var result = client.Search<Document>(s => s
    .Query(q =>
        q.Term(new Field("metadata.author_country"), "RU"))
    );

如何为任何元数据值禁用此行为?或者设置自定义分析器?或者 - 仅对给定类型的值禁用它?

标签: c#elasticsearchnest

解决方案


您应该将文档字段的映射设置为正确的类型。在此处查看更多信息: https ://www.elastic.co/guide/en/elasticsearch/reference/7.10/mapping.html 所有类型都在此处列出: https ://www.elastic.co/guide/en/ elasticsearch/reference/7.10/mapping-types.html

要在 Nest 中执行此操作,您需要将正确的属性添加到文档定义中。

在此处查看详细信息: https ://www.elastic.co/guide/en/elasticsearch/client/net-api/current/attribute-mapping.html

如果我了解您要执行的操作,则需要将元数据类型设置为嵌套,因为您要搜索元数据:

https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html


推荐阅读