2

我有一个 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的建议下,我尝试为每个查询打开一个不同的会话,这解决了问题。

但是,我想知道:为多个查询重用会话实例有那么糟糕吗?在这种情况下是否会出现异常结果?

4

1 回答 1

2

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

于 2013-10-08T13:00:51.900 回答