为 CloudSearch 解析 Lucene 查询语法和转义
Parsing Lucene Query syntax and escaping for CloudSearch
基本上,我有一个应用程序需要同时支持 Lucene.NET 和 Amazon CloudSearch。
所以,我无法重写查询,我需要使用来自 lucene 的标准查询,并在查询上使用 .ToString() 来获取语法。
问题是在 Lucene.NET 中(我不知道 java 版本中是否相同),.ToString() 方法 return 原始字符串没有转义字符。
因此,诸如:
(title:blah:blah summary:"lala:la")
应该是
(title:blah\:blah summary:"lala\:la")
我需要的是一个可以添加转义符的正则表达式。
这可能吗?如果是这样,它会是什么样子。
一些额外的可能差异:
(title:"this is a search:term")
(field5:"this is a title:term")
您可以使用此正则表达式在字符串的关键点转义冒号 :
(?<!title|summary):
然后转义捕获的冒号:
说明
在 ?<!
后面查找任何没有跟随 title
或 summary
的冒号,然后匹配冒号 :
见Demo
输入
(title:blah:blah summary:"lala:la")
输出
(title:blah\:blah summary:"lala\:la")
根据评论和编辑,您似乎希望任何查询字符串都能被正则表达式正确转义,并且任何给定的 Lucene 查询都能由结果字符串准确表示。
那不会发生。
Lucene 查询语法无法表达所有的 Lucene 查询。事实上,你从 Query.toString()
得到的字符串通常甚至不能被 QueryParser
解析 ,更不用说是对查询的精确重构了。
总而言之:你的做法是错误的。 Query.ToString()
not 旨在序列化查询,其目标是 not 创建可解析的字符串查询。主要是调试之类的。如果您继续尝试以这种方式使用它,这种试图使用正则表达式来逃避不明确的查询语法的愚蠢行为可能只是您的麻烦的开始。
This question provides another example of this.
基本上,我有一个应用程序需要同时支持 Lucene.NET 和 Amazon CloudSearch。
所以,我无法重写查询,我需要使用来自 lucene 的标准查询,并在查询上使用 .ToString() 来获取语法。
问题是在 Lucene.NET 中(我不知道 java 版本中是否相同),.ToString() 方法 return 原始字符串没有转义字符。
因此,诸如:
(title:blah:blah summary:"lala:la")
应该是
(title:blah\:blah summary:"lala\:la")
我需要的是一个可以添加转义符的正则表达式。
这可能吗?如果是这样,它会是什么样子。
一些额外的可能差异:
(title:"this is a search:term")
(field5:"this is a title:term")
您可以使用此正则表达式在字符串的关键点转义冒号 :
(?<!title|summary):
然后转义捕获的冒号:
说明
在 ?<!
后面查找任何没有跟随 title
或 summary
的冒号,然后匹配冒号 :
见Demo
输入
(title:blah:blah summary:"lala:la")
输出
(title:blah\:blah summary:"lala\:la")
根据评论和编辑,您似乎希望任何查询字符串都能被正则表达式正确转义,并且任何给定的 Lucene 查询都能由结果字符串准确表示。
那不会发生。
Lucene 查询语法无法表达所有的 Lucene 查询。事实上,你从 Query.toString()
得到的字符串通常甚至不能被 QueryParser
解析 ,更不用说是对查询的精确重构了。
总而言之:你的做法是错误的。 Query.ToString()
not 旨在序列化查询,其目标是 not 创建可解析的字符串查询。主要是调试之类的。如果您继续尝试以这种方式使用它,这种试图使用正则表达式来逃避不明确的查询语法的愚蠢行为可能只是您的麻烦的开始。
This question provides another example of this.