Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个Lucene油田没有保存下来,或者还有更多的故事?_Lucene - Fatal编程技术网

为什么这个Lucene油田没有保存下来,或者还有更多的故事?

为什么这个Lucene油田没有保存下来,或者还有更多的故事?,lucene,Lucene,Lucene 4.8.1-我试图将其归结为一个非常小的示例,仅说明了这个问题 我在下面插入了一个文档,其中有一个boost值为0.75的字段。然后我立即将该文档拉回来,提取字段,然后打印出来——boost显示为1.0 public static void main(String[] args) throws IOException, ParseException { // Put a document in with a field with a boost of 0.75 A

Lucene 4.8.1-我试图将其归结为一个非常小的示例,仅说明了这个问题

我在下面插入了一个文档,其中有一个boost值为0.75的字段。然后我立即将该文档拉回来,提取字段,然后打印出来——boost显示为1.0

public static void main(String[] args) throws IOException, ParseException {

    // Put a document in with a field with a boost of 0.75
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_48);
    Directory directory = new RAMDirectory();
    IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_48, analyzer));

    Document doc = new Document();
    Field field = new Field("NAME", "VALUE", TextField.TYPE_STORED);
    field.setBoost(0.75f); // HERE'S THE CUSTOM BOOST //
    doc.add(field);
    writer.addDocument(doc);
    writer.close();


    // Find the field in the document and show it's boost
    Query query = new QueryParser(Version.LUCENE_48, "NAME", analyzer).parse("VALUE");

    IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(directory));

    ScoreDoc[] hits = searcher.search(query, null, 1000).scoreDocs;
    Document hitDoc = searcher.doc(hits[0].doc);

    IndexableField iField = hitDoc.getFields().get(0);

    // Expecting 0.75, but it shows 1.0
    System.out.println(iField.name() + " = " + iField.stringValue() + " (boost " + iField.boost() + ")");
}
现在根据
boost()
方法,应该在索引时显示字段的boost值,但输出如下:

NAME = VALUE (boost 1.0)
我用调试器检查过,在添加文档时,该字段的升幅为0.75

捕获似乎与索引时的单词有关,这与文档插入时间不同

更仔细的检查表明,提升值在存储到索引中之前会经历一些规范化旋转。因此,该值在索引中可能真的是1.0。有人能证实我的理解是否正确吗

真正的问题是,如果为同一字段存储多个具有不同提升值的值,会发生什么情况?

Field f;
f = new Field("NAME", "AAA", TextField.TYPE_STORED); f(0.25); doc.add(f);
f = new Field("NAME", "BBB", TextField.TYPE_STORED); f(0.35); doc.add(f);
f = new Field("NAME", "CCC", TextField.TYPE_STORED); f(0.45); doc.add(f);
我的测试显示,它们的提升值仍然为1.0

NAME = VALUE (boost 1.0)
NAME = AAA (boost 1.0)
NAME = BBB (boost 1.0)
NAME = CCC (boost 1.0)
NAME = VALUE (boost 1.0)
XXX = AAA (boost 1.0)
YYY = BBB (boost 1.0)
ZZZ = CCC (boost 1.0)
也许这个提升是这个领域的一部分,而不是它的各种价值。。。尝试另一个实验,看看不同的字段名称是否会影响提升:

Field f;
f = new Field("XXX", "AAA", TextField.TYPE_STORED); f(0.25); doc.add(f);
f = new Field("YYY", "BBB", TextField.TYPE_STORED); f(0.35); doc.add(f);
f = new Field("ZZZ", "CCC", TextField.TYPE_STORED); f(0.45); doc.add(f);
我的测试仍然显示它们的提升值都是1.0

NAME = VALUE (boost 1.0)
NAME = AAA (boost 1.0)
NAME = BBB (boost 1.0)
NAME = CCC (boost 1.0)
NAME = VALUE (boost 1.0)
XXX = AAA (boost 1.0)
YYY = BBB (boost 1.0)
ZZZ = CCC (boost 1.0)
我在不止一个文档中也得到了类似的结果。无论我做什么,我似乎总是得到1.0


我遗漏了什么?

我相信您的提升存储正确,只是无法从索引中检索提升。为了演示这一点,运行您的示例代码(感谢SSCCE!),我在行中添加了一个(该行为:
System.out.println(searcher.explain(query,0.toString());
),我们得到:

您可以在
字段norm
的倒数第二行中看到您的增强

这就给了你一个模糊的暗示,为什么你不能从指数中得到提振。它存储在fieldNorm中。这意味着您的boost与
lengthNorm
组合,然后压缩为单个字节,然后与索引中的字段一起存储。由于它被压缩为一个字节,因此压缩非常有损(精度为3位二进制数字),并且无法将该值与
lengthNorm
分开。在本例中,这似乎不重要,但如果我将索引值更改为“value AND STUFF”,则由于
lengthNorm
的影响,总体
fieldNorm
将变为0.5


另外,关于您尝试使用三个同名不同字段进行测试的附带说明:添加到同一文档中的同名字段将成为同一字段的一部分。以这种方式添加的所有增压的乘积将是最终增压(在本例中为0.039375)

关于发动机罩下发生的事情的精彩解释,谢谢。我很高兴看到提升值被考虑在内——我怀疑是这样的。我现在只是有点不知所措,不明白为什么文档似乎不遗余力地宣称可以获得提升值。很棒的帖子@femtoRgon。