我在 Lucene 索引中存储了大量文档,并且我使用的是 customAnalyzer,它基本上对文档内容进行标记化和词干提取。
现在,如果我在文档中搜索“爱”这个词,我得到的结果是爱被用作名词或动词,而我只想要那些只将爱用作动词的文档。
如何实现这样的功能,我还可以在单词的同时提及单词的词性,以便结果只将 love 用作动词而不用作名词?
我可以想出一种方法来最初对文档的每个单词进行词性标记,并通过在 POS 上附加带有“_”或其他东西的单词来存储它,然后进行相应的搜索,但想知道是否有在 Lucene 中执行此操作的更智能方法。
最佳答案
我可以想到以下方法。
方法 1
就像您提到的:在索引时识别词性标记并将其附加到实际术语。在查询时执行相同的操作。
我想讨论相关的缺点。
缺点:
1) future 的要求可能会要求您获得与词性无关的结果。包含修改条款的索引将不起作用。
2) 您可能想要执行一个 BooleanQuery,如“term: noun or adjective”。您必须自己编写查询扩展器。
方法 2
尝试使用 Lucene 的 Payloads 功能。
这是一个简短的 tutorial on Lucene Payloads 。
解决您的用例的步骤。
1) 以有效载荷的形式存储词性标签。
2) 为每个词性标签自定义相似度类。
3)根据查询,为IndexSearcher分配对应的CustomSimilarity。例如,为名词查询分配 NounBoostingSimilarity。
4)基于有效载荷提高或“降低”文档的分数。上面教程中给出的示例。
5) 编写自定义收集器,过滤掉分数不符合上述分数提升逻辑的文档。
这种方法的优点是索引与任何其他正常搜索保持兼容。
缺点:
1) 维护开销:必须为每个相似度维护多个 IndexSearcher。
2)有点复杂的代码解决方案。
坦率地说,我对自己的解决方案并不满意,只是想让您知道存在另一种方法。这完全取决于您的场景,该项目是学术一次性项目还是商业项目等。
关于java - 是否可以通过词性搜索 Lucene 索引中的单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15988546/