public IndexShard GetOrCreateShard(string shardName) { BuildServices(); var shard = new IndexShard(); shard.Name = shardName; if (_shardCollections.TryGetValue(shard.Name, out shard)) { return(shard); } var directoryType = (ConfigurationManager.AppSettings["lucene:DirectoryType"] ?? "Filesystem").ToLower(); Lucene.Net.Store.Directory directory = null; var directoryConnectionString = ConfigurationManager.AppSettings["lucene:BlobConnectionString"] ?? "App_Data/My_Index"; switch (directoryType) { case Constants.ContainerType.Azure: var directoryContainerName = ConfigurationManager.AppSettings["lucene:ContainerName"] ?? "lucene"; var connectionString = directoryConnectionString; var containerName = directoryContainerName; var storageAccount = CloudStorageAccount.Parse(connectionString); var azureDir = new FastAzureDirectory(storageAccount, containerName, new RAMDirectory(), shardName); directory = azureDir; break; case Constants.ContainerType.FileSystem: directoryConnectionString = directoryConnectionString.TrimEnd('/'); directoryConnectionString += "/" + shardName; var folderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, directoryConnectionString); var fsDirectory = FSDirectory.Open(folderPath); directory = fsDirectory; break; default: break; } if (directory == null) { return(null); } if (!IndexReader.IndexExists(directory)) { using (new IndexWriter(directory, new StandardAnalyzer(LuceneConfiguration.LuceneVersion), true, IndexWriter.MaxFieldLength.UNLIMITED)) { } } shard = new IndexShard(); shard.Name = shardName; shard.Directory = directory; _shardCollections.TryAdd(shard.Name, shard); return(shard); }
private static void Initialize() { if (_initialized) { return; } lock (_lock) { if (_initialized) { return; } try { LuceneSection section = (LuceneSection)ConfigurationManager.GetSection("lucene.indexing"); _indexAllTypes = section.IndexAllTypes; _isActive = section.Active; if (_isActive == null || !_isActive.Value) { _initialized = true; return; } _fieldPrefix = section.Prefix; _luceneVersion = section.LuceneVersion; _includedTypes = new Dictionary <string, ContentTypeDocument>(); string[] strArray = new string[0]; var fieldAnalyzerWrapper = new PerFieldAnalyzerWrapper((Analyzer) new StandardAnalyzer(LuceneVersion, StopFilter.MakeStopSet(strArray))); if (!IndexAllTypes) { foreach (IncludedTypeElement typeSetting in section.IncludedTypes) { Type contentType = Type.GetType(typeSetting.Type, true, true); if (contentType == null) { continue; } if (!_includedTypes.TryGetValue(typeSetting.Name, out var tmp)) { var documentIndexModel = new ContentTypeDocument(); documentIndexModel.ContentType = contentType; documentIndexModel.IndexAllFields = typeSetting.IndexAllFields; _includedTypes.Add(typeSetting.Name, documentIndexModel); foreach (IncludedFieldElement fieldSetting in typeSetting.IncludedFields) { Type fieldType; if (string.IsNullOrEmpty(fieldSetting.Type)) { fieldType = typeof(DefaultComputedField); } else { fieldType = Type.GetType(fieldSetting.Type, true, true); } if (!typeof(IComputedField).IsAssignableFrom(fieldType)) { continue; } var instance = (IComputedField)Activator.CreateInstance(fieldType); Type analyzerType = Type.GetType(fieldSetting.Analyzer, true, true); if (!typeof(Analyzer).IsAssignableFrom(analyzerType)) { continue; } if (analyzerType == typeof(StandardAnalyzer)) { instance.Analyzer = new StandardAnalyzer(LuceneVersion, StopFilter.MakeStopSet(strArray)); } else { instance.Analyzer = (Analyzer)Activator.CreateInstance(analyzerType); } instance.Index = fieldSetting.Index; instance.Store = fieldSetting.Store; instance.Vector = fieldSetting.Vector; instance.DataType = fieldSetting.DataType; if (!documentIndexModel.IndexedFields.TryGetValue(fieldSetting.Name, out var tmp2)) { documentIndexModel.IndexedFields.Add(fieldSetting.Name, instance); fieldAnalyzerWrapper.AddAnalyzer(ContentIndexHelpers.GetIndexFieldName(fieldSetting.Name), instance.Analyzer); } } } } } _analyzer = fieldAnalyzerWrapper; AddDefaultFieldAnalyzer(); var shardingStrategy = section.Sharding?.Strategy; if (!string.IsNullOrEmpty(shardingStrategy)) { var shardingType = Type.GetType(shardingStrategy, true, true); LuceneContext.IndexShardingStrategy = (IIndexShardingStrategy)Activator.CreateInstance(shardingType); LuceneContext.IndexShardingStrategy.WarmupShards(); return; } Directory directory; var directoryConnectionString = ConfigurationManager.AppSettings["lucene:BlobConnectionString"] ?? "App_Data/My_Index"; var directoryContainerName = ConfigurationManager.AppSettings["lucene:ContainerName"] ?? "lucene"; var directoryType = (ConfigurationManager.AppSettings["lucene:DirectoryType"] ?? "Filesystem").ToLower(); switch (directoryType) { case Constants.ContainerType.Azure: var connectionString = directoryConnectionString; var containerName = directoryContainerName; var storageAccount = CloudStorageAccount.Parse(connectionString); var azureDir = new FastAzureDirectory(storageAccount, containerName, new RAMDirectory()); directory = azureDir; break; default: var folderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, directoryConnectionString); var fsDirectory = FSDirectory.Open(folderPath); directory = fsDirectory; break; } _directory = directory; InitDirectory(_directory); } catch (Exception ex) { throw ex; } _initialized = true; } }