Разобрать строку поиска (в критерии NHibernate)
-
05-07-2019 - |
Вопрос
Я хотел бы реализовать расширенный поиск для моего проекта. В настоящее время при поиске используются все строки, которые вводит пользователь, и возникает одно большое расхождение с критериями 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();
Мощный, не так ли?