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

时间:2015-03-04 14:19:41

标签: lucene special-characters

我使用的是Lucene 5.0.0版。 在我的搜索字符串中,有一个像“test-”这样的减号字符。 我读到减号是Lucene中的一个特殊字符。所以我必须逃避这个标志,如the queryparser documentation

  

逃避特殊字符:   Lucene支持转义作为查询语法一部分的特殊字符。当前列表的特殊字符是:

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

要逃避这些角色,请在角色前使用\。例如,要搜索(1 + 1):2,请使用查询:

\(1\+1\)\:2

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

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

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

问题是Parser删除了特殊字符,因此Query具有该术语 内容:测试

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

  • 试验VRF
  • 试验IPLS

我对这个问题感到很困惑。

2 个答案:

答案 0 :(得分:1)

虽然逃避查询者的特殊字符处理部分问题,但它对分析无效。

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

  • testvrf
  • testipls

这就是为“test-”手动构造的查询什么也找不到的原因。该术语在索引中不存在。

这些分析器的目标是尝试索引单词。因此,标点符号基本上被消除,并且不可搜索。 "test vrf""test-vrf""test_vrf"的词组查询实际上完全相同。如果这不是您所需要的,则需要查看other analyzers

答案 1 :(得分:1)

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

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