2015-04-01 5 views
1

Мы используем API NEST для работы с Elasticsearch с использованием C#. Хотя мы можем вставлять данные, запросы, которые ссылаются на определенные поля в объекте, не работают.NEST-запрос для Elasticsearch не работает

Например, учитывая следующий класс:

internal class Magazine 
{ 
    public Magazine(string id, string title, string author) 
    { 
     Id = id; 
     Title = title; 
     Author = author; 
    } 

    public string Id { get; set; } 
    public string Title { get; set; } 
    public string Author { get; set; } 
} 

Объекты класса создаются и вставляются в ElasticSearch следующим образом:

Magazine mag1= new Magazine("1", "Soccer Review", "John Smith"); 
Magazine mag2= new Magazine("2", "Cricket Review", "John Smith"); 

Uri node = new Uri("http://localhost:9200"); 
ConnectionSettings settings = new ConnectionSettings(node, defaultIndex: "mag-application"); 
ElasticClient client = new ElasticClient(settings); 
client.Index(mag1); 
client.Index(mag2); 

Следующий запрос работает, и возвращает две строки:

var searchResults = client.Search<Magazine>(s => s.From(0).Size(20)); 

Но этот ничего не возвращает:

var searchResults = client.Search<Magazine>(s => s.From(0).Size(20).Query(q => q.Term(p => p.Author, "John Smith"))); 

Что не так?

ответ

3

Поскольку вы используете стандартный анализатор (опция по умолчанию), строка «Джон Смит» разбита на 2 жетона «john» и «smith».

Термин запроса:

соответствий документы, которые имеют поля, которые содержат термин (не анализируются).

То есть фраза, которую вы ищете, не будет проходить из вышеупомянутого процесса анализа.

Try поиск

client.Search<Magazine>(s => s.From(0).Size(20).Query(q => q.Term(p => p.Author, "john"))); 

или использовать Match запроса, как показано ниже:

client.Search<Magazine>(s => s.From(0).Size(20)..Query(q => q.Match(m => m.OnField(p => p.Author).Query("John Smith")) 

Проверить в official documentation for term query для получения дополнительной информации.

+0

Большое спасибо. Первое предложение не сработало, но второе. – user1052610

+1

Я предполагаю, что вы пробовали с «john» в нижнем регистре. «Джон» не будет найден, поскольку стандартный анализатор преобразует все токены в нижний регистр, и именно так они живут в Elasticsearch. – Manolis

+0

отлично - исправлено это и работает. Благодаря! – user1052610

Смежные вопросы