我在门户网站(基于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将“或”视为搜索词而不是关键词。
答案 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)转义输入字符串
答案 5 :(得分:-1)
当它是搜索词时,您可以转义“OR”,或者为不同的语法编写自己的查询解析器。除了解析器之外,Lucene还提供了广泛的查询API,您可以使用它来轻松支持自己的查询语法。