Копирование вложенного свойства в родительский объект вasticsearch с помощью клиента Nest - PullRequest
0 голосов
/ 02 января 2019

Как я могу скопировать вложенное свойство в поле содержащего POCO в определении отображения индекса?

Я могу успешно скопировать свойство в другое свойство с помощью .CopyTo , когда оба поля находятся на одном уровне объекта.

Однако я пытаюсь скопировать свойство вложенного объекта в свойство родительского объекта.

Учитывая приведенные ниже объекты, я хотел бы скопировать «Улица» из свойства «Адрес» объекта «Человек» в свойство «Поиск» объекта «Персона»

.
Person
{
    public string Search { get; set; }
    public string LastName { get; set; }
    public Address Address { get; set; }
}

Address 
{
    public string Street { get; set; }
}

Отображение «LastName» в «Поиск» очень просто, как показано ниже.

.Map<Person>(map => map
                .AutoMap()
                .Properties(properties => properties
                .Text(text => 
                    text.Name(name => name.LastName)
                        .CopyTo(copyTo => 
                            copyTo.Field(field => field.Search)
                        )
                    )
                )

Однако я не могу понять синтаксис Nest для копирования «Person.Address.Street» в «Person.Search»

1 Ответ

0 голосов
/ 03 января 2019

Вот как вы можете это сделать

private static void Main()
{
    var defaultIndex = "my_index";
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));

    var settings = new ConnectionSettings(pool)
        .DefaultIndex(defaultIndex);

    var client = new ElasticClient(settings);

    if (client.IndexExists(defaultIndex).Exists)
        client.DeleteIndex(defaultIndex);

    var createIndexResponse = client.CreateIndex(defaultIndex, c => c
        .Settings(s => s
            .NumberOfShards(1)
            .NumberOfReplicas(0)
        )
        .Mappings(m => m
            .Map<Person>(mm => mm
                .AutoMap()
                .Properties(p => p
                    .Object<Address>(o => o
                        .Name(n => n.Address)
                        .AutoMap()
                        .Properties(pp => pp
                            .Text(t => t
                                .Name(nn => nn.Street)
                                .CopyTo(co => co
                                    .Field(Infer.Field<Person>(ff => ff.Search))
                                )
                            )
                        )
                    )
                )
            )
        )
    );

    var indexResponse = client.Index(new Person
        {
            LastName = "foo",
            Address = new Address
            {
                Street = "bar"
            }
        } , i => i
        .Refresh(Refresh.WaitFor)
    );

    var searchResponse = client.Search<Person>(s => s
        .Query(q => q
            .Match(m => m
                .Field(f => f.Search)
                .Query("bar")
            )
        )
    );
}

public class Person
{
    public string Search { get; set; }
    public string LastName { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public string Street { get; set; }
}

По существу

  1. Автоматическое сопоставление Person свойств
  2. Явно сопоставьте свойство Address с Person
  3. Автоматическое сопоставление Address свойств
  4. Явно сопоставьте свойство Street и настройте CopyTo(...). На этом этапе параметр универсального типа является типом Address, поэтому вам нужно либо использовать Nest.Infer.Field<T> для доступа к свойству Search Person, либо использовать строку.

Поиск возвращает ожидаемый документ

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "person",
        "_id" : "5tQDEWgBrKRHlz9qAve8",
        "_score" : 0.2876821,
        "_source" : {
          "lastName" : "foo",
          "address" : {
            "street" : "bar"
          }
        }
      }
    ]
  }
}

copy_to поля в Elasticsearch не обязательно должны быть представлены как свойство в C # POCO, так как _source не будет содержать значения для них. Экспонирование как свойство, однако, может быть полезно для доступа к полям со строгой типизацией.

...