2014-10-19 3 views
0

В настоящее время я начал использовать обертку Elasticsearch для C# «NEST», и мне приходится сталкиваться с некоторыми проблемами для написания запросов, которые проверяют частичное сходство, например, в «книге» и «книгах», поэтому, когда у меня есть документ, содержит «книгу», если я ищу «книгу» не находит его: вот мой код:Elasticsearch NEST

var articles = client.Search<ProductResult>(s => s 
     .From(0) 
     .Size(1000) 
     .MatchAll() 
     .Query(q => q.QueryString(d => d 
     .Query(query) 
      ))); 

ответ

1

Попробуйте проанализировать свои поля с забойным анализатором как snowball который будет пытаться его лучше уменьшить слова к их корневой форме. Например, books и booking =>book, jumps и jumping =>jump. и т. д. Алгоритм, стоящий за ним, не идеален и будет срабатывать по неправильным словам/множественным формам, но по большей части он работает очень хорошо (на большинстве европейских языков).

Вы можете применять различные анализаторы при первоначальном создании индекса или существующего индекса с использованием API сопоставления обновлений. В любом случае вам придется переиндексировать наши документы, чтобы применить новый анализ.

Создать пример индекса с помощью НЕСТ:

client.CreateIndex("yourindex", c => c 
    ... 
    .AddMapping<YourType>(m => m 
     .MapFromAttributes() 
     .Properties(ps => ps 
      .String(s => s.Name("fieldname").Analyzer("snowball")) 
      ... 
     ) 
    ) 
); 

Update пример отображения:

client.Map<YourType>(m => m 
    .MapFromAttributes() 
    .Index("yourindex") 
    .Properties(ps => ps 
     .String(s => s.Name("fieldname").Analyzer("snowball")) 
     ... 
    ) 
); 

Вот некоторые действительно большой информации о algorithmic stemmers in The Definitive Guide.

+0

Спасибо так много для вас Ответные @GregMarzouka, я постараюсь его и посмотреть, что я могу. Если у вас есть более подробные ресурсы по использованию NEST, я буду благодарен за их совместное использование, потому что я вижу, что документации, представленной на их веб-сайте, недостаточно. – WLegend

0

U можно использовать Fuzzy также ...

var articles = client.Search<ProductResult>(s => s 
      .From(0) 
      .Size(1000) 
      .Query(q => q.(d => d 
       .Fuzzy(fz => fz.OnField("field").Value("book").MaxExpansions(2)) 
       )); 
+0

Спасибо, я попробую это @dzomba – WLegend

+0

значение MaxExpansion можно изменить ... большее значение означает, что разница между значением базы данных и входом больше. выполните некоторые тесты – danvasiloiu

+0

также вы можете использовать queryString с подстановочным знаком, и вы будете искать что-то вроде этого: «book *» – danvasiloiu

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