4

我在 Lucene 索引中存储了大量文档,并且我正在使用 customAnalyzer,它基本上对文档内容进行标记化和词干化。

现在,如果我在文档中搜索“love”一词,我会得到将 love 用作名词或动词的结果,而我只想要那些仅将 love 用作动词的文档。

如果我还可以将单词的词性与单词一起提到,那么如何实现这样的功能,以使结果仅将love用作动词而不用作名词?

我可以想出一种方法来初始词性标记文档的每个单词并通过在词性后面附加带有“_”或其他内容的词来存储它,然后进行相应的搜索,但想知道是否有在 Lucene 中执行此操作的更聪明的方法。

4

1 回答 1

1

我可以想到以下方法。

方法一

就像您提到的那样:在索引时识别词性标签并将其附加到实际术语。在查询时做同样的事情。

我想讨论相关的缺点。

缺点:

1) 未来的要求可能会要求您获得结果,而不管词性如何。包含修改条款的索引将不起作用。

2) 您可能想要执行像“术语:名词或形容词”这样的 BooleanQuery。您必须自己编写查询扩展器。

方法二

尝试使用 Lucene 的 Payloads 功能。

这是关于 Lucene Payloads 的简短教程

解决您的用例的步骤。

1) 以 Payload 的形式存储词性标签。

2) 每个词性标签都有自定义的相似度类。

3) 根据查询,将对应的 CustomSimilarity 分配给 IndexSearcher。例如,为名词查询分配 NounBoostingSimilarity。

4)基于有效负载提高或“降低”文档的分数。上述教程中给出的示例。

5) 编写一个自定义收集器来过滤掉分数不符合上述分数提升逻辑的文档。

这种方法的优点是索引与任何其他正常搜索保持兼容。

缺点:

1) 维护开销:必须为每个相似性维护多个 IndexSearcher。2)有点复杂的代码解决方案。

坦率地说,我对自己的解决方案并不满意,只是想让您知道存在另一种方法。这完全取决于您的方案,该项目是学术一次性项目还是商业项目等。

于 2013-04-13T17:26:11.247 回答