我正在尝试使用 Lucene 来搜索数据库中的姓名。然而,有些名称包含“NOT”和“OR”等单词,甚至包含“-”减号。我仍然希望使用分析器分解名称中的不同标记,并作为术语的 boolean 组合进行搜索,但我不希望 Lucene 将任何“NOT”/“OR”术语解释为运算符(相反,我希望像普通术语一样搜索它们)。
完成我所说的任务的一种方法是在搜索查询上手动运行分析器,然后根据所有结果标记手动构建 boolean 查询。这是最好的方法吗?我的印象是分析器被设计为与查询解析器结合使用,我觉得应该有一种内置的方法来完成我想要做的事情。有人知道最好的方法吗?
最佳答案
您自己建议的从 TokenStream 构造 BooleanQuery 的方法是完全有意义的。 QueryParser API 实际上只是用于使用特定语法解析结构化查询 - 如果您不利用查询解析器语法,我认为没有理由使用 QueryParser 而不是手动构建的 BooleanQuery。
但是,如果您使用 StandardAnalyzer(或其他带有 StopFilter 的分析器)来为字段建立索引,则“AND”、“NOT”和“OR”等单词将不会被索引,并且无法进行搜索。因此,在这种情况下,您可以使用正则表达式轻松地从查询中删除这些单词和运算符,例如“-”和“+”。不过,我更愿意推荐 BooleanQuery 方法。
关于java - 没有运算符的 Lucene 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1948689/