Эластичный поиск NEST

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

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

person WLegend    schedule 19.10.2014    source источник


Ответы (2)


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

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

Создайте пример индекса с помощью NEST:

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

Пример сопоставления обновлений:

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

Вот действительно полезная информация об алгоритмических стеммерах в Полное руководство.

person Greg Marzouka    schedule 21.10.2014
comment
Большое спасибо за ответ @GregMarzouka, я попробую и посмотрю, что у меня получится. Пожалуйста, если у вас есть более подробные ресурсы по использованию NEST, я буду признателен, если вы поделитесь ими со мной, потому что я вижу, что документации, представленной на их веб-сайте, недостаточно. - person WLegend; 22.10.2014

Вы также можете использовать 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))
                ));
person danvasiloiu    schedule 12.01.2015
comment
Спасибо, попробую этот @dzomba - person WLegend; 13.01.2015
comment
значение MaxExpansion можно изменить... большее значение означает, что разница между значением базы данных и вводом больше. сделать несколько тестов - person danvasiloiu; 14.01.2015
comment
также вы можете использовать queryString с подстановочным знаком, и вы будете искать что-то вроде этого: book* - person danvasiloiu; 09.07.2015