3

我试图将这个 MoreLikeThis 示例“升级”到 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). 之后,据我所知,代码变得复杂......

所以,这个论点似乎是“重要的”,但正如我所说,它没有任何区别。

有谁知道它的目的?

4

1 回答 1

3

它只是用于分析仪。

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

很多人都没有。 StandardAnalyzer,例如,不使用该参数(看看StandardAnalyzer.createComponents,你会发现它实际上从未对它做任何事情)。对于StandardAnalyzer,实际上是大多数分析器,根据我的经验,这个论点可以是任何东西。该领域甚至不必存在。

使用它的一个例子PerFieldAnalyzerWrapper。如果您使用它,则需要知道字段名称以确定要使用的分析方法。

据我所知,它不用于其他任何用途。 like(int docnum)不需要字段名,因为它直接从已经分析过的索引词向量中分离出来。

于 2015-08-24T20:46:16.597 回答