如何使用elasticsearch索引多字段元素

How to index multi-field element with elasticsearch

我想做的是在一个索引字段下存储多种语言。我知道我需要结构 here.

这里是示例 class 多文件 属性 "Name":

public class Data
{
    public int ID { get; set; }
    public string Name { get; set; }
}

索引映射:

ElasticsearchConfiguration.Instance.Client.CreateIndex("data", i =>
                            i.Settings(s =>
                                s.NumberOfShards(2)
                                .NumberOfReplicas(0))
                            .Mappings(m =>
                                m.Map<Data>(map =>
                                map.AutoMap()
                                .Properties(ps => ps
                                    .Text(s => s
                                        .Name(n => n.Name)
                                        .Fields(f => f
                                            .Text(st => st
                                                .Name("en")
                                                .Analyzer("english"))
                                            .Text(st => st
                                                .Name("de")
                                                .Analyzer("german"))))))));

映射 "object type -> index name" 在创建 ElasticClient 时完成。这就是我将数据发送到 elasticsearch 服务器的方式:

var dataPartitions = DBUtil.GetData().Partition(1000);
foreach (var partition in dataPartitions)
{
    var result = ElasticsearchConfiguration.Instance.Client.Bulk(b => b.IndexMany(partition));
    if (!result.IsValid)
    {
        Environment.Exit(1);
    }
}

所以,我已经根据需要配置了索引,但我不知道如何在创建索引时为德语和英语子属性包含单独的值。我是否必须嵌套 class 而不是 "Name",并为每种语言(在本例中为 "en" 和 "de")设置硬编码属性?或者,也许发送单独的语言属性请求?

这里有些东西可能会有所帮助。

class Program
    {
        static void Main(string[] args)
        {
            var url = new Uri("http://localhost.fiddler:9200");
            ElasticClient db = new ElasticClient(url);
            string[] lang = { "EN", "DE" };

            db.Map<A>(des => des.AutoMap()
            .Index("a")
            .Properties(
                p => p.Object<JObject>(
                    f => f.Name(n => n.Name).Properties(
                        props => props.String(
                            fen => fen.Name(lang[0])).String(fde => fde.Name(lang[1]))))));

            foreach (var item in Enumerable.Range(0, 10).Select(i => new A
            {
                PropA = i,
                Name = new JObject
                {
                    [lang[0]] = "ABC" + i,
                    [lang[1]] = "GABC"
                }
            }))
            {
                var a = db.Index<A>(item, i => i.Index("a"));
            }


            var items = db.Search<A>(s=>s.Query(q=>q.Match(m=>m.Field("name.EN").Query("ABC1"))));

            Console.ReadLine();
        }
    }

    class A
    {
        [Number]
        public int PropA { get; set; }

        public JObject Name { get; set; }
    }