1

始める前に、私は RavenDB は初めてだと言っておきましょう。

私はちょうど今それを評価しており、RavenDB-Build-616 ビルドを使用しています。サーバーを実行しています。つまり、「Raven.Server.exe」を手動で開始しました。次のテスト コードがあります。

    public class RavenFullTextSearchDemo
    {
        private DocumentStore documentStore;

        private List<string> firstNames = new List<string>() { "John", "Peter", "Paul", "Sam", "Brendon" };
        private List<string> lastNames = new List<string>() { "Simons", "Black", "Benson", "Jones", "Breckwell" };
        private Random rand = new Random();


        public RavenFullTextSearchDemo(DocumentStore documentStore)
        {
            this.documentStore = documentStore;
        }


        public void Run()
        {

            IndexCreation.CreateIndexes(typeof(RavenFullTextSearchDemo).Assembly, this.documentStore);

            using (IDocumentSession session = documentStore.OpenSession())
            {
                //add some random Users 
                for (int i = 0; i < 5; i++)
                {
                    string name = string.Format("{0} {1},", 
                        firstNames[rand.Next(firstNames.Count)], lastNames[rand.Next(lastNames.Count)]);
                    User newUser = new User { Name = name };
                    session.Store(newUser);
                }
                session.SaveChanges();


                //Seem to have to give it some time to persist??? Seems very odd
                //If I take the following line out, I dont get any users back at all
                Thread.Sleep(3000);

                PrintCurrentUsers(session);

                var searchName = firstNames[rand.Next(firstNames.Count)];

                Console.WriteLine(string.Format("Looking for users with Name starting with '{0}'\r\n", searchName));

                Console.WriteLine("Simple starts with");
                foreach (var person in Queryable.Where(session.Query<User, User_ByName_FullTextSearch>(), x => x.Name.StartsWith(searchName)))
                {
                    Console.WriteLine(person.Name);
                }

                Console.WriteLine("\r\n");
                Console.WriteLine("Complex starts with");

                IQueryable<User> query = session.Query<User, User_ByName_FullTextSearch>();

                query = searchName.Split().Aggregate(query, (current, part) => current.Where(x => x.Name.StartsWith(part)));

                foreach (var person in query)
                {
                    Console.WriteLine(person.Name);
                }
            }

        }


        private void PrintCurrentUsers(IDocumentSession session)
        {
            IList<User> users = new List<User>();
            Console.WriteLine("The current list of users is :\r\n");
            foreach (User user in session.Query<User>().ToList())
            {
                Console.WriteLine(string.Format("UserName : {0}", user.Name));
            }
            Console.WriteLine("\r\n\r\n");
        }

    }



    public class User_ByName_FullTextSearch : AbstractIndexCreationTask<User>
    {
        public User_ByName_FullTextSearch()
        {
            Map = users => from user in users
                            select new { user.Name };
            Index(x => x.Name, FieldIndexing.Analyzed);
        }
    }

これがこのように呼び出される場所

    using (var documentStore = new DocumentStore { Url = documentStoreLocation, DefaultDatabase = "ravenTest-" + DateTime.Now.Ticks })
    {
        documentStore.Initialize();
        RavenFullTextSearchDemo ravenFullTextSearchMessAround = new RavenFullTextSearchDemo(documentStore);
        ravenFullTextSearchMessAround.Run();
    }

新しい User オブジェクトをディスクに永続化するには、Thread.Sleep が必要なようです。その Thread.Sleep がそこにない場合、「PrintCurrentUsers」メソッド呼び出しで何も出力されません。

これは、Thread.Sleep なしで得られる出力です。

++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++ 現在のユーザーのリストは次のとおりです。

名前が「ポール」で始まるユーザーを探しています

シンプルはポール・ジョーンズから始まり、

コンプレックスはポール・ジョーンズから始まり、

これは私が Thread.Sleep で得た出力ですが

ユーザーの現在のリストは次のとおりです。

ユーザー名 : ポール ブラック、ユーザー名 : ポール ベンソン、ユーザー名 : ポール ジョーンズ、ユーザー名 : ピーター ブラック、ユーザー名 : ポール シモンズ、

++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++

名前が「ポール」で始まるユーザーを探しています

シンプルはポール・ブラック、ポール・ベンソン、ポール・ジョーンズ、ポール・シモンズ、

コンプレックスはポール・ブラック、ポール・ベンソン、ポール・ジョーンズ、ポール・シモンズ、

私は何を間違っていますか。他の場所に、多数のユーザーを挿入してすぐに取得するコードがいくつかありますが、それはうまくいくようです。

手がかりはありますか?

4

1 に答える 1

5

ユーザーは永続化されていますが、インデックスはバックグラウンドで更新され、インデックスに対してクエリを実行しています (これは仕様によるものです)。参照: http://ravendb.net/docs/client-api/querying

すべての古いデータがクエリに含まれるまで待機するよう Raven に指示できます。

インデックスが最新になるまで待機する方法の例については、 http: //ravendb.net/docs/client-api/querying/stale-indexesのページを参照してください。(具体的には、メソッドを次のように変更する必要があります。

    private void PrintCurrentUsers(IDocumentSession session)
    {
        IList<User> users = new List<User>();
        Console.WriteLine("The current list of users is :\r\n");
        foreach (User user in session.Query<User>()
            .Customize(x => x.WaitForNonStaleResults(TimeSpan.FromSeconds(5)))
            .ToList())
        {
            Console.WriteLine(string.Format("UserName : {0}", user.Name));
        }
        Console.WriteLine("\r\n\r\n");
    }
于 2012-04-12T15:10:55.237 に答える