gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:09 25 4
gpt4 key购买 nike

我正在尝试“升级”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 没有解释该参数,我做了一些实验:我将其改为“内容”、“xxx”和 NULL,而不是“标题”。

他们都返回了相同的文档,具有相同的分数...

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

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

有人知道它的用途吗?

最佳答案

它只是用于分析器。

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

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

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

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

关于java - Lucene MoreLikeThis.like(fieldName, reader) 中 "fieldName"的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32132226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com