diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/examinemanagement.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/examinemanagement.html index 8f07e0f050..da9a1312ed 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/examinemanagement.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/examinemanagement.html @@ -3,232 +3,285 @@

Examine Management

- Loading... +
+
-

Indexers

+
- - -

Searchers

- -
+ + + +
+ +
+
Searchers
+
+ +
+
+
+
Search indexes
+
Allows you to search the indexes and view the searcher properties
+
+ +
+ +
+ +
+ +
+ + +
+
    +
  • + + Search tools + +
    + Hide search results + +
    + +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + +
    ScoreIdValues
    {{result.Score}}{{result.Id}} + + {{key}}: + {{val}} + +
    +
    +
    +
  • +
  • + Provider properties + + + + + + +
     
    {{key}}{{val}}
    +
  • +
+
+
+
+
+
+ + + - - - diff --git a/src/Umbraco.Web/Search/ExamineIndexerModel.cs b/src/Umbraco.Web/Search/ExamineIndexerModel.cs index 4fb557d318..5f4a4b8cb2 100644 --- a/src/Umbraco.Web/Search/ExamineIndexerModel.cs +++ b/src/Umbraco.Web/Search/ExamineIndexerModel.cs @@ -8,6 +8,7 @@ namespace Umbraco.Web.Search [DataContract(Name = "indexer", Namespace = "")] public class ExamineIndexerModel : ExamineSearcherModel { + [DataMember(Name = "indexCriteria")] public IIndexCriteria IndexCriteria { get; set; } diff --git a/src/Umbraco.Web/Search/ExamineSearcherModel.cs b/src/Umbraco.Web/Search/ExamineSearcherModel.cs index d1f1a83453..390556b2b5 100644 --- a/src/Umbraco.Web/Search/ExamineSearcherModel.cs +++ b/src/Umbraco.Web/Search/ExamineSearcherModel.cs @@ -14,6 +14,18 @@ namespace Umbraco.Web.Search ProviderProperties = new Dictionary(); } + /// + /// If the index is not healthy this represents the index error state + /// + [DataMember(Name = "error")] + public string Error { get; set; } + + /// + /// If the index can be open/read + /// + [DataMember(Name = "isHealthy")] + public bool IsHealthy { get; set; } + [DataMember(Name = "name")] public string Name { get; set; } diff --git a/src/Umbraco.Web/Search/LuceneIndexerExtensions.cs b/src/Umbraco.Web/Search/LuceneIndexerExtensions.cs index 34ad71d2f9..8178778a32 100644 --- a/src/Umbraco.Web/Search/LuceneIndexerExtensions.cs +++ b/src/Umbraco.Web/Search/LuceneIndexerExtensions.cs @@ -15,6 +15,28 @@ namespace Umbraco.Web.Search /// internal static class ExamineExtensions { + /// + /// Checks if the index can be read/opened + /// + /// + /// The exception returned if there was an error + /// + public static bool IsHealthy(this LuceneIndexer indexer, out Exception ex) + { + try + { + using (indexer.GetIndexWriter().GetReader()) + { + ex = null; + return true; + } + } + catch (Exception e) + { + ex = e; + return false; + } + } /// /// Return the number of indexed documents in Lucene diff --git a/src/Umbraco.Web/WebServices/ExamineManagementApiController.cs b/src/Umbraco.Web/WebServices/ExamineManagementApiController.cs index 79e7fe8f53..1a4f5d4b5d 100644 --- a/src/Umbraco.Web/WebServices/ExamineManagementApiController.cs +++ b/src/Umbraco.Web/WebServices/ExamineManagementApiController.cs @@ -86,7 +86,7 @@ namespace Umbraco.Web.WebServices var model = new List( ExamineManager.Instance.SearchProviderCollection.Cast().Select(searcher => { - var indexerModel = new ExamineIndexerModel() + var indexerModel = new ExamineSearcherModel() { Name = searcher.Name }; @@ -260,6 +260,7 @@ namespace Umbraco.Web.WebServices IndexCriteria = indexer.IndexerData, Name = indexer.Name }; + var props = TypeHelper.CachedDiscoverableProperties(indexer.GetType(), mustWrite: false) //ignore these properties .Where(x => new[] {"IndexerData", "Description", "WorkingFolder"}.InvariantContains(x.Name) == false) @@ -281,11 +282,21 @@ namespace Umbraco.Web.WebServices var luceneIndexer = indexer as LuceneIndexer; if (luceneIndexer != null) - { + { indexerModel.IsLuceneIndex = true; if (luceneIndexer.IndexExists()) { + Exception indexError; + indexerModel.IsHealthy = luceneIndexer.IsHealthy(out indexError); + + if (indexerModel.IsHealthy == false) + { + //we cannot continue at this point + indexerModel.Error = indexError.ToString(); + return indexerModel; + } + indexerModel.DocumentCount = luceneIndexer.GetIndexDocumentCount(); indexerModel.FieldCount = luceneIndexer.GetIndexFieldCount(); indexerModel.IsOptimized = luceneIndexer.IsIndexOptimized();