Какие функции регулярных выражений поддерживаются Solr edismax? - PullRequest
10 голосов
/ 17 февраля 2012

Регулярные выражения позволяют использовать синтаксис сопоставления с шаблоном, показанный ниже.Я пытаюсь реализовать мощный инструмент поиска, который реализует как можно больше из них.Мне сказали, что edismax - самый гибкий инструмент для работы.Какое из приведенных ниже выражений сопоставления с образцом может быть выполнено с помощью edismax?Могу ли я сделать лучше, чем Edismax?Можете ли вы предложить, какие фильтры и исправления парсера я мог бы использовать для достижения этой функциональности?Неужели мне снится, если я думаю, что Solr сможет достичь приемлемой производительности (т. Е. Времени обработки на стороне сервера) таких поисков?

синтаксис регулярного выражения и примеры из mysql

  1. ^ соответствует началу строки.'fofo' REGEXP '^fo' => true
  2. $ соответствует концу строки.'fo\no' REGEXP '^fo\no$' => true
  3. * 0 - неограниченный шаблон.'Baaaan' REGEXP 'Ba*n' => true
  4. ?0-1 подстановочный знак.'Baan' REGEXP '^Ba?n => false'
  5. + 1-неограниченный подстановочный знак.'Bn' REGEXP 'Ba+n' => false
  6. |или же.'pi' REGEXP 'pi|apa' => true
  7. () * последовательность соответствует.'pipi' REGEXP '^(pi)*$' => true
  8. [a-dX], [^ a-dX] диапазон / набор символов 'aXbc' REGEXP '[a-dXYZ]' => true
  9. {n} или {m, n} кардинальное обозначение 'abcde' REGEXP 'a[bcd]{3}e' => true
  10. [: character_class:] 'justalnums' REGEXP '[[:alnum:]]+' => true

Ответы [ 2 ]

15 голосов
/ 06 марта 2012

Версия 4.0 Lucene будет поддерживать запросы регулярных выражений непосредственно в стандартном анализаторе запросов с использованием специального синтаксиса. Я проверил, что он работает на экземпляре Solr, который я запускаю, собранном из транка Subversion в феврале.

Билет Jira 2604 описывает расширение стандартного синтаксического анализатора запросов, используя специальный синтаксис регулярных выражений, используя прямые косые черты для ограничения регулярных выражений, аналогично синтаксису в Javascript. Кажется, он использует базовый парсер RegexpQuery.

Итак, краткий пример:

body:/[0-9]{5}/

будет соответствовать пятизначному почтовому индексу в текстовом корпусе, который я проиндексировал. Но, как ни странно, body: / ​​\ d {5} / у меня не сработало и ^ тоже не получилось.

Регулярный диалект должен быть Java, но я не уверен, что все в нем работает, так как я только сделал краткий экзамен. Вероятно, придется внимательно изучить код RegexpQuery, чтобы понять, что работает, а что нет.

4 голосов
/ 17 февраля 2012

Регулярные выражения и (e) dismax на самом деле не сопоставимы. Dismax предназначен для работы непосредственно с обычным вводом данных конечным пользователем, тогда как регулярные выражения не являются типичным вводом данных конечного пользователя.

Кроме того, сопоставление вещей, подобных регулярному выражению, с dismax во многом зависит от настроек анализа текста и дизайна схемы, а не от самого dismax. С Solr вы обычно настраиваете анализ схемы и текста в соответствии с конкретными потребностями поиска, возможно, выполняя большую часть работы во время индекса. Регулярные выражения расходятся с этим и даже с базовой структурой инвертированных индексов Lucene.

Тем не менее, Lucene предоставляет RegexQuery и более новый RegexpQuery . Насколько я знаю, они не интегрированы с Solr, но они могут быть. Запустите новый элемент в трекере Solr и счастливого кодирования! :)

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

...