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

时间:2013-10-08 11:33:51

标签: 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()
    {
        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得分(降序)排序的结果,但上面的输出显然没有排序。

我还注意到搜索条件越长,我就越频繁地遇到这类异常。

  • 结果总是按顺序降序排列吗?
  • 上面的代码中有什么我做错了吗?

我正在使用build 2.5.2700

有关重现此问题的完整代码,请访问:http://pastebin.com/K3bJ9Fsg(此问题的发布时间太长)


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

但是,我想知道: 预计在这种情况下是否会出现异常结果?

1 个答案:

答案 0 :(得分:2)

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