gpt4 book ai didi

c# - 全文查询结果按分数错误排序

转载 作者:太空宇宙 更新时间:2023-11-03 10:56:42 24 4
gpt4 key购买 nike

我有一个 RavenDB 数据库,其中包含一些如下所示的文档:

public class TextDocument
{
public string Id { get; set; }
public string IndexedText { get; set; }
}

我还定义了一个全文索引,定义如下:

public class TextIndex : AbstractIndexCreationTask<TextDocument>
{
public TextIndex()
{
Map = docs =>
from doc in docs
select new { doc.IndexedText };

Analyze(x => x.IndexedText,
"Lucene.Net.Analysis.StopAnalyzer, Lucene.Net");

Indexes.Add(x => x.IndexedText, FieldIndexing.Analyzed);
}
}

假设我有三个文档,其中的 IndexedText 包含 500-1000 个单词的 Lorem Ipsum 文本。

接下来,我有一个要查询的搜索词列表:

private string[] _searchCriteria = new[]
{
"venenatis OR tortor OR tellus",
"justo OR facilisis OR iaculis",
"dignissim OR sodales OR aenean",
"in OR ornare OR bibendum OR orci",
"magna OR id OR hendrerit OR dapibus",
"metus OR nunc OR eleifend OR praesent",
"accumsan OR in OR turpis OR venenatis",
"at OR bibendum OR in",
"primis OR sit OR interdum",
"eu OR enim OR massa"
};

我对每个搜索词执行一次搜索并按顺序显示搜索结果的 Lucene 分数:

public void Search()
{
using (var ds = CreateMyDocumentStore())
using (var session = ds.OpenSession())
{
foreach (var criterion in _searchCriteria)
{
var results = session.Query<TextDocument, TextIndex>()
.Search(x => x.IndexedText, criterion)
.OrderByScore()
.ToList();

Console.WriteLine("--- Result scores for [{0}]:", criterion);

foreach (var textDocument in results)
{
var score = session.Advanced.GetMetadataFor(textDocument)
.Value<double>("Temp-Index-Score");
Console.WriteLine(score);
}
}
}
}

在大多数情况下,输出看起来是正常的(最高分在前),但偶尔我会遇到这样的异常情况:

...
--- Result scores for [magna OR id OR hendrerit OR dapibus]:
1.98572421
2.80171227
2.32371736
--- Result scores for [metus OR nunc OR eleifend OR praesent]:
2.80171227
1.98572421
2.32371736
...

奇怪的是,虽然我要求的结果是按照 Lucene 分数(降序)排序的,但上面的输出显然没有排序。

我还注意到,搜索词越长,我遇到这些异常的频率就越高。

  • 结果不应该总是按分数降序排列吗?
  • 我在上面的代码中做错了什么吗?

我正在使用构建 2.5.2700

重现问题的完整代码位于:http://pastebin.com/K3bJ9Fsg (太长了,无法在此问题中发布)


更新:在 Vladimir Frolov的建议,我尝试为每个查询打开一个不同的 session ,这解决了问题。

不过,我想知道:为多个查询重用一个 session 实例是否不好?在这种情况下是否会出现异常结果?

最佳答案

它看起来像是 Lucene 分数评估之间的竞争条件,它发生在后台线程中,并将它们显示给用户 (.Value<double>("Temp-Index-Score"))。可能有时会显示先前标准的分数。解决方案是为每个搜索条件设置自己的 session 。

关于c# - 全文查询结果按分数错误排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19246629/

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