关键字(OR,AND)在Lucene搜索

时间:2009-08-21 11:00:07

标签: java lucene

我在门户网站(基于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”匹配的文本。我怎样才能让它可以搜索?

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

6 个答案:

答案 0 :(得分:4)

我想你曾尝试将“OR”加成双引号?

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

然而,好消息是只有一条线可以改变:

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

变为

| <OR: ("||") >

这样,你只有“||”作为逻辑OR运算符。有一个build.xml也包含JavaCC的调用,但您必须自己下载that tool。我现在不能自己尝试,我很害怕。

这对Lucene开发者邮件列表来说可能是一个很好的问题,但如果你这样做,请告诉我们,他们会提出一个更简单的解决方案; - )

答案 1 :(得分:3)

OR AND 是保留关键字。我在2天前解决了这个问题,在将其输入到lucene查询解析器之前,将用户搜索词中的3个单词置低。请注意,如果您搜索并替换这些关键字,请确保使用单词边界(\ b),这样您就不会更改ANDROID和ORDER等单词。

然后,我让用户使用 - 和+指定 NOT AND ,就像Google一样。

答案 2 :(得分:3)

使用双引号转义OR和AND对我有效。所以尝试使用像

这样的Java字符串

String query = "field:\"AND\"";

答案 3 :(得分:1)

我已多次阅读你的问题了! = [

请查看这些建议

您的索引是如何存储的?

包含存储的字段的文档可以存储为

1)存储2)标记3)索引4)向量

它可以产生重要的 difference

请使用 Luke ,它可以告诉您如何存储索引(实际上)

如果您使用lucene,Luke是必须,因为它可以让您真正了解索引的存储方式,它还提供搜索功能,请尝试使用您的更新告诉我们!< / p>

答案 4 :(得分:0)

在构建查询时,您可能做错了什么。我将第二个Narayan关于获取Luke的建议(如评论中所述)并尝试运行您的查询。自从我使用Lucene以来已经有一段时间了,但是我不记得OR和AND的问题。

除此之外,您可以尝试使用QueryParser.escape(userQuery)转义输入字符串

More On Escaping

答案 5 :(得分:-1)

当它是搜索词时,您可以转义“OR”,或者为不同的语法编写自己的查询解析器。除了解析器之外,Lucene还提供了广泛的查询API,您可以使用它来轻松支持自己的查询语法。