2016-11-25 47 views
0

我想要做的是在一个索引字段下存储多种语言。我知道我需要结构,如解释here如何使用elasticsearch索引多字段元素

下面是示例类与多日提交的属性“名称”:

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”)而不是嵌套类而不是“名称”?或者,也许发送单独的语言属性请求?

+0

对不起你想在同一个值应用于多个分析仪(多国语言的一个名称)或有需要用正确的分析(一个德国名字,一个英文名进行分析多个值......这可以有)? –

+0

第二个选项。我知道我可以做到这一点,如果我有Data类中的属性,比如Name_EN,Name_DE。我试图避免在添加新语言后更新Data类。如果没有,我会为每种语言创建单独的索引,但后来我有可能重复的结果问题(一个en,一个de) – drazen

回答

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

不错的建议,谢谢。所以,我必须拥有那些每种语言的属性,无论是静态的还是动态的。 – drazen

+0

@drazen只有当你不需要定制分析仪才能在现场工作时。您可以为自动生成添加自定义模板 –

相关问题