![](/img/trans.png)
[英]How to search name having keyword “With” using Lucene/Hibernate?
[英]Keyword (OR, AND) search in 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将“或”视为搜索词而不是关键词。
我想你已经尝试将“OR”放入双引号中?
如果这不起作用,我认为你可能不得不改变Lucene源,然后重新编译整个事情,因为操作符“OR”深埋在代码中。 实际上,编译可能还不够:你必须更改源包中的文件QueryParser.jj作为JavaCC的输入,然后运行JavaCC,然后重新编译整个事情。
然而,好消息是,只有一条线可以改变:
| <OR: ("OR" | "||") >
变
| <OR: ("||") >
这样,你只有“||” 作为逻辑OR运算符。 有一个build.xml也包含JavaCC的调用,但您必须自己下载该工具 。 我现在不能自己尝试,我很害怕。
对于Lucene开发人员邮件列表来说这可能是一个很好的问题,但如果你这样做,请告诉我们,他们会提出一个更简单的解决方案;-)
使用双引号转义OR和AND对我有用。 所以尝试使用Java字符串
String query = "field:\\"AND\\"";
OR , NOT和AND是保留关键字。 我在2天前解决了这个问题,在将其输入到lucene查询解析器之前,将用户搜索词中的3个单词置低。 请注意,如果您搜索并替换这些关键字,请确保使用单词边界(\\ b),这样您就不会更改ANDROID和ORDER等单词。
然后我让用户通过使用 - 和+来指定NOT和AND ,就像Google一样。
在构建查询时,您可能做错了什么。 我将第二个Narayan关于获取Luke的建议(如评论中所述)并尝试运行您的查询。 自从我使用Lucene以来已经有一段时间了,但是我不记得曾经有OR和AND的问题。
除此之外,您可以尝试使用QueryParser.escape(userQuery)转义输入字符串
您可以在搜索词时转义“OR”,或者为不同的语法编写自己的查询解析器。 除了解析器之外,Lucene还提供了广泛的查询API,您可以非常轻松地使用它来支持自己的查询语法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.