Использование elasticsearch NEST для удаленного индекса

Вероятно, это просто я полностью наблюдаю за очевидным «недостающим звеном». В любом случае, здесь: у меня есть конечная точка elasticsearch http://distribution.virk.dk/cvr-permanent/virksomhed/_search, и я хотел бы запросить эту конечную точку. Довольно просто.

Насколько я понимаю, NEST дает вам возможность строго типизировать взаимодействие с индексом elasticsearch, почти так же, как Visual Studio создает типы для asmx/svc, когда вы добавляете ссылку на соответствующий сервис.

Итак, мой вопрос: как, черт возьми, мне перейти от знания конечной точки для индекса elasticsearch к тому, чтобы типы соответствовали индексу и выполняли запросы по индексу? Я полагаю, что ответ: «Используйте NEST!», Но все учебные пособия, которые мне удалось найти, предполагают, что у вас есть локальный индекс, который вы создаете из типа С#, который затем даст вам тип для использования в ваших запросах. Но что делать, когда это «удаленный» индекс, из которого вы должны строить свои типы?

Заранее спасибо за любой ответ, указывающий в правильном направлении!

ОБНОВЛЕНИЕ:

Я получил сопоставления в индексе, который я сократил только до поля «cvrNummer» в следующем:

{
"cvr-permanent-prod-20170205" : {
"mappings" : {
  "virksomhed" : {
    "_size" : {
      "enabled" : true
    },
    "properties" : {
      "Vrvirksomhed" : {
        "properties" : {

            "type" : "long"
          },
          "cvrNummer" : {
            "type" : "string"
          },             

          }
        }
      },          
    }
  }
  }
 }
 }

Затем я сделал следующий класс:

[ElasticsearchType(Name = "virksomhed")]
public class Company
{
    [Text(Name = "cvrNummer")]
    public string cvrNumber { get; set; }
}

Теперь все, что я хочу сделать (для начала), это найти документы, имеющие cvrNummer с определенным значением, f. бывший. "12883404". У меня есть следующий код в простом консольном приложении:

var node = new Uri("http://distribution.virk.dk/cvr-
permanent/virksomhed/_search");

        var settings = new ConnectionSettings(node).DefaultIndex("defaultindex");

        settings.BasicAuthentication("username", "password");            

        var client = new ElasticClient(settings);

Затем я пробую следующий очень простой запрос:

var searchResponse = client.Search<Company>(s => s
.Type<Company>()
.Query(q => q
     .Match(m => m
        .Field(f => f.cvrNumber)
        .Query("12883404")

И я получаю «400 неверных запросов». Что я делаю не так?


person Kim Schioett    schedule 27.11.2017    source источник


Ответы (1)


По сути, вы вручную создаете класс C# с нужными вам свойствами, а затем указываете вложенному сопоставить результаты с этим классом.

using Nest;
using System;

[ElasticsearchType(Name = "Name_Of_The_Mapping_In_Index_Mappings")]
public class MySearchType {

        [Text(Name = "_id")]
        public string Id { get; set; }

        [Date(Name = "@timestamp")]
        public DateTime Timestamp { get; set; }

        [Number(NumberType.Long, Name = "some_numeric_property_in_the_mapping")] 
        public long SomeNumericProperty { get; set; }
}

Затем вы можете ввести свои результаты в тип поиска, который вы только что определили:

Task<ISearchResponse<MySearchType>> response = await _elasticClient.SearchAsync<MySearchType>(s => s
    .Index("Name_Of_The_Index")
    .Type<MySearchType>()
    .Query(q => 
        q.Bool(bo => 
             bo.Filter( 
                 f => f.Terms(t => 
                     t.Field(searchtype => searchtype.SomeNumericProperty).Terms(request.NumericInput)),
                 /* ... */
             )
         )
     )
);

IReadOnylCollection<MySearchType> result = response.Documents;

Это объясняет, как вы можете получить имена, необходимые для создания привязки: Получить все имена индексов и типов из кластера в ElasticSearch.

person Georg Patscheider    schedule 27.11.2017
comment
Кажется, не могу заставить его работать, получая 400 неверных запросов от конечной точки. Я отредактировал свой вопрос с подробностями об услуге, пожалуйста, взгляните на это. - person Kim Schioett; 28.11.2017
comment
Работает ли это, если вы используете простой запрос без привязки к вашему типу поиска? Например. _elasticClient.Search<dynamic>(s => s.Index("Name_Of_The_Index").AllTypes().From(0).Size(10)); Просто чтобы убедиться, что _elasticClient настроен правильно.... - person Georg Patscheider; 28.11.2017
comment
AHHHHH, кажется, я нашел проблему: она работала, когда я использовал URL distribution.virk.dk/cvr- постоянный с defaultindex=virksomhed. Прежде чем он добавил index и _search к URL-адресу, указав неправильную конечную точку, т.е. distribution.virk.dk/cvr- Permanent/virksomhed/_search/virksomhed/_search. Так что теперь просто нужно сопоставить результаты с классом Company :) - person Kim Schioett; 28.11.2017
comment
Итак, вопрос сводится к следующему: как мне выполнить простой поиск, о котором я упоминал, и получить поле cvrNummer (в сопоставлении, упомянутом в обновлении вопроса), сопоставленное со свойством cvrNumber в классе Company в ответ? :) - person Kim Schioett; 28.11.2017
comment
Хм, похоже, что cvrNummer вложен внутри Vrvirksomhed; пожалуйста, попробуйте связать с [Text(Name = "Vrvirksomhed.cvrNummer")] (надеюсь, что это сработает). - person Georg Patscheider; 28.11.2017
comment
Вздох. Пробовал var searchResponse = client.Search‹Company›(s =› s.AllTypes().From(0).Size(10)); с [Текст (Имя = Vrvirksomhed.cvrNummer)]. Я получаю 10 документов с типом Company, но у них cvrNumber = null. - person Kim Schioett; 28.11.2017
comment
Теперь я попробовал поиск var searchResponse = client.Search‹Company›(s =› s .AllTypes().Query(q =› q .Match(m =› m .Field(f =› f.cvrNumber) .Query( 12883404) ) ) ); ------------------ что дает 1 совпадение, как и ожидалось, и 1 обращение имеет правильную информацию, но все же значение Vrvirksomhed.cvrNummer не привязано к Company.cvrNumber, т.е. одна компания возвращается в searchResponse.Documents, но значение cvrNumber для компании равно нулю - person Kim Schioett; 28.11.2017
comment
Вы не должны устанавливать [Text(Name = "_id")] для свойства Id. Свойство Id создает поле id в документе _source, при этом NEST использует соглашение об использовании значения свойства Id в качестве значения поля метаданных _id (которое не является частью документа _source). . - person Russ Cam; 29.11.2017
comment
Этот вопрос решен в другом моем вопросе о стеке по потоку. - person Kim Schioett; 29.11.2017