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);
    }
}

IndexedText500 ~ 1000 語のLorem Ipsumテキストで構成される3 つのドキュメントがあるとします。

次に、照会したい検索用語のリストがあります。

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"
        };

検索用語ごとに 1 つの検索を実行し、検索結果の 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のアドバイスで、クエリごとに異なるセッションを開こうとしたところ、問題が解決しました。

ただし、知りたいのですが、セッションインスタンスを複数のクエリに再利用するのは悪いことですか? そのようなシナリオで異常な結果が得られると予想されますか?

4

1 に答える 1