Lucene MoreLikeThis.like(fieldName,reader)中“fieldName”的目的是什么?

时间:2015-08-21 04:10:20

标签: java lucene morelikethis

我试图将{{3}}“升级”为Lucene 5.2.1。我能够让它运行,但我不理解方法fieldName的参数like(String fieldName, Reader... readers)的目的。

创建文档并将其编入索引为

Document doc = new Document();
doc.add(new StringField("id", id, Store.YES));
doc.add(new Field("title", title, type));
doc.add(new Field("content", content, type));

查询初始化如下

MoreLikeThis mlt = new MoreLikeThis(reader);
mlt.setFieldNames(new String[] { "title", "content" });
Reader sReader = new StringReader(searchForSimilar);
Query query = mlt.like("title", sReader);

正如我所说,它按预期工作。类似的文档已正确恢复和排名。所以,既然de API没有解释这个论点,我做了一些实验:而不是“title”,我将它改为“content”,“xxx”和NULL。

所有人都返回相同的文件,得分相同......

我试图查看Lucene源代码,该参数用于调用addTermFrequencies,然后调用analyzer.tokenStream(fieldName, r)。在那之后,代码变得复杂到我的知识......

所以,这个论点看起来很“重要”,但正如我所说,它没有任何区别。

有谁知道它的目的?

1 个答案:

答案 0 :(得分:2)

它只适用于分析仪。

为了有效查询,MLT需要知道如何对您的内容进行标记。调用Analyzer.tokenStream必须传递一个字段名,因为有些分析人员需要它。

但是,很多人都不会这样做。例如,StandardAnalyzer不会使用该参数(请查看StandardAnalyzer.createComponents,并且您将看到它实际上从未对其执行任何操作)。对于StandardAnalyzer,实际上大多数分析仪,根据我的经验,这个论点可以是任何东西。这个领域甚至不存在。

使用它的一个例子是PerFieldAnalyzerWrapper。如果您正在使用它,则需要知道fieldname以确定要使用的分析方法。

据我所知,它不能用于其他任何事情。 like(int docnum)不需要字段名称,因为它直接驱逐了已经分析的索引术语向量。