【问题标题】:How to index multi-field element with elasticsearch如何使用elasticsearch索引多字段元素
【发布时间】:2016-11-27 09:42:51
【问题描述】:

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

这是具有多字段属性“名称”的示例类:

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"))))))));

映射“对象类型 -> 索引名称”是在创建 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);
    }
}

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

【问题讨论】:

  • 抱歉,您是在尝试对同一个值应用多个分析器(一个名称用于多种语言),还是有多个值需要使用正确的分析器进行分析(一个德语名称,一个英文名称.. . 那可以有)?
  • 第二个选项。我知道如果我在 Data 类中有 Name_EN、Name_DE 等属性,我可以做到这一点。我正在尝试的是避免在添加新语言后更新 Data 类。如果没有,我将为每种语言创建单独的索引,但是我遇到了可能重复的结果(一个 en,一个 de)

标签: c# .net elasticsearch nest


【解决方案1】:

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

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; }
    }

【讨论】:

  • 不错的建议,谢谢。所以,我必须拥有这些每种语言的属性,无论是静态的还是动态的。
  • @drazen 仅当您不希望自定义分析器在现场工作时。您可以为自动生成添加自定义模板
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多