2012-04-12 176 views
1

在我开始之前让我说我是RavenDB的新手。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(); 
    } 

有什么奇怪继续,因为我似乎需要Thread.Sleep为了新的用户对象被保存到磁盘。如果我没有那个Thread.Sleep,那么在“PrintCurrentUsers”方法调用中我什么都看不到。

这是输出我没有了Thread.Sleep

得到+++++++++++++++++++++++++++++++ +++++++++++++++++++++++++ 用户的当前列表为:

寻找用户名称以“保”

简单的开始与 ·保罗·琼斯,

复杂打头 ·保罗·琼斯,

虽然这是我的输出用的Thread.Sleep得到

用户的当前列表为:

用户名:保罗黑色, 用户名:保罗·本森, 用户名:保罗·琼斯, 用户名:彼得·布莱克, 用户名:保罗·西蒙斯,

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

正在寻找名字以'Paul'开头的用户

简单的开始与 保罗黑色, 保罗·本森, 保罗·琼斯, 保罗·西蒙斯,

情结开始与 保罗黑色, 保罗·本森, 保罗·琼斯, 保罗·西蒙斯,

我究竟做错了什么。我在其他地方有其他代码插入一堆用户,并立即获得它们,这似乎工作正常。

任何线索有人吗?

+0

西蒙是正确的,添加行.Customize(X => x.WaitForNonStaleResults(TimeSpan.FromSeconds(5)))来查询,以允许它等待最多5秒刷新索引,这是Raven遵循的'默认安全'范式的一部分,更好地为陈旧数据提供比无数据更好的服务 – JonVD 2012-04-12 15:13:21

+0

酷得到它谢谢 – sacha 2012-04-12 15:25:48

回答

5

用户正在保留,但索引在后台更新,并且您正在查询索引(这是通过设计)。请参阅:http://ravendb.net/docs/client-api/querying

您可以告诉Raven等待所有陈旧的数据在查询中。

请参阅本页:http://ravendb.net/docs/client-api/querying/stale-indexes了解如何等待索引更新的示例。(Specifially,你需要改变你的方法:

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"); 
    } 
+0

公平竞争,完全排除了我。这是一个“EXPERT”级别的东西,不应该在单元测试之外使用。我试图做的真的很奇怪吗? – sacha 2012-04-12 15:22:41

+0

实际上,你在评估程序中做什么*是一个单元测试:-)在现实中,您多久保存一些数据,然后立即重新载入它? – Simon 2012-04-12 15:24:04

+0

是的,很公平。谢谢你的回答。 – sacha 2012-04-12 15:25:37