2009-08-21 73 views
18

我在我的门户(基于J2EE)中使用Lucene进行索引和搜索服务。在Lucene中搜索关键字(OR,AND)

问题是关于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将“或”作为搜索词而不是关键词。

+0

的Lucene的版本试试? AFAIk,布尔查询适用于BooleanClause.Occur.SHOULD |必须|必须(或|和|不)与resp。 – Narayan 2009-08-21 11:48:37

+0

在Luke中执行搜索工作==> http://www.getopt.org/luke/ – Narayan 2009-08-21 11:56:29

回答

-1

当它是一个搜索项时,您可以转义“OR”,或者为不同的语法编写您自己的查询解析器。除了解析器,Lucene还提供了一个广泛的查询API,您可以非常轻松地支持您自己的查询语法。

+3

如何逃避它? – Areca 2009-08-21 12:01:36

0

当您构建查询时,您可能做错了什么。我会第二次纳拉扬关于获得卢克的建议(正如评论中所发表的那样),然后尝试运行你的查询。自从我使用Lucene之后已经有一段时间了,但我不记得有OR和AND的问题。

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

More On Escaping

+0

我试过逃跑,但它不起作用。 – 2010-08-10 18:32:30

1

我读过你的问题很多次! = [

请看看这些建议

你的索引如何存储?存储

含有文档字段可以存储为

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

它可以使一个显著difference

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

Luke是一个必须如果您使用的是lucene,它可以让您真正了解如何存储索引,它还提供搜索功能,请尝试让我们知道您的更新!

4

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

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

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

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

成为

| <OR: ("||") >

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

这也许是对Lucene的开发者邮件列表一个很好的问题,但请让我们知道,如果你做到这一点,他们想出了一个简单的解决方案;-)

2

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

我然后让用户通过使用指定AND - 和+,就像谷歌一样。

3

用双引号将OR和AND转义出来对我有用。因此,与Java字符串像

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