Skip to content

Commit 5f30633

Browse files
authored
DYN-6038 Lucene search IMP (DynamoDS#14428)
* improvements * Simply initialization logic * Skip indexing as part of DynamoModel if the index files already exist * Remove DynamoModel reference and use singleton * clean up * improvements and package manager search * Use single constructor and other code clean up * Update... * Update * Dispose all Lucene objects in the correct order * Adding DynamoModel back to test regressions * Null check * Update * IndexWriter dispose sequence only for non-RAM mode
1 parent 60dac74 commit 5f30633

File tree

10 files changed

+198
-124
lines changed

10 files changed

+198
-124
lines changed

src/DynamoCore/Models/DynamoModel.cs

Lines changed: 15 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -921,16 +921,7 @@ protected DynamoModel(IStartConfiguration config)
921921

922922
CustomNodeManager = new CustomNodeManager(NodeFactory, MigrationManager, LibraryServices);
923923

924-
LuceneSearch.LuceneUtilityNodeSearch = new LuceneSearchUtility(this);
925-
926-
if (IsTestMode)
927-
{
928-
LuceneUtility.InitializeLuceneConfig(string.Empty, LuceneSearchUtility.LuceneStorage.RAM);
929-
}
930-
else
931-
{
932-
LuceneUtility.InitializeLuceneConfig(LuceneConfig.NodesIndexingDirectory);
933-
}
924+
LuceneSearch.LuceneUtilityNodeSearch = new LuceneSearchUtility(this, LuceneSearchUtility.DefaultNodeIndexStartConfig);
934925

935926
InitializeCustomNodeManager();
936927

@@ -1013,10 +1004,15 @@ protected DynamoModel(IStartConfiguration config)
10131004
TraceReconciliationProcessor = this;
10141005

10151006
State = DynamoModelState.StartedUIless;
1016-
// This event should only be raised at the end of this method.
1017-
DynamoReady(new ReadyParams(this));
10181007
// Write index to disk only once
10191008
LuceneUtility.CommitWriterChanges();
1009+
//Disposed writer if it is in file system mode so that the index files can be used by other processes (potentially a second Dynamo session)
1010+
if (LuceneUtility.startConfig.StorageType == LuceneSearchUtility.LuceneStorage.FILE_SYSTEM)
1011+
{
1012+
LuceneUtility.DisposeWriter();
1013+
}
1014+
// This event should only be raised at the end of this method.
1015+
DynamoReady(new ReadyParams(this));
10201016
}
10211017

10221018
private void SearchModel_ItemProduced(NodeModel node)
@@ -1405,12 +1401,8 @@ public void Dispose()
14051401
PreferenceSettings.MessageLogged -= LogMessage;
14061402
}
14071403

1408-
//The writer have to be disposed at DynamoModel level due that we could index package-nodes as new packages are installed
1409-
LuceneUtility.DisposeWriter();
1410-
14111404
// Lucene disposals (just if LuceneNET was initialized)
1412-
LuceneUtility.indexDir?.Dispose();
1413-
LuceneUtility.dirReader?.Dispose();
1405+
LuceneUtility.DisposeAll();
14141406

14151407
#if DEBUG
14161408
CurrentWorkspace.NodeAdded -= CrashOnDemand.CurrentWorkspace_NodeAdded;
@@ -1474,7 +1466,7 @@ private void InitializeCustomNodeManager()
14741466
var iDoc = LuceneUtility.InitializeIndexDocumentForNodes();
14751467
if (searchElement != null)
14761468
{
1477-
AddNodeTypeToSearchIndex(searchElement, iDoc);
1469+
LuceneUtility.AddNodeTypeToSearchIndex(searchElement, iDoc);
14781470
}
14791471

14801472
Action<CustomNodeInfo> infoUpdatedHandler = null;
@@ -1543,7 +1535,7 @@ private void InitializeIncludedNodes()
15431535

15441536
var cnbNode = new CodeBlockNodeSearchElement(cbnData, LibraryServices);
15451537
SearchModel?.Add(cnbNode);
1546-
AddNodeTypeToSearchIndex(cnbNode, iDoc);
1538+
LuceneUtility.AddNodeTypeToSearchIndex(cnbNode, iDoc);
15471539

15481540
var symbolSearchElement = new NodeModelSearchElement(symbolData)
15491541
{
@@ -1562,10 +1554,10 @@ private void InitializeIncludedNodes()
15621554
};
15631555

