我可以想到以下方法。
方法一
就像您提到的那样:在索引时识别词性标签并将其附加到实际术语。在查询时做同样的事情。
我想讨论相关的缺点。
缺点:
1) 未来的要求可能会要求您获得结果,而不管词性如何。包含修改条款的索引将不起作用。
2) 您可能想要执行像“术语:名词或形容词”这样的 BooleanQuery。您必须自己编写查询扩展器。
方法二
尝试使用 Lucene 的 Payloads 功能。
这是关于 Lucene Payloads 的简短教程。
解决您的用例的步骤。
1) 以 Payload 的形式存储词性标签。
2) 每个词性标签都有自定义的相似度类。
3) 根据查询,将对应的 CustomSimilarity 分配给 IndexSearcher。例如,为名词查询分配 NounBoostingSimilarity。
4)基于有效负载提高或“降低”文档的分数。上述教程中给出的示例。
5) 编写一个自定义收集器来过滤掉分数不符合上述分数提升逻辑的文档。
这种方法的优点是索引与任何其他正常搜索保持兼容。
缺点:
1) 维护开销:必须为每个相似性维护多个 IndexSearcher。2)有点复杂的代码解决方案。
坦率地说,我对自己的解决方案并不满意,只是想让您知道存在另一种方法。这完全取决于您的方案,该项目是学术一次性项目还是商业项目等。