解析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查询都可以由结果字符串准确表示。
这是不可能的
Lucene查询语法不能表达所有Lucene查询。事实上,您从Query.toString()
得到的字符串通常甚至不能被QueryParser
解析,更不用说作为查询的精确重建了。
Query.ToString()
是而不是设计来序列化查询,它的目标是而不是创建一个可解析的字符串查询。它主要用于调试之类的。如果您一直尝试这样使用它,那么尝试使用regex来转义歧义查询语法的这种愚蠢行为可能只是您麻烦的开始。
您可以使用这个正则表达式在字符串
的关键位置转义冒号:
(?<!title|summary):
然后转义捕获的冒号:
查看?<!
后面没有title
或summary
的冒号,然后匹配冒号:
看到演示输入
(title:blah:blah summary:"lala:la")
(title:blah':blah summary:"lala':la")