15641556
SearchModel?.Add(symbolSearchElement);
1565-
AddNodeTypeToSearchIndex(symbolSearchElement, iDoc);
1557+
LuceneUtility.AddNodeTypeToSearchIndex(symbolSearchElement, iDoc);
15661558

15671559
SearchModel?.Add(outputSearchElement);
1568-
AddNodeTypeToSearchIndex(outputSearchElement, iDoc);
1560+
LuceneUtility.AddNodeTypeToSearchIndex(outputSearchElement, iDoc);
15691561

15701562
}
15711563

@@ -1719,7 +1711,7 @@ private void LoadNodeModels(List<TypeLoadData> nodes, bool isPackageMember)
17191711
// TODO: get search element some other way
17201712
if (ele != null)
17211713
{
1722-
AddNodeTypeToSearchIndex(ele, iDoc);
1714+
LuceneUtility.AddNodeTypeToSearchIndex(ele, iDoc);
17231715
}
17241716
}
17251717
catch (Exception e)
@@ -3219,24 +3211,6 @@ private NodeModelSearchElement AddNodeTypeToSearch(TypeLoadData typeLoadData)
32193211
return node;
32203212
}
32213213

3222-
/// <summary>
3223-
/// Add node information to Lucene index
3224-
/// </summary>
3225-
/// <param name="node">node info that will be indexed</param>
3226-
/// <param name="doc">Lucene document in which the node info will be indexed</param>
3227-
internal void AddNodeTypeToSearchIndex(NodeSearchElement node, Document doc)
3228-
{
3229-
if (LuceneUtility.addedFields == null) return;
3230-
3231-
LuceneUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.FullCategoryName), node.FullCategoryName);
3232-
LuceneUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.Name), node.Name);
3233-
LuceneUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.Description), node.Description);
3234-
if (node.SearchKeywords.Count > 0) LuceneUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.SearchKeywords), node.SearchKeywords.Aggregate((x, y) => x + " " + y), true, true);
3235-
LuceneUtility.SetDocumentFieldValue(doc, nameof(LuceneConfig.NodeFieldsEnum.Parameters), node.Parameters ?? string.Empty);
3236-
3237-
LuceneUtility.writer?.AddDocument(doc);
3238-
}
3239-
32403214
/// <summary>
32413215
/// Remove node information from Lucene indexing.
32423216
/// </summary>
@@ -3296,7 +3270,7 @@ private void AddZeroTouchNodeToSearch(FunctionDescriptor functionDescriptor, Doc
32963270
{
32973271
var ele = new ZeroTouchSearchElement(functionDescriptor);
32983272
SearchModel?.Add(ele);
3299-
AddNodeTypeToSearchIndex(ele, iDoc);
3273+
LuceneUtility.AddNodeTypeToSearchIndex(ele, iDoc);
33003274
}
33013275
}
33023276

src/DynamoCore/Search/NodeSearchModel.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Dynamo.Utilities;
1111
using DynamoUtilities;
1212
using Lucene.Net.Documents;
13+
using Lucene.Net.Index;
1314
using Lucene.Net.QueryParsers.Classic;
1415
using Lucene.Net.Search;
1516

@@ -236,9 +237,14 @@ internal IEnumerable<NodeSearchElement> Search(string search, LuceneSearchUtilit
236237
if (luceneSearchUtility != null)
237238
{
238239
//The DirectoryReader and IndexSearcher have to be assigned after commiting indexing changes and before executing the Searcher.Search() method, otherwise new indexed info won't be reflected
239-
luceneSearchUtility.dirReader = luceneSearchUtility.writer?.GetReader(applyAllDeletes: true);
240-
if (luceneSearchUtility.dirReader == null) return null;
241-
240+
if (luceneSearchUtility.writer != null)
241+
{
242+
luceneSearchUtility.dirReader = luceneSearchUtility.writer.GetReader(applyAllDeletes: true);
243+
}
244+
else
245+
{
246+
luceneSearchUtility.dirReader = DirectoryReader.Open(luceneSearchUtility.indexDir);
247+
}
242248
luceneSearchUtility.Searcher = new IndexSearcher(luceneSearchUtility.dirReader);
243249

244250
string searchTerm = search.Trim();

0 commit comments

Comments
 (0)