Клиент Elasticsearch.net не может выполнять базовый поиск

У меня есть базовый запрос Elasticsearch, который выглядит так

POST /fruit/_search
{"query":{"term":{"Name":"banana"}}}

Я получаю результат обратно, никаких проблем, когда я бегу в смысле.

Поэтому я пытаюсь сделать это в elasticsearch.net.

var requestBody = new { query = new { term = new { Name = "banana" } } };
                var result = client.Search<string>("fruit", requestBody);

И я не получаю никаких результатов обратно. Если у меня просто есть тело поиска с новым {}, я получаю попадания, но не фильтрую.

Что я делаю не так?


person Emil C    schedule 17.10.2014    source источник
comment
это странно работало для меня   -  person keety    schedule 18.10.2014
comment
Я думаю, что Nest может написать имя в нижнем регистре. Вы можете сериализовать и регистрировать поиск для отладки.   -  person Josh C.    schedule 18.10.2014
comment
Как насчет того, чтобы шаг за шагом пройтись по вашему коду и попытаться найти источник проблемы?   -  person aybe    schedule 18.10.2014


Ответы (1)


Если вы используете низкоуровневый клиент (elasticsearch.net) напрямую, он не будет выполнять нормализацию и сериализацию объекта дословно:

var query = new { query = new { term = new { Name = "banana" } } };
var json = new ElasticsearchClient().Serializer.Serialize(query).Utf8String();

это приведет к следующему json:

{
  "query": {
    "term": {
      "Name": "banana"
    }
  }
}

Если вы используете NEST, поведение по умолчанию — это имена свойств camelCase (NEST самоуверен):

{
  "query": {
    "term": {
      "name": "banana"
    }
  }
}

Если вы используете клиент низкого уровня через клиент высокого уровня (client.Raw), он будет использовать точно такие же настройки сериализации, как и клиент высокого уровня.

Вы можете управлять этим поведением на клиенте высокого уровня с помощью:

var connectionSettings = new ConnectionSettings()
    .SetDefaultPropertyNameInferrer(p=>p);
var client = new ElasticClient(connectionSettings);
person Martijn Laarman    schedule 19.10.2014
comment
Спасибо за ответ. Я все еще думаю, что корпус следует оставить в покое, если пользователь не реализует его самостоятельно. - person Emil C; 30.10.2014
comment
Я согласен, NEST — это то, что я написал в основном для собственного использования, когда я интегрировал elasticsearch в свои приложения еще в 2010 году. Соглашение было испечено с тех пор, и хотя NEST был полностью переписан внутри, что привело к его выпуску 1.0, изменение его теперь вызовет ко многим проблемам для существующих пользователей. При разделении низкоуровневого клиента мы сознательно решили, что в нем НЕ должно быть запечено никакой магии, подобной этой. - person Martijn Laarman; 30.10.2014