Анализ синтаксиса Lucene Query и экранирование для CloudSearch

По сути, у меня есть приложение, которое должно поддерживать как Lucene.NET, так и Amazon CloudSearch.

Итак, я не могу переписать запросы, мне нужно использовать стандартные запросы из lucene и использовать .ToString() в запросе, чтобы получить синтаксис.

Проблема в том, что в Lucene.NET (я не знаю, так ли это в версии java) метод .ToString() возвращает необработанную строку без escape-символов.

Поэтому такие вещи, как:

(title:blah:blah summary:"lala:la")

должно быть

(title:blah\:blah summary:"lala\:la")

Мне нужно регулярное выражение, которое добавит побеги.

Это возможно? и если да, то как это будет выглядеть.

Некоторые дополнительные возможные отклонения:

(title:"this is a search:term")
(field5:"this is a title:term")

person Martin    schedule 29.09.2015    source источник
comment
Вы, вероятно, сделали бы Regex.Replace(query, ([-+!(){}[\]^"~*?:]|(?:\|\|)|(?:&&)), "\\$1");   -  person Pruthvi Raj    schedule 29.09.2015
comment
Каковы точные требования? Куда и что следует бежать? Только 1_? Когда это второе двоеточие в последовательности без пробелов? Попробуйте (?<=\S+?:\S+?):.   -  person Wiktor Stribiżew    schedule 29.09.2015
comment
Вы больше кодируете, чем анализируете. .NET имеет несколько кодировщиков. Не тот, который вам нужен, но посмотрите msdn.microsoft .com/en-us/library/w3te6wfz(v=vs.110).aspx   -  person paparazzo    schedule 29.09.2015


Ответы (2)


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

Этого не произойдет.

Синтаксис запросов Lucene не может выражать все запросы Lucene. На самом деле строка, которую вы получаете от Query.toString(), часто даже не может быть разобрана с помощью QueryParser, не говоря уже о точной реконструкции запроса.

Длинный и короткий: вы идете об этом неправильным путем. Query.ToString() не предназначен для сериализации запроса, и его цель не — создать строковый запрос, который можно анализировать. Это в основном для отладки и тому подобного. Если вы продолжите пытаться использовать его таким образом, эта дурацкая попытка использовать регулярное выражение, чтобы избежать двусмысленного синтаксиса запроса, скорее всего, станет началом ваших проблем.

Этот вопрос является еще одним примером этого.

person femtoRgon    schedule 29.09.2015
comment
Было бы круто, если бы был парсер запросов для всего (по крайней мере, большего) синтаксиса - person paparazzo; 29.09.2015
comment
ну, это... отстой... Похоже, для простых запросов я могу продвинуться довольно далеко, воспроизводя логику метода .ToString() (должен любить открытый исходный код). - person Martin; 30.09.2015

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

(?<!title|summary):

Затем сбегите из захваченного двоеточия :

Пояснение

Посмотрите за ?<! на любое двоеточие, за которым не следует title или summary, затем сопоставьте двоеточие :

См. демонстрацию.

ввод

(title:blah:blah summary:"lala:la")

Вывод

(title:blah\:blah summary:"lala\:la")
person james jelo4kul    schedule 29.09.2015
comment
спасибо за ответ, однако мне должно было быть ясно, что заголовок и сводка - это только 2 из сотен полей, названия некоторых из которых я не знаю во время компиляции. - person Martin; 29.09.2015
comment
Кроме того, если бы текст содержал title:"something title:go", он не был бы захвачен должным образом, не так ли? - person Martin; 29.09.2015
comment
я ответил на основе вашего вопроса. В зависимости от того, насколько сложна строка, вы всегда можете изменить шаблон. Для вашего вопроса этот шаблон будет работать (?<!title:"|summary):(?!") см. демонстрацию regex101.com/r/xX8nG4/6 - person james jelo4kul; 29.09.2015