Как автоматически сопоставлять свойства Elasticsearch с использованием синтаксиса инициализатора объекта NEST - PullRequest
0 голосов
/ 29 марта 2019

Есть ли способ использовать функциональность NEST AutoMap с синтаксисом инициализатора объекта?

В соответствии с руководством здесь синтаксис инициализатора объекта "полностью поддерживается на клиенте."Итак, используя пример из учебника, как мне выполнить это отображение с использованием синтаксиса Object Initializer?

.Nested<PackageDependency>(nn => nn
    .Name(pv => pv.Dependencies.First())
    .AutoMap()
)

Я пробовал это так:

new NestedProperty
{
    Name = new PropertyName(nameof(PackageVersion.Dependencies))
}

Но я могуНе удалось найти свойство для объекта NestedProperty, которое бы соответствовало AutoMap.То же самое касается TextProperty и т. Д.

Если это невозможно, я просто использую синтаксис Fluent API - без проблем.Но я хочу убедиться, что я не упускаю ничего очевидного.

1 Ответ

1 голос
/ 29 марта 2019

Вам удалось найти метод, AutoMap(), который не имеет непосредственно соответствующего аналога в синтаксисе инициализатора объекта :). Поскольку нет универсального параметра типа для представления доступного типа CLR, его нельзя смоделировать. так же.

Однако вы можете добиться того же эффекта, используя компоненты, которые AutoMap использует

var nestedProperty = new NestedProperty
{
    Name = Nest.Infer.Property<PackageVersion>(pv => pv.Dependencies.First()),
    Properties = new Properties<PackageDependency>(
        new PropertyWalker(typeof(PackageDependency), null).GetProperties())
};

, что приведет к следующему JSON, которому присвоено имя поля, разрешенное из Nest.Infer.Property<PackageVersion>(pv => pv.Dependencies.First()) (по умолчанию будет dependencies)

{
  "type": "nested",
  "properties": {
    "name": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    },
    "version": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    },
    "framework": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    }
  }
}

Если вам нужно переопределить какие-либо свойства, которые будут автоматизированы таким образом, вы можете сделать это либо с помощью IProperties, возвращенного вызовом метода .GetProperties(), либо с помощью индексатора на Properties<T>, который в этом случае равен Properties<PackageDependency> пример.

...