2013-03-25 2 views
1

Мы в тупике по этому запросу в Ворон и не можем понять, что с ним не так в жизни. У нас довольно большой индекс. Он также имеет преобразование, которое выполняется, которое отфильтровывает результаты на основе белого списка документов, который содержит массив тегов.Любая идея, почему этот запрос RavenDB возвращает только 6 результатов?

Здесь индекс:

public class Entries_ByWhiteListSearchableFields 
     : AbstractIndexCreationTask<Entry, Entries_ByWhiteListSearchableFields.Result> 
    { 
     public class Result 
     { 
      public string Id { get; set; } 
      public IEnumerable<string> Search { get; set; } 
      public DateTimeOffset? LastPublishedAtUtc { get; set; } 
      public DateTimeOffset LastModifiedAtUtc { get; set; } 
      public DateTimeOffset DisplayAtUtc { get; set; } 
      public PublishStatus PublishStatus { get; set; } 
      public IEnumerable<string> BylineIds { get; set; } 
      public IEnumerable<string> TagIds { get; set; } 
      public IEnumerable<string> ReferenceIds { get; set; } 
      public string SourceStreamConfigId { get; set; } 
      public bool Deleted { get; set; } 
      public IEnumerable<string> FullyQualifiedTagIds { get; set; } 
      public DateTimeOffset? ExpireAtUtc { get; set; } 
     } 

     public Entries_ByWhiteListSearchableFields() 
     { 
      this.Map = entries => from entry in entries 
            let entrySection = entry.Tags.FirstOrDefault(tag => tag.Schema == "EntrySection") 
            where entrySection != null 
            select new 
            { 
             Id = entry.Id, 
             Search = entry.Tags 
              .Select(x => x.Label) 
              .Concat(new[] { entry.Headline }), 

             LastPublishedAtUtc = entry.LastPublishedAtUtc, 
             LastModifiedAtUtc = entry.LastModifiedAtUtc, 
             DisplayAtUtc = entry.LastPublishedAtUtc ?? entry.LastModifiedAtUtc, 
             PublishStatus = entry.PublishStatus, 
             BylineIds = entry.BylineIds, 
             TagIds = entry.Tags.Select(x => x.Id), 
             ReferenceIds = entry.References.Select(x => x.Id), 
             Deleted = entry.Deleted, 
             EntrySectionId = entrySection.Id, 
             FullyQualifiedTagIds = entry.Tags.Select(t => t.Schema + "." + t.Id), 
             ExpireAtUtc = entry.ExpireAtUtc 
            }; 

      this.TransformResults = 
       (database, entries) => from entry in entries 
             let whitelist = database.Load<WhiteList>("whitelistdocid") 
             where database.Load<Entry>(entry.Id) 
                .Tags 
                .Select(t => t.Schema + "." + t.Id) 
                .Intersect(
                 whitelist.WhiteList.Select(s => "EntrySection." + s)) 
                .Any() 
             select entry; 
      this.Index(x => x.Search, FieldIndexing.Analyzed); 
     } 
    } 

У нас это точно такой же индекс уже работает, но без преобразования, и она прекрасно работает.

Этот показатель также, кажется, работает, но в одном месте, у нас есть этот запрос:

query = this.session.Advanced.LuceneQuery<Entry, Entries_ByWhiteListSearchableFields>()  
.Statistics(out stats) 
.WhereEquals("Deleted", false) 
.OrderBy("-DisplayAtUtc") 
.Skip(queryModel.PageSize * (queryModel.Page - 1)) 
.Take(queryModel.PageSize) 
.Include("BylineIds") 
.Include("Tags,Id") 
.Include("References,Id") 
.Select(factory.GetEntryDashboardItemViewModel); 

Этот запрос работает отлично с вне первоначального индекса без преобразования. Однако с новым индексом, когда мы запрашиваем pageSize из 100, он возвращает только 6 результатов. Когда мы просим 50, он возвращает только несколько. Когда мы просим 25, она возвращает 0.

Однако эту линию:

.OrderBy("-DisplayAtUtc") 

Кажется, причина проблемы. Когда мы прокомментируем эту строку, она работает, но результаты не отсортированы явно. Когда мы вернем его обратно, та же проблема с возвратом только нескольких результатов.

Я переименовал несколько вещей, чтобы иметь больше смысла. Пожалуйста, дайте мне знать, нужна ли дополнительная информация.

Любая помощь или предложения приветствуются.

ответ

4

Я бы предположил, что where в TransformResults. Обратите внимание, что TR происходит после произошел пейджинг. Таким образом, вы подаете 100 экземпляров, TR фильтрует их, но нет никакой попытки получить дополнительные результаты, чтобы заполнить остальную часть страницы.

Как правило, TR не следует фильтровать.

Вы должны сделать это в своем запросе.

+0

Спасибо за ваш ответ! Это именно то, что происходит. Мы изначально делали это в нашем запросе, но белый список стал слишком длинным и превысил максимальную длину запроса. Мы знали, что это будет продолжаться, поэтому мы пытались что-то новое. Мы говорили об этом, и теперь мы собираемся удалить трансформацию и попробовать что-то новое. Мы собираемся добавить индексную переменную под названием «Видимый» и установить это значение true или false на основе белого списка. Итак, мы можем запросить это новое свойство «Видимое». Это потребует обновления индекса в будущем, но это будет редко. – davesters81

Смежные вопросы