解析Lucene查询语法和CloudSearch的转义

本文关键字:CloudSearch 转义 语法 Lucene 查询 解析 | 更新日期: 2023-09-27 18:15:20

基本上,我有一个应用程序需要同时支持Lucene。. NET和Amazon CloudSearch.

所以,我不能重写查询,我需要使用lucene的标准查询,并在查询上使用. tostring()来获取语法。

问题是在Lucene中。. NET(我不知道这在java版本中是否相同),. tostring()方法返回没有转义字符的原始字符串。

因此,像

这样的内容:
(title:blah:blah summary:"lala:la")

应为

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

我需要的是一个正则表达式,它将添加转义。

这可能吗?如果有,会是什么样子呢?

其他可能的差异:

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

解析Lucene查询语法和CloudSearch的转义

根据注释和编辑,似乎您希望任何查询字符串都能够被正则表达式正确转义,并且任何给定的lucene查询都可以由结果字符串准确表示。

这是不可能的

Lucene查询语法不能表达所有Lucene查询。事实上,您从Query.toString()得到的字符串通常甚至不能被QueryParser 解析,更不用说作为查询的精确重建了。

总而言之:你做这件事的方式是错误的。Query.ToString()而不是设计来序列化查询,它的目标是而不是创建一个可解析的字符串查询。它主要用于调试之类的。如果您一直尝试这样使用它,那么尝试使用regex来转义歧义查询语法的这种愚蠢行为可能只是您麻烦的开始

您可以使用这个正则表达式在字符串

的关键位置转义冒号:
(?<!title|summary):

然后转义捕获的冒号:

查看?<!后面没有titlesummary的冒号,然后匹配冒号:

看到演示输入

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

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