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)
不需要字段名,因为它直接从已经分析过的索引术语向量中剔除。
我正在尝试 "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)
不需要字段名,因为它直接从已经分析过的索引术语向量中剔除。