Почему я получаю 0 совпадений из запроса ElasticSearch (C#)?

У меня есть код, который должен вернуть 5 совпадений из поиска.

Если я попробую запрос в браузере, я получу 5 результатов:

http://localhost:9200/_search?q=Testing

Если я использую редактор SENSE, он также показывает мои 5 результатов:

Server=localhost:9200
POST _search
{
    "query": {
        "query_string": {
            "query": "Testing"
        }
    }
}

Но мой код C# в контроллере не может найти никакого совпадения. Что мне не хватает?

Uri localhost = new Uri("http://localhost:9200");
            var setting = new ConnectionSettings(localhost);
            setting.SetDefaultIndex("videos");
            var client = new ElasticClient(setting);

            var result = client.Search<SearchHint>(
                body => body.Query(
                    query => query.QueryString(
                        qs => qs.Query(keys))));

            var results = new SearchResults()
            {
                Results = result.Documents.ToList() <-- this has 0 items
            };

РЕДАКТИРОВАТЬ 1:

public class SearchHint
    {
        public string Id { get; set; }
        public string Title { get; set; }
        public int NumItems { get; set; }
        public bool IsList { get; set; }

        public SearchHint(string id, string title, int numItems, bool isList)
        {
            Id = id;
            Title = title;
            NumItems = numItems;
            IsList = isList;
        }
    }

РЕДАКТИРОВАТЬ 2: в индексе 4 типа (видео \ список, видео \ видео, видео \ автор, видео \ категория). Любой поиск должен искать все типы, а не какой-либо конкретный тип.

1 ответ

Решение

Я думаю, что проблема связана с тем, что NEST использует типы поиска по умолчанию. Если вы не указали и [ElasticType] атрибут на вашем SearchHint класс запросит Elasticsearch со следующим URL:

 /_all/searchhint/_search

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

 [ElasticType(Name = "mytype"]
 public class SearchHint
 {
       // Will map to field with name title in your index.
       //Use the following property to specify an alternate name
       //[ElasticProperty(Name="Title")]
       public string Title { get; set;}
 }

Пожалуйста, посмотрите документацию NEST по выводу для обзора того, как все это работает.

Обновление: предыдущий относится только к поиску в пределах одного типа. Если вы хотите искать по нескольким типам, то вам нужно будет указать .AllTypes() По вашему поисковому запросу нет необходимости указывать [ElasticType] атрибут вашего класса.

            var result = client.Search<SearchHint>(
                body => body
                  .AllTypes()
                  .Query(
                    query => query.QueryString(
                        qs => qs.Query(keys))));
Другие вопросы по тегам