Lucene MoreLikeThis.like(fieldName, reader) 中 "fieldName" 的用途是什么?

What is the purpose of "fieldName" in Lucene MoreLikeThis.like(fieldName, reader)?

我正在尝试 "upgrade" this MoreLikeThis example 到 Lucene 5.2.1。我能够做到 运行,但我不明白方法 like(String fieldName, Reader... readers).

的参数 fieldName 的目的

文档的创建和索引为

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)。在那之后,据我所知,代码变得很复杂......

所以,争论似乎是 "important",但正如我所说,这没有区别。

有谁知道它的用途吗?

仅供分析仪使用。

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

但很多人不这么认为。例如,StandardAnalyzer 不使用该参数(看看 StandardAnalyzer.createComponents,您会发现它实际上从未对它执行任何操作)。根据我的经验,对于 StandardAnalyzer,实际上大多数分析器,该参数可以是任何东西。该字段甚至不必存在。

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

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