Индексирование регулярных выражений (предпочтительно в Lucene) - PullRequest
1 голос
/ 23 января 2012

Кто-нибудь знает способ индексации регулярных выражений , чтобы я мог выполнять запросы без регулярных выражений, сопоставляя их с документами с полем регулярных выражений в них?Желательно с Lucene или другой внутрипроцессной библиотекой Java.

Справочная информация

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

В настоящее время я изучаю lucene для замены отсортированного в памяти дерева, построенного на основе реализации, используя HashMaps, ConcurrentSkipListSets в отношениях родитель-потомок.

a  -> category cat1
   1  -> category cat2 

b  -> category cat4 
   \w*  
      6 -> category cat5 

Таким образом, строка 'a 1' и 'a 1 zx y' будет соответствовать 'cat2' , 'a' будет соответствовать 'cat1' и 'bxy 6' будет соответствовать 'cat5' .Все правила имеют неявное значение '. *' в конце, и если сопоставление возможно без сопоставления с регулярным выражением, это предпочтительнее.Эти правила построены из списков свойств:

a        = cat1
a 1      = cat2
b        = cat4
b \w* 6  = cat5

Сейчас мы внедряем правила 50 КБ (и их количество увеличивается), и хотя этот процесс очень быстр при поиске, он использует слишком много ОЗУ, на его сборку требуется немного времени,и не так гибко, как нам нужно.

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

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

Кто-нибудь?

- Olve

1 Ответ

1 голос
/ 25 января 2012

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

Тем не менее, я удивлен, что ваш процесс использует слишком много оперативной памяти только с 50k-правилами.Сколько у вас оперативной памяти?Если вы согласны поделиться деталями реализации, я уверен, что есть возможности для улучшения.

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

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