Browse Source

Indexing improved and migrator.

pull/349/head
Sebastian 8 years ago
parent
commit
b9f78ec4b8
  1. 7
      src/Squidex.Domain.Apps.Entities/Contents/Text/PersistenceHelper.cs
  2. 41
      src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexerGrain.cs
  3. 5
      tools/Migrate_01/MigrationPath.cs
  4. 2
      tools/Migrate_01/Migrations/DeleteContentCollections.cs
  5. 6
      tools/Migrate_01/Rebuilder.cs

7
src/Squidex.Domain.Apps.Entities/Contents/Text/PersistenceHelper.cs

@ -9,6 +9,7 @@ using System;
using System.IO; using System.IO;
using System.IO.Compression; using System.IO.Compression;
using System.Threading.Tasks; using System.Threading.Tasks;
using Lucene.Net.Index;
using Squidex.Infrastructure.Assets; using Squidex.Infrastructure.Assets;
namespace Squidex.Domain.Apps.Entities.Contents.Text namespace Squidex.Domain.Apps.Entities.Contents.Text
@ -18,7 +19,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
private const string ArchiveFile = "Archive.zip"; private const string ArchiveFile = "Archive.zip";
private const string LockFile = "write.lock"; private const string LockFile = "write.lock";
public static async Task UploadDirectoryAsync(this IAssetStore assetStore, DirectoryInfo directory) public static async Task UploadDirectoryAsync(this IAssetStore assetStore, DirectoryInfo directory, IndexCommit commit)
{ {
using (var fileStream = new FileStream( using (var fileStream = new FileStream(
Path.Combine(directory.FullName, ArchiveFile), Path.Combine(directory.FullName, ArchiveFile),
@ -30,8 +31,10 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
{ {
using (var zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Create, true)) using (var zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Create, true))
{ {
foreach (var file in directory.GetFiles()) foreach (var fileName in commit.FileNames)
{ {
var file = new FileInfo(Path.Combine(directory.FullName, fileName));
try try
{ {
if (!file.Name.Equals(ArchiveFile, StringComparison.OrdinalIgnoreCase) && if (!file.Name.Equals(ArchiveFile, StringComparison.OrdinalIgnoreCase) &&

41
src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexerGrain.cs

@ -37,11 +37,15 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
private const string MetaDraft = "_dd"; private const string MetaDraft = "_dd";
private static readonly TimeSpan CommitDelay = TimeSpan.FromSeconds(30); private static readonly TimeSpan CommitDelay = TimeSpan.FromSeconds(30);
private static readonly Analyzer Analyzer = new MultiLanguageAnalyzer(Version); private static readonly Analyzer Analyzer = new MultiLanguageAnalyzer(Version);
private static readonly TermsFilter DraftFilter = new TermsFilter(new Term(MetaDraft, "1"));
private static readonly TermsFilter NoDraftFilter = new TermsFilter(new Term(MetaDraft, "0"));
private readonly SnapshotDeletionPolicy snapshotter = new SnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy());
private readonly IAssetStore assetStore; private readonly IAssetStore assetStore;
private IDisposable timer; private IDisposable timer;
private DirectoryInfo directory; private DirectoryInfo directory;
private IndexWriter indexWriter; private IndexWriter indexWriter;
private IndexReader indexReader; private IndexReader indexReader;
private IndexSearcher indexSearcher;
private QueryParser queryParser; private QueryParser queryParser;
private HashSet<string> currentLanguages; private HashSet<string> currentLanguages;
private long updates; private long updates;
@ -64,8 +68,18 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
await assetStore.DownloadAsync(directory); await assetStore.DownloadAsync(directory);
indexWriter = new IndexWriter(FSDirectory.Open(directory), new IndexWriterConfig(Version, Analyzer)); var config = new IndexWriterConfig(Version, Analyzer)
indexReader = indexWriter.GetReader(true); {
IndexDeletionPolicy = snapshotter
};
indexWriter = new IndexWriter(FSDirectory.Open(directory), config);
if (indexWriter.NumDocs > 0)
{
indexReader = indexWriter.GetReader(false);
indexSearcher = new IndexSearcher(indexReader);
}
} }
public Task DeleteAsync(Guid id) public Task DeleteAsync(Guid id)
@ -78,11 +92,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
public Task IndexAsync(Guid id, J<IndexData> data) public Task IndexAsync(Guid id, J<IndexData> data)
{ {
var docId = id.ToString(); var docId = id.ToString();
var docDraft = data.Value.IsDraft.ToString(); var docDraft = data.Value.IsDraft ? "1" : "0";
var docKey = $"{docId}_{docDraft}"; var docKey = $"{docId}_{docDraft}";
var query = new BooleanQuery();
indexWriter.DeleteDocuments(new Term(MetaKey, docKey)); indexWriter.DeleteDocuments(new Term(MetaKey, docKey));
var languages = new Dictionary<string, StringBuilder>(); var languages = new Dictionary<string, StringBuilder>();
@ -165,9 +177,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
if (indexReader != null) if (indexReader != null)
{ {
var filter = new TermsFilter(new Term(MetaDraft, context.IsDraft.ToString())); var filter = context.IsDraft ? DraftFilter : NoDraftFilter;
var hits = new IndexSearcher(indexReader).Search(query, filter, MaxResults).ScoreDocs; var hits = indexSearcher.Search(query, filter, MaxResults).ScoreDocs;
foreach (var hit in hits) foreach (var hit in hits)
{ {
@ -236,13 +248,22 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
{ {
if (updates > 0 && indexWriter != null) if (updates > 0 && indexWriter != null)
{ {
indexWriter.Flush(true, true);
indexWriter.Commit(); indexWriter.Commit();
indexWriter.Flush(true, true);
indexReader?.Dispose(); indexReader?.Dispose();
indexReader = indexWriter.GetReader(true); indexReader = indexWriter.GetReader(false);
indexSearcher = new IndexSearcher(indexReader);
await assetStore.UploadDirectoryAsync(directory); var commit = snapshotter.Snapshot();
try
{
await assetStore.UploadDirectoryAsync(directory, commit);
}
finally
{
snapshotter.Release(commit);
}
updates = 0; updates = 0;
} }

5
tools/Migrate_01/MigrationPath.cs

@ -16,7 +16,7 @@ namespace Migrate_01
{ {
public sealed class MigrationPath : IMigrationPath public sealed class MigrationPath : IMigrationPath
{ {
private const int CurrentVersion = 14; private const int CurrentVersion = 15;
private readonly IServiceProvider serviceProvider; private readonly IServiceProvider serviceProvider;
public MigrationPath(IServiceProvider serviceProvider) public MigrationPath(IServiceProvider serviceProvider)
@ -72,7 +72,8 @@ namespace Migrate_01
} }
// Version 11: Introduce content drafts. // Version 11: Introduce content drafts.
if (version < 11) // Version 15: Introduce custom full text search actors.
if (version < 15)
{ {
yield return serviceProvider.GetService<DeleteContentCollections>(); yield return serviceProvider.GetService<DeleteContentCollections>();
yield return serviceProvider.GetRequiredService<RebuildContents>(); yield return serviceProvider.GetRequiredService<RebuildContents>();

2
tools/Migrate_01/Migrations/DeleteContentCollections.cs

@ -24,6 +24,8 @@ namespace Migrate_01.Migrations
{ {
await database.DropCollectionAsync("States_Contents"); await database.DropCollectionAsync("States_Contents");
await database.DropCollectionAsync("States_Contents_Archive"); await database.DropCollectionAsync("States_Contents_Archive");
await database.DropCollectionAsync("State_Content_Draft");
await database.DropCollectionAsync("State_Content_Published");
} }
} }
} }

6
tools/Migrate_01/Rebuilder.cs

@ -96,7 +96,11 @@ namespace Migrate_01
{ {
var handledIds = new HashSet<Guid>(); var handledIds = new HashSet<Guid>();
var worker = new ActionBlock<Guid>(action, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 32 }); var worker = new ActionBlock<Guid>(action,
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 32
});
await eventStore.QueryAsync(async storedEvent => await eventStore.QueryAsync(async storedEvent =>
{ {

Loading…
Cancel
Save