2016-11-25 2 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")))))))); 

Mapping "тип объекта -> имя индекса" делается на создание 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, one 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, только если вы не используете пользовательские анализаторы для работы на поле. вы можете добавить настраиваемый шаблон для автоматической генерации –

Смежные вопросы