Почему я получаю 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))));