2012-06-10 2 views
1

문서 내의 여러 필드 (This is what I'm trying to do)를 검색 할 수 있도록 만들고 색인을 작성하려고합니다. 내가하려고하는 것을 설명하기 위해이 테스트 클래스를 만들었습니다. 제 문제는 인덱스에서 Note 필드를 분리하여 Note의 모든 단어를 검색 할 수 있도록하는 것입니다. 그러나 나는 첫 번째 단어 나 문자로 검색을하면 'A'가 될 테스트에서 아무런 히트도 얻지 못한다는 것을 알았지 만, 'B'로 검색하면 성공할 수 없다는 것을 알아 냈습니다. 왜 그런지.RavenDb 인덱스, 분할 필드, 분할의 첫 번째 항목에 적중 없음

public class Sandbox 
{ 
    [Fact] 
    public void Run_Forrest_Run() 
    { 
     var store = new EmbeddableDocumentStore 
     { 
      RunInMemory = true, 
      Conventions = { DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites } 
     }; 

     store.Initialize(); 
     IndexCreation.CreateIndexes(typeof(SearchExpenseIndex).Assembly, store); 

     using (store) 
     { 
      using (var session = store.OpenSession()) 
      { 
       session.Store(new Expense 
       { 
        Date = DateTime.Today, 
        Category = "Transport", 
        Amount = 1000, 
        Note = "A B C" 
       }); 

       session.SaveChanges(); 
      } 

      Thread.Sleep(1000); 

      // var terms = new[] {"A"}; <-- THIS WILL FAIL 
      var terms = new[] {"B"}; 

      using (var session = store.OpenSession()) 
      { 
       var result = session.Query<SearchExpenseIndex.ReduceResult, SearchExpenseIndex>() 
           .Where(x => x.Query.In(terms)) 
           .As<Expense>() 
           .Select(x => new 
           { 
            Id = x.Id, 
            Category = x.Category, 
            Date = x.Date, 
            Amount = x.Amount, 
            Note = x.Note 
           }).ToList(); 


       Assert.Equal(1, result.Count); 

      } 
     } 
    } 

    public class Expense 
    { 
     public string Id { get; set; } 
     public DateTime Date { get; set; } 
     public string Category { get; set; } 
     public decimal Amount { get; set; } 
     public string Note { get; set; } 
    } 

    public class SearchExpenseIndex : AbstractIndexCreationTask<Expense, SearchExpenseIndex.ReduceResult> 
    { 
     public class ReduceResult 
    { 
     public string Query { get; set; } 
     public string UserId { get; set; } 
    } 

     public SearchExpenseIndex() 
    { 
     Map = documents => from d in documents 
      select new 
      { 
       Query = new object[] 
       { 
        d.Category, 
        d.Note, 
        d.Note.Split(' '), 
        d.Date.ToString("yyyy-MM-dd") 
       } 
      }; 
     } 
    } 
} 

무엇이 여기에 있습니까?

답변

0

Pelle, 'A'는 영어로 된 정지 단어입니다. 따라서 어떤 검색어에 대해서도 검색 할 수 있기 때문에 실제로 검색 할 수는 없습니다.

+0

네, 그건 사실입니다. 내 생각에 그건 나쁜 부분이었습니다.). 그러나 메모를 '다른 값'으로 변경하고 '일부'를 검색하면 결과가 같아 지므로 테스트 결과가 없습니다. 스플릿의 첫 번째 값이 인덱싱되지 않는 것 같습니다. – Pelle

관련 문제