私たちはレイヴンでこのクエリに困惑していて、私たちの人生の何が悪いのか理解できません。かなり大きなインデックスがあります。また、タグの配列を含むホワイトリストドキュメントに基づいて結果を除外する変換も実行されます。
インデックスは次のとおりです。
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")
問題を引き起こしているようです。この行をコメントアウトすると機能しますが、結果は明らかにソートされていません。それを元に戻すと、同じ問題が返されますが、結果はわずかです。
わかりやすくするために、いくつかの名前を変更しました。さらに情報が必要な場合はお知らせください。
ヘルプや提案をいただければ幸いです。