1

私たちはレイヴンでこのクエリに困惑していて、私たちの人生の何が悪いのか理解できません。かなり大きなインデックスがあります。また、タグの配列を含むホワイトリストドキュメントに基づいて結果を除外する変換も実行されます。

インデックスは次のとおりです。

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

1 に答える 1

4

私はであると仮定しwhereますTransformResults。TRは、ページングが発生した後に発生することに注意してください。したがって、100個のアイテムをフィードすると、TRはそれらをフィルターで除外しますが、ページの残りの部分を埋めるために追加の結果を取得する試みはありません。

一般に、TRはフィルタリングを行うべきではありません。

クエリでこれを行う必要があります。

于 2013-03-25T10:41:27.803 に答える