NEST не может найти документы, которые может найти эластичный поиск

Вот как я ищу документ, но он не возвращает никаких результатов:

var results = ElasticClient.Search<ClusterInstance>(body => body
    .AllIndices()
    .Size(500)
    .Query(query => query
        .QueryString(qs => qs.Query("MyTestName"))
    )
);
resultobject.clusterinstances = results.Documents.ToList();

Когда я использую это как поисковый запрос в Elasticsearch, я получаю результаты (из них 2), которые мне нужны.

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "MyTestName"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 10,
  "sort": [],
  "facets": {}
}

Создание ElasticClient:

private static ElasticClient ElasticClient
{
    get
    {
        var uri = new Uri("http://localhost:9200")
        return new ElasticClient(new ConnectionSettings(uri));
    }
}

Индексация:

foreach (var cluster in db.ClusterInstances.Where(a => a.Active.Equals(true)))
{
    client.Index(cluster, "cmdbcli", "clusters", cluster.ClusterInstanceID);
}

Версия: NEST — клиент Elasticsearch 0.12.0 (NuGet)


person Bart De Vos    schedule 25.02.2014    source источник


Ответы (2)


Хотя Крис Мантл прав в том, что запросы не совсем совпадают, они должны быть почти функционально эквивалентны.

Ваш поиск выполняет поиск по /_all/clusterinstances/_search, что вам, вероятно, нужно:

.Search(s=>s
    .AllIndices()
    .AllTypes()
    ...

or

.Search(s=>s
    .AllIndices()
    .Type("clusters")
    ...

NEST по умолчанию выводит тип elasticsearch, используя нижний регистр и множественное число для имени типа CLR.

Если вы настроите параметры подключения следующим образом:

var settings = new ConnectionSettings(uri)
    .SetDefaultIndex("cmdbcli")
    .MapDefaultTypeNames(d=>d
       .Add(typeof(ClusterInstance), "clusters")
    )
   ....

потом

.Search<ClusterInstance>(s=>s.Query())

по умолчанию будет /cmdbcli/clusters/_search

person Martijn Laarman    schedule 25.02.2014
comment
Ага! Вот и все! Спасибо! - person Bart De Vos; 26.02.2014

Ваши запросы не совпадают. Тот, который создается вашим кодом, будет простым запросом query_string, а не запросом bool, который вы определяете в своем запросе JSON. Я думаю, вам нужно изменить свой код, чтобы создать запрос, аналогичный тому, который вы определяете в JSON:

var results = ElasticClient
    .Search<ClusterInstance>(body => body
        .AllIndices()
        .Size(500)
        .Query(query => query
            .Bool(@bool => @bool
                .Must(must => must
                    .QueryString(qs => qs
                        .Query("MyTestName"))))));

resultobject.clusterinstances = results.Documents.ToList();
person Chris Mantle    schedule 25.02.2014