Как динамически сопоставить свойства JObject в C # с помощью Elasticsearch Nest

Я хочу динамически отображать свойства внутри JObject на C # с помощью Nest. Цель состоит в том, чтобы отобразить каждое строковое поле объекта как SearchAsYouType. Я подумал о 3 способах сделать это, которые не сработали:

  1. Используйте AutoMap и напрямую объявите атрибут в классе C #
public class Forfait
    {
        public long Id { get; set; }
        [SearchAsYouType()] 
        public string Data { get; set; }
    }
public class  Act
    {
        public JObject Entity;
    }
Forfait forfait = new Forfait()
            {
                Data = "data",
                Id = 99
            };
            Act act = new Act()
            {
                Entity = JObject.FromObject(forfait)
            };

            await client.Indices.CreateAsync("index", o => o
                .Map<Act>(m => m
                .AutoMap()

2. Используйте DynamicTemplates, но я не могу найти SearchAsYouType в сопоставлении, кажется, что его еще нет в Nest 7.4.1.

await client.Indices.CreateAsync("index", o => o
                .Map<Act>(m => m
                .DynamicTemplates(d =>d
                    .DynamicTemplate("stringassearch",dt => dt
                        .Match("entity.*")
                        .MatchMappingType("string")
                        .Mapping(ma =>ma
                            .)))));

3. Используйте Visitor, чтобы заставить каждую строку быть SearchAsYouType

public class EveryStringIsASearchAsYouTypePropertyVisitor : NoopPropertyVisitor
    {
        public override IProperty Visit(PropertyInfo propertyInfo, ElasticsearchPropertyAttributeBase attribute)
        {
            if (propertyInfo.PropertyType == typeof(String))
                return new SearchAsYouTypeProperty();
            return null;
        }
    }
await client.Indices.CreateAsync("index", o => o
                .Map<Act>(m => m
                .AutoMap(new EveryStringIsASearchAsYouTypePropertyVisitor(),2)

Все не удалось

У меня такое чувство, что решение находится в NEST.JsonNetSerializer, чтобы каким-то образом применить настройки, используемые в сопоставлении, внутри JObject, но я не смог найти ничего полезного.


person vlayk    schedule 05.12.2019    source источник


Ответы (1)


2. Используйте DynamicTemplates, но я не могу найти SearchAsYouType в сопоставлении, кажется, что его еще нет в Nest 7.4.1.

Вы правы, похоже, что он отсутствует в SingleMappingSelector, но вы можете легко обойти это с помощью этого класса расширения, который добавит поддержку типа search_as_you_type.

static class MappingExtension
{
    public static IProperty SearchAsYouType<T>(this SingleMappingSelector<T> mappingSelector, 
        Func<SearchAsYouTypePropertyDescriptor<T>, ISearchAsYouTypeProperty> selector) where T : class
    => selector?.Invoke(new SearchAsYouTypePropertyDescriptor<T>());
} 

а затем вы можете создать свой динамический шаблон, например,

var createIndexResponse = await client.Indices.CreateAsync("index", o => o
    .Map<Act>(m => m
        .AutoMap<Act>()
        .DynamicTemplates(d => d
            .DynamicTemplate("stringassearch", dt => dt
                .PathMatch("entity.*")
                .MatchMappingType("string")
                .Mapping(ma => ma.SearchAsYouType(s => s))))));

Обратите внимание, я изменил Match(..) на PathMatch(..) - думаю, это то, что вам нужно. Кроме того, мне пришлось изменить определение Act на

public class  Act
{
    public object Entity;
}

После индексирования образца документа это отображение индекса было создано

{
  "index": {
    "mappings": {
      "dynamic_templates": [
        {
          "stringassearch": {
            "path_match": "entity.*",
            "match_mapping_type": "string",
            "mapping": {
              "type": "search_as_you_type"
            }
          }
        }
      ],
      "properties": {
        "entity": {
          "properties": {
            "data": {
              "type": "search_as_you_type",
              "max_shingle_size": 3
            },
            "id": {
              "type": "long"
            }
          }
        }
      }
    }
  }
}

Вот проблема с GH.

Надеюсь, это поможет.

person Rob    schedule 05.12.2019