C# 全文查询结果按分数排序不正确

C# 全文查询结果按分数排序不正确,c#,full-text-search,ravendb,lucene.net,C#,Full Text Search,Ravendb,Lucene.net,我有一个RavenDB数据库,其中有一些文档如下所示: public class TextDocument { public string Id { get; set; } public string IndexedText { get; set; } } 我还定义了全文索引,定义如下: public class TextIndex : AbstractIndexCreationTask<TextDocument> { public TextIndex()

我有一个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);
    }
}
我对每个搜索词执行一次搜索,并按顺序显示搜索结果的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);
            }
        }
    }
}
奇怪的是,尽管我要求按Lucene评分(降序)排序结果,但上面的输出显然没有排序

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

  • 结果不应该总是按分数递减吗
  • 上面的代码中是否有我做错的地方
我使用的是build 2.5.2700

复制该问题的完整代码可在以下网址获得:(太长,无法在此问题中发布)


更新:根据他的建议,我尝试为每个查询打开不同的会话,这解决了问题


但是,我想知道:对多个查询重用一个会话实例有那么糟糕吗?在这种情况下,它会得到异常结果吗?

它看起来像是在后台线程中评估Lucene分数和向用户显示分数之间的竞争条件(
.Value(“Temp Index Score”)
)。可能,有时会显示以前标准的分数。解决方案是为每个搜索条件都有自己的会话。

可能类似于
.Customize(x=>x.WaitForNonSaleResults())
()?@VladimirFrolov我也尝试过,但没有改变任何东西。或者尝试为每个条件打开新会话。@VladimirFrolov谢谢!你的建议解决了我的问题。我仍然很好奇重复使用会话是否有那么糟糕,我正在等待一个能够澄清这一点的答案。如果我没有得到这样的答案,我很乐意接受你的答案。也许是会话缓存了文档,尽管从未更新元数据(因此
Temp Index Score
),是的,这一定是原因。谢谢
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);
            }
        }
    }
}