Какие функции регулярного выражения поддерживаются Solr edismax?
Регулярные выражения позволяют использовать синтаксис соответствия шаблонов, показанный ниже.
Я пытаюсь реализовать мощный инструмент поиска, который реализует как можно больше из них.
Мне говорят, что edismax - самый гибкий инструмент для работы.
Какие из приведенных ниже шаблонов соответствия шаблонов можно выполнить с помощью edismax? Могу ли я сделать лучше, чем просветление? Можете ли вы предложить, какие фильтры и патчи для парсеров я могу использовать для достижения этой функции? Мне снится, если я думаю, что Solr может достичь приемлемой производительности (то есть времени обработки на стороне сервера) таких видов поиска?
синтаксис регулярных выражений и примеры из mysql
- ^ соответствует началу строки.
'fofo' REGEXP '^fo' => true
- $совпадение конца строки.
'fo\no' REGEXP '^fo\no$' => true
- * 0-неограниченный шаблон.
'Baaaan' REGEXP 'Ba*n' => true
- ? 0-1.
'Baan' REGEXP '^Ba?n => false'
- + 1-неограниченный шаблон.
'Bn' REGEXP 'Ba+n' => false
- | или.
'pi' REGEXP 'pi|apa' => true
- () * соответствие последовательности.
'pipi' REGEXP '^(pi)*$' => true
- [a-dX], [^ a-dX] диапазон символов/набор
'aXbc' REGEXP '[a-dXYZ]' => true
- {n} или {m, n} нотация мощности
'abcde' REGEXP 'a[bcd]{3}e' => true
- [: character_class:]
'justalnums' REGEXP '[[:alnum:]]+' => true
Ответы
Ответ 1
Версия 4.0 Lucene будет поддерживать запросы regex непосредственно в стандартном синтаксисе запросов с использованием специального синтаксиса. Я проверил, что он работает на экземпляр Solr, который я запускаю, построенный из ствола subversion в феврале.
Jira ticket 2604 описывает расширение стандартного синтаксиса запросов с использованием специального синтаксиса регулярных выражений, используя прямую косую черту, чтобы разграничить регулярное выражение, аналогичное синтаксису в Javascript. Кажется, он использует базовый парсер ReggexpQuery.
Итак, краткий пример:
body:/[0-9]{5}/
будет соответствовать пятизначному почтовому индексу в текстовом корпусе, который я проиндексировал. Но, как ни странно, тело:/\ d {5}/не работало для меня, а ^ не удалось.
Диалог регулярного выражения должен быть Java, но я не уверен, что все в нем работает, так как я только сделал беглый экзамен. Можно было бы, вероятно, внимательно изучить код RegexpQuery, чтобы понять, что работает, а что нет.
Ответ 2
Регулярные выражения и (e) утечки не очень сопоставимы. Dismax предназначен для работы непосредственно с общим входом конечного пользователя, в то время как регулярные выражения не являются типичным для пользователя.
Кроме того, сопоставление регулярных выражений с утилизацией во многом зависит от настроек текстового анализа и схемы, а не от самой разборки. С Solr вы обычно адаптируете схему и текстовый анализ к конкретным потребностям поиска, возможно, выполняя большую часть работы во время индекса. Регулярные выражения не согласуются с этим и даже с базовой структурой инвертированных индексов Lucene.
Тем не менее Lucene предоставляет RegexQuery и новый RegexpQuery. Насколько я знаю, они не интегрированы с Solr, но они могут быть. Начните новый элемент в Solr issue tracker и получите счастливое кодирование!:)
Имейте в виду, что запросы регулярных выражений, вероятно, всегда будут медленными... но они могут иметь приемлемую производительность в вашем случае.