我在Lucene索引中存储了大量文档,我使用的是customAnalyzer,它基本上为文档内容进行了标记化和源代码。
现在,如果我在文档中搜索单词" love",我得到的结果是爱被用作名词或动词,而我只想要那些仅使用爱的文档一个动词。
如何实现这样的功能,我还可以提到单词的词性以及单词,这样结果只能用作动词而不是名词?
我可以想出一种方法,最初对文档中的每个单词进行词性标记,并通过在单词上添加带有' _'的单词来存储它。或者其他什么,然后相应地搜索,但想知道在Lucene中是否有更聪明的方法来做到这一点。
答案 0 :(得分:1)
我可以想到以下方法。
方法1
就像你提到的那样:在索引时识别并将词性标记附加到实际术语。查询时也一样。
我想讨论相关的利弊。
缺点:
1)未来的要求可能要求您获得结果而不管词性。包含已修改术语的索引将不起作用。
2)您可能希望执行类似“term:noun或adjective”的BooleanQuery。你自己编写查询扩展器。
方法2
尝试使用Lucene的Payloads功能。
以下是简要tutorial on Lucene Payloads。
解决使用案例的步骤。
1)以有效载荷的形式存储词性标记。
2)为每个词性标签定制相似度类。
3)根据查询,将相应的CustomSimilarity分配给IndexSearcher。例如,为名词查询指定NounBoostingSimilarity。
4)根据Payload提升或“降低”文档的分数。上面教程中给出的示例。
5)编写一个自定义收集器来过滤掉不符合上述得分提升逻辑的分数。
这种方法的优点是索引与任何其他正常搜索保持兼容。
缺点:
1)维护费用:必须为每个相似性维护多个IndexSearchers。 2)有点复杂的代码解决方案。
坦率地说,我对自己的解决方案并不满意,但只是想让你知道存在另一种方式。这完全取决于您的场景,项目是学术性的一次性项目还是商业项目等。