Какие функции регулярного выражения поддерживаются Solr edismax?

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

синтаксис и примеры регулярных выражений из в MySQL

  1. ^ соответствует началу строки. 'fofo' REGEXP '^fo' => true
  2. $ соответствует концу строки. 'fono' REGEXP '^fono$' => 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 ответов


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

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

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

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

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

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


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

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

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

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