Вопрос

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

Это отлично работает, но теперь я хотел бы реализовать больше функций: AND, OR и скобки ()

Мне трудно разобрать строку - и построить критерии из строки. Я нашел этот вопрос Stackoverflow , но это не помогло (он не сделал понятно что хотел).

Я нашел другую статью , но это поддерживает гораздо больше и выплевывает SQL-операторов. Еще одна вещь, о которой я часто упоминал, - это Lucene, но я не уверен, поможет ли это мне.

<Ч>

Я немного искал и нашел Lucene.Net WhitespaceAnalyzer и QueryParser.

Он изменяет поиск A И B ИЛИ C на что-то вроде + A + B C, что является хорошим шагом в правильном направлении (плюс он обрабатывает скобки). Следующим шагом будет преобразование строки в набор соединений и дизъюнкций.

Пример Java, который я нашел , использовал построитель запросов, который я не смог найти в NHibernate.

Есть еще идеи?

Это было полезно?

Решение 2

Сейчас я в основном занимаюсь синтаксическим анализом входной строки с помощью API разбора Lucene.Net. Это дает мне единый и упрощенный синтаксис. (Псевдокод)

using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;

void Function Search (string queryString)
{
    Analyzer analyzer = new WhitespaceAnalyzer();
    QueryParser luceneParser = new QueryParser("name", analyzer);
    Query luceneQuery = luceneParser.Parse(queryString);
    string[] words = luceneQuery.ToString().Split(' ');

    foreach (string word in words)
    {
        //Parsing the lucene.net string
    }
}

После этого я анализирую эту строку вручную, создавая дизъюнкции и конъюнкции.

Другие советы

Думаю, вы не слышали о поиске Nhibernate до сих пор

Nhibernate Search использует lucene внизу и предоставляет вам все варианты использования AND, OR, грамматики.
Все, что вам нужно сделать, это приписать свои сущности для индексации, и Nhibernate внесет их в указанную папку.
В следующий раз вы можете искать в этом индексе силу, которую предоставляет lucene, а затем получать взамен ваши объекты сущности уровня домена.

using (IFullTextSession s = Search.CreateFullTextSession(sf.OpenSession(new SearchInterceptor()))) {

        QueryParser qp = new QueryParser("id", new StopAnalyzer());

        IQuery NHQuery = s.CreateFullTextQuery(qp.Parse("Summary:series"), typeof(Book));

        IList result = NHQuery.List();

Мощный, не так ли?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top