Elasticsearch Nest Client - поиск вложенных свойств - PullRequest
2 голосов
/ 17 апреля 2019

Мне сложно найти информацию о том, как искать вложенные свойства с помощью клиента Nest в C #.

У меня есть объекты электронной почты в индексе с примерно такой формой:

    {
      subject: “This is a test”,
      content: “This is an email written as a test of the Elasticsearch system.  Thanks, Mr Tom Jones”,
      custodians: [
        {
          firstName: “Tom”,
          lastName: “Jones”,
          routeType: 0
        },
        {
          firstName: “Matthew”,
          lastName: “Billsley”,
          routeType: 1
        }
      ]
    }

Вы должны увидеть, что там есть массив, называемый хранителями, который представляет собой список всех отправителей и получателей электронной почты. В конструкторе запросов в стиле Fluent в .Net я могу создать запрос очень хорошо, когда я использую тему, контент и другие свойства «первого уровня». Но я могу включить в некоторые запросы только хранителей, у которых routeType = 0. Кажется, я не могу найти каких-либо указаний о том, как этого добиться. Есть идеи?

Например, запрос для термина «пикник» в поле темы будет выглядеть так:

Client.SearchAsync(m => m
  .Query(q => q
    .Match(f => f
      .Field(msg => msg.Subject)
      .Query(“picnic”))));

Каким будет запрос на получение сообщений только из индекса с routeType = 0 и lastName = «Jones»?

К вашему сведению: это относится к форумам Elasticsearch. Если я получу хорошее предложение, я добавлю его сюда.

1 Ответ

2 голосов
/ 18 апреля 2019

Если вы хотите получать сообщения, у которых есть хранитель с routeType == 0:

Client.SearchAsync(m => m
  .Query(q => q
    .Term(t => t
      .Field(msg => msg.Custodians[0].RouteType)
      .Value(0))));

Если вы хотите получать сообщения, у которых есть хранитель с lastName == "jones":

Client.SearchAsync(m => m
  .Query(q => q
    .Term(t => t
      .Field(msg => msg.Custodians[0].LastName)
      .Value("jones"))));

Если вы хотите получать сообщения, у которых есть хранитель с lastName == "jones" AND routeType == 0:

Client.SearchAsync(m => m
  .Query(q => q
    .Nested(t => t
      .Path(msg => msg.Custodians)
      .Query(nq =>
        nq.Term(t => t.Field(msg => msg.Custodians[0].RouteType).Value(0) &&
        ng.Term(t => t.Field(msg => msg.Custodians[0].LastName).Value("jones")
      )
    )
  )
);

Обратите внимание, что custodians необходимо будет отобразить как вложенное поле, чтобы последний запрос работал как положено. См. здесь для получения дополнительной информации о вложенных полях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...