Разобрать строку поиска (в критерии NHibernate) - PullRequest
3 голосов
/ 11 сентября 2009

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

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

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

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


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

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

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

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

Ответы [ 2 ]

3 голосов
/ 11 сентября 2009

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

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();

Мощно, не правда ли?

1 голос
/ 11 сентября 2009

Сейчас я в основном занимаюсь синтаксическим анализом входной строки с помощью 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
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...