Lucene 5.0.0 - 搜索带有特殊字符的字符串

Lucene 5.0.0 - search string with special characters

我使用的是 Lucene 5.0.0 版。 在我的搜索字符串中,有一个减号,如“test-”。 我读到减号是 Lucene 中的一个特殊字符。所以我必须转义那个符号,如 the queryparser documentation:

Escaping Special Characters: Lucene supports escaping special characters that are part of the query syntax. The current list special characters are:

- + - && || ! ( ) { } [ ] ^ " ~ * ? : \ /`

To escape these character use the \ before the character. For example to search for (1+1):2 use the query:

\(1\+1\)\:2

为此,我使用 QueryParser.escape 方法:

query = parser.parse(QueryParser.escape(searchString));

我使用经典分析器是因为我注意到标准分析器在转义特殊字符方面存在一些问题。

问题是解析器删除了特殊字符,所以查询有术语 content:test

如何设置解析器和搜索器来搜索真正的值“test-”? 我还使用内容测试创建了自己的查询,但这也没有用。我收到了 0 个结果,但我的索引中有如下条目:

我对这个问题很困惑

虽然为 queryparser 转义特殊字符可以解决部分问题,但对分析没有帮助。

经典分析器和标准分析器都不会在字段的索引形式中保留标点符号。对于这些示例中的每一个,索引形式将包含两个术语:

  • testvrf
  • testipls

这就是为 "test-" 手动构造的查询找不到任何结果的原因。索引中不存在该术语。

这些分析器的目标是尝试索引 个词。因此,标点符号大部分被删除,并且不可搜索。 "test vrf""test-vrf""test_vrf" 的短语查询实际上完全相同。如果这不是您所需要的,您需要查看 other analyzers.

解决此问题的目标是以NOT_ANALYZED 方式存储值内容。 字段 fieldType = new Field(key.toLowerCase(),value, Field.Store.YES, Field.Index.NOT_ANALYZED);

遇到相同问题的人必须注意如何将内容存储在索引中。 要请求结果,请以这种方式创建查询 searchString = QueryParser.escape(searchString); 并使用例如 WhitespaceAnalyzer。