2

私はインデックスを持っています:

public class FreeSearchIndex : 
    AbstractIndexCreationTask<Post, FreeSearchIndex.Result>
{
    public FreeSearchIndex()
    {
        Map = posts => from post in posts
                       select new
                          {
                              Query = post.Tags.Concat(new[]
                                       {
                                           post.Title,
                                           post.Body
                                       }),
                              DatePosted = post.Date
                          };

        Index(x => x.Query, FieldIndexing.Analyzed);            
    }

    public class Result
    {
        public object[] Query { get; set; }
        public DateTime DatePosted { get; set; }
    }
}

メソッドがあります:

public List<Post> Filter(string freeSearch)
{
    IQueryable<Post> posts;
    var posts = documentSession
            .Query<FreeSearchIndex.Result, FreeSearchIndex>()
            .Where(x => x.Query == (object)freeSearch)
            .OrderByDescending(x => x.DatePosted)
            .As<Post>();                                 

    return posts.ToList();
}

ユニットテストを行います:

[SetUp]
public void Setup()
{
    store = new EmbeddableDocumentStore
                {
                    RunInMemory = true
                };

    store.Initialize();

    session = store.OpenSession();

    IndexCreation.CreateIndexes(typeof(FreeSearchIndex).Assembly, store);
}

[Test]
public void GivenFreeSearchPhrase_Filter_ShouldOutputFilteredPostsByGivenPhrase()
{            
    session.Store(new Post { Body = "universal answer to everything is 42" });
    session.SaveChanges();

    var posts = Filter("everything");

    Assert.AreEqual(1, posts.Count);            
}

クエリが 0 件の投稿を返すため、失敗します。これをトラブルシューティングするにはどうすればよいですか? 生成されたクエリを確認する必要があります。ストア (メモリ内) のフィールドにどのようにインデックスを付けたかを確認できますか?

4

1 に答える 1

4

インデクサーが新しいデータを処理する時間がなかっただけだと思います。マシンの負荷、CPU、およびメモリのパフォーマンスに応じて、このテストに合格することがあります。私の知る限りではWaitForStale、単体テストで何らかのソリューションを使用する必要があります。

これは github のRavenOverflowアプリケーションから取得しました

public abstract class RavenDbFactBase : IDisposable
{        
    public class NoStaleQueriesListener : IDocumentQueryListener
    {
        public void BeforeQueryExecuted(IDocumentQueryCustomization c)
        {
            c.WaitForNonStaleResults();
        }        
    }        
}

ただし、本番環境では、それを使用せず、古いデータを高速に持ち込むだけです。

于 2012-09-04T10:18:22.810 に答える