Lucene 中的关键字 (OR, AND) 搜索

2022-09-02 22:27:15

我正在我的门户(基于J2EE)中使用Lucene进行索引和搜索服务。

问题在于Lucene的关键词。当您在搜索查询中使用其中之一时,您将收到错误。

例如:

searchTerms = "ik OR jij"

这工作正常,因为它将搜索或"ik""jij"

searchTerms = "ik AND jij"

这工作正常,它搜索和"ik""jij"

但是,当您搜索时:

searchTerms = "OR"
searchTerms = "AND"
searchTerms = "ik OR"
searchTerms = "OR ik"

否则,它将失败并显示错误:

Component Name: STSE_RESULTS  Class: org.apache.lucene.queryParser.ParseException  Message: Cannot parse 'OR jij': Encountered "OR" at line 1, column 0. 
Was expecting one of: 
... 

这是有道理的,因为这些单词是Lucene的关键字,可能是保留的,并且将充当关键字。

在荷兰语中,“OR”这个词很重要,因为它对“Ondernemings Raad”有含义。它在许多文本中使用,需要找到它。例如,“or”确实有效,但不返回与术语“OR”匹配的文本。如何使其可搜索?

如何转义关键字“or”?或者我怎么能告诉Lucene将“or”视为搜索词而不是关键字。


答案 1

我想你已经尝试过将“OR”放在双引号中?

如果这不起作用,我认为你可能不得不改变Lucene源代码,然后重新编译整个东西,因为运算符“OR”深埋在代码中。实际上,编译可能还不够:您必须在源包中更改文件QueryParser.jj,该文件用作JavaCC的输入,然后运行JavaCC,然后重新编译整个内容。

然而,好消息是,只有一行要改变:

| <OR: ("OR" | "||") >

成为

| <OR: ("||") >

这样,您将只有“||”作为逻辑 OR 运算符。有一个构建.xml也包含JavaCC的调用,但您必须自己下载该工具。恐怕我现在不能自己尝试。

对于Lucene开发人员邮件列表来说,这也许是一个好问题,但是如果您这样做,请告诉我们,他们会提出一个更简单的解决方案;-)


答案 2

ORNOTAND 是保留关键字。就在2天前,我通过在用户的搜索词中降低这3个单词的大小写来解决这个问题,然后将其输入到lucene查询解析器中。请注意,如果您搜索并替换这些关键字,请确保使用单词边界 (\b),这样您就不会最终更改 ANDROID 和 ORDER 等单词。

然后,我让用户通过使用 - 和 +来指定 NOTAND,就像 Google 所做的那样。


推荐