public IList <T> Query <T>(string qstr, Filter filter, Sort sort, out int total, int limit = 500, int skip = 0) where T : BaseModel { EnsureSearcher(); var analyzer = PuckCache.AnalyzerForModel[typeof(T)]; var parser = new PuckQueryParser <T>(LuceneVersion.LUCENE_48, FieldKeys.PuckDefaultField, analyzer); var q = parser.Parse(qstr); TopDocs docs; if (sort == null) { docs = Searcher.Search(q, filter, limit); } else { sort = sort.Rewrite(Searcher); docs = Searcher.Search(q, filter, limit, sort); } total = docs.TotalHits; var results = new List <T>(); for (var i = skip; i < docs.ScoreDocs.Count(); i++) { var doc = Searcher.Doc(docs.ScoreDocs[i].Doc); T result = JsonConvert.DeserializeObject <T>(doc.GetValues(FieldKeys.PuckValue)[0]); results.Add(result); } return(results); }
public void Delete <T>(List <T> toDelete) where T : BaseModel { lock (write_lock) { try { if (!CanWrite) { return; } var analyzer = PuckCache.AnalyzerForModel[typeof(T)]; var parser = new PuckQueryParser <T>(Lucene.Net.Util.LuceneVersion.LUCENE_48, FieldKeys.PuckDefaultField, analyzer); SetWriter(false); Writer.Flush(true, true); var cancelled = new List <BaseModel>(); foreach (var m in toDelete) { var args = new BeforeIndexingEventArgs() { Node = m, Cancel = false }; OnBeforeDelete(this, args); if (args.Cancel) { cancelled.Add(m); continue; } string removeQuery = "+" + FieldKeys.ID + ":" + m.Id.ToString() + " +" + FieldKeys.Variant + ":" + m.Variant; var q = parser.Parse(removeQuery); Writer.DeleteDocuments(q); } Writer.Flush(true, true); Writer.Commit(); toDelete .Where(x => !cancelled.Contains(x)) .ToList() .ForEach(x => { OnAfterDelete(this, new IndexingEventArgs() { Node = x }); }); } catch (Exception ex) { throw; //logger.Log(ex); } finally { CloseWriter(); SetSearcher(); } } }
public IList <T> QueryNoCast <T>(string qstr, Filter filter, Sort sort, out int total, int limit = 500, int skip = 0, Type typeOverride = null, bool fallBackToBaseModel = false) where T : BaseModel { EnsureSearcher(); var analyzer = PuckCache.AnalyzerForModel[typeof(T)]; var parser = new PuckQueryParser <T>(LuceneVersion.LUCENE_48, FieldKeys.PuckDefaultField, analyzer); var q = parser.Parse(qstr); TopDocs docs; if (sort == null) { docs = Searcher.Search(q, filter, limit); } else { sort = sort.Rewrite(Searcher); docs = Searcher.Search(q, filter, limit, sort); } total = docs.TotalHits; var results = new List <T>(); for (var i = skip; i < docs.ScoreDocs.Count(); i++) { var doc = Searcher.Doc(docs.ScoreDocs[i].Doc); //var type = ApiHelper.GetType(doc.GetValues(FieldKeys.PuckType).FirstOrDefault()); Type type; if (typeOverride == null) { type = ApiHelper.GetTypeFromName(doc.GetValues(FieldKeys.PuckType).FirstOrDefault()); if (type == null && fallBackToBaseModel) { type = typeof(BaseModel); } else if (type == null) { continue; } } else { type = typeOverride; } T result = (T)JsonConvert.DeserializeObject(doc.GetValues(FieldKeys.PuckValue)[0], type); results.Add(result); } return(results); }
public IList <T> QueryNoCast <T>(string qstr, Filter filter, Sort sort, out int total, int limit = 500, int skip = 0, Type typeOverride = null, bool fallBackToBaseModel = false, Dictionary <string, Type> fieldTypeMappings = null, Dictionary <string, Analyzer> fieldAnalyzerMappings = null) where T : BaseModel { EnsureSearcher(); var analyzer = PuckCache.AnalyzerForModel[typeof(T)]; if (fieldAnalyzerMappings != null) { foreach (var entry in PuckCache.AnalyzerDictionaryForModel[typeof(T)]) { if (!fieldAnalyzerMappings.ContainsKey(entry.Key)) { fieldAnalyzerMappings.Add(entry.Key, entry.Value); } } analyzer = new PerFieldAnalyzerWrapper(StandardAnalyzer, fieldAnalyzerMappings); } var parser = new PuckQueryParser <T>(LuceneVersion.LUCENE_48, FieldKeys.PuckDefaultField, analyzer, fieldTypeMappings: fieldTypeMappings); var q = parser.Parse(qstr); if (parser.filter != null) { filter = parser.filter; } if (parser.sort != null) { if (sort == null) { sort = parser.sort; } else { List <SortField> sorts = new List <SortField>(); sorts.AddRange(parser.sort.GetSort()); sorts.AddRange(sort.GetSort()); var _sort = new Sort(sorts.ToArray()); sort = _sort; } } TopDocs docs; if (sort == null) { docs = Searcher.Search(q, filter, limit); } else { sort = sort.Rewrite(Searcher); docs = Searcher.Search(q, filter, limit, sort); } total = docs.TotalHits; var results = new List <T>(); for (var i = skip; i < docs.ScoreDocs.Count(); i++) { var doc = Searcher.Doc(docs.ScoreDocs[i].Doc); //var type = ApiHelper.GetType(doc.GetValues(FieldKeys.PuckType).FirstOrDefault()); Type type; if (typeOverride == null) { type = ApiHelper.GetTypeFromName(doc.GetValues(FieldKeys.PuckType).FirstOrDefault()); if (type == null && fallBackToBaseModel) { type = typeof(BaseModel); } else if (type == null) { continue; } } else { type = typeOverride; } T result = (T)JsonConvert.DeserializeObject(doc.GetValues(FieldKeys.PuckValue)[0], type); results.Add(result); } return(results); }
public bool Index <T>(List <T> models, bool triggerEvents = true, bool delete = true, bool queueIfBusy = false) where T : BaseModel { if (models == null || models.Count == 0) { return(true); } bool taken = false; Exception caughtException = null; try { var timeout = queueIfBusy ? TimeSpan.FromMilliseconds(0) : TimeSpan.FromMilliseconds(-1); Monitor.TryEnter(write_lock, timeout, ref taken); if (!taken && queueIfBusy) { PuckCache.PublishQueue.Enqueue(models as List <BaseModel>); return(false); } var cancelled = new List <BaseModel>(); var count = 1; if (!CanWrite) { return(true); } SetWriter(false); //Writer.Flush(true, true, true); Parallel.ForEach(models, (m, state, index) => { PuckCache.IndexingStatus = $"indexing item {count} of {models.Count}"; //var type = ApiHelper.GetType(m.Type); //if (type == null) // type = typeof(BaseModel); var type = ApiHelper.GetTypeFromName(m.Type, defaultToBaseModel: true); var analyzer = PuckCache.AnalyzerForModel[type]; var parser = new PuckQueryParser <T>(Lucene.Net.Util.LuceneVersion.LUCENE_48, FieldKeys.PuckDefaultField, analyzer); if (triggerEvents) { var args = new BeforeIndexingEventArgs() { Node = m, Cancel = false }; OnBeforeIndex(this, args); if (args.Cancel) { cancelled.Add(m); return; } } if (delete) { //delete doc string removeQuery = "+" + FieldKeys.ID + ":" + m.Id.ToString() + " +" + FieldKeys.Variant + ":" + m.Variant.ToLower(); var q = parser.Parse(removeQuery); Writer.DeleteDocuments(q); } Document doc = new Document(); //get fields to index List <FlattenedObject> props = null; using (MiniProfiler.Current.CustomTiming("get properties", "")) { props = ObjectDumper.Write(m, int.MaxValue); } using (MiniProfiler.Current.CustomTiming("add fields to doc", "")) { GetFieldSettings(props, doc, null); }//add cms properties if (!PuckCache.StoreReferences) { m.References = new List <string>(); } string jsonDoc = JsonConvert.SerializeObject(m); //doc in json form for deserialization later doc.Add(new StringField(FieldKeys.PuckValue, jsonDoc, Field.Store.YES)); using (MiniProfiler.Current.CustomTiming("add document", "")) { Writer.AddDocument(doc, analyzer); } count++; }); //Writer.Flush(true,true,true); using (MiniProfiler.Current.CustomTiming("commit", "")) { Writer.Commit(); } CloseWriter(); SetSearcher(); if (triggerEvents) { models .Where(x => !cancelled.Contains(x)) .ToList() .ForEach(x => { OnAfterIndex(this, new IndexingEventArgs() { Node = x }); }); } if (!handleQueueStarted) { handleQueueStarted = true; System.Threading.Tasks.Task.Factory.StartNew(() => { Thread.Sleep(2000); HandleIndexQueue(); }); } //Optimize(); } catch (Exception ex) { logger.Log(ex); caughtException = ex; } finally { if (taken) { Monitor.Exit(write_lock); } } if (caughtException != null) { throw caughtException; } return(true); }
public IList <TReturnType> Query <TReturnType, TQueryType>(string qstr, Filter filter, Sort sort, out int total, int limit = 500, int skip = 0, Dictionary <string, Type> fieldTypeMappings = null, Dictionary <string, Analyzer> fieldAnalyzerMappings = null) where TQueryType : BaseModel { EnsureSearcher(); var analyzer = PuckCache.AnalyzerForModel[typeof(TQueryType)]; if (fieldAnalyzerMappings != null) { foreach (var entry in PuckCache.AnalyzerDictionaryForModel[typeof(TQueryType)]) { if (!fieldAnalyzerMappings.ContainsKey(entry.Key)) { fieldAnalyzerMappings.Add(entry.Key, entry.Value); } } analyzer = new PerFieldAnalyzerWrapper(StandardAnalyzer, fieldAnalyzerMappings); } var parser = new PuckQueryParser <TQueryType>(LuceneVersion.LUCENE_48, FieldKeys.PuckDefaultField, analyzer, fieldTypeMappings: fieldTypeMappings); var q = parser.Parse(qstr); if (parser.filter != null) { filter = parser.filter; } if (parser.sort != null) { if (sort == null) { sort = parser.sort; } else { List <SortField> sorts = new List <SortField>(); sorts.AddRange(parser.sort.GetSort()); sorts.AddRange(sort.GetSort()); var _sort = new Sort(sorts.ToArray()); sort = _sort; } } TopDocs docs; if (sort == null) { docs = Searcher.Search(q, filter, limit); } else { sort = sort.Rewrite(Searcher); docs = Searcher.Search(q, filter, limit, sort); } total = docs.TotalHits; var results = new List <TReturnType>(); for (var i = skip; i < docs.ScoreDocs.Count(); i++) { var doc = Searcher.Doc(docs.ScoreDocs[i].Doc); TReturnType result = JsonConvert.DeserializeObject <TReturnType>(doc.GetValues(FieldKeys.PuckValue)[0]); results.Add(result); } return(results); }
public void Index <T>(List <T> models, bool triggerEvents = true, bool delete = true) where T : BaseModel { if (models.Count == 0) { return; } lock (write_lock) { var cancelled = new List <BaseModel>(); var count = 1; try { if (!CanWrite) { return; } SetWriter(false); //Writer.Flush(true, true, true); Parallel.ForEach(models, (m, state, index) => { PuckCache.IndexingStatus = $"indexing item {count} of {models.Count}"; //var type = ApiHelper.GetType(m.Type); //if (type == null) // type = typeof(BaseModel); var type = ApiHelper.GetTypeFromName(m.Type, defaultToBaseModel: true); var analyzer = PuckCache.AnalyzerForModel[type]; var parser = new PuckQueryParser <T>(Lucene.Net.Util.LuceneVersion.LUCENE_48, FieldKeys.PuckDefaultField, analyzer); if (triggerEvents) { var args = new BeforeIndexingEventArgs() { Node = m, Cancel = false }; OnBeforeIndex(this, args); if (args.Cancel) { cancelled.Add(m); return; } } if (delete) { //delete doc string removeQuery = "+" + FieldKeys.ID + ":" + m.Id.ToString() + " +" + FieldKeys.Variant + ":" + m.Variant.ToLower(); var q = parser.Parse(removeQuery); Writer.DeleteDocuments(q); } Document doc = new Document(); //get fields to index List <FlattenedObject> props = null; using (MiniProfiler.Current.CustomTiming("get properties", "")) { props = ObjectDumper.Write(m, int.MaxValue); } using (MiniProfiler.Current.CustomTiming("add fields to doc", "")) { GetFieldSettings(props, doc, null); }//add cms properties if (!PuckCache.StoreReferences) { m.References = new List <string>(); } string jsonDoc = JsonConvert.SerializeObject(m); //doc in json form for deserialization later doc.Add(new StringField(FieldKeys.PuckValue, jsonDoc, Field.Store.YES)); using (MiniProfiler.Current.CustomTiming("add document", "")) { Writer.AddDocument(doc, analyzer); } count++; }); //Writer.Flush(true,true,true); using (MiniProfiler.Current.CustomTiming("commit", "")) { Writer.Commit(); } //Optimize(); } catch (Exception ex) { throw; //logger.Log(ex); } finally { CloseWriter(); SetSearcher(); if (triggerEvents) { models .Where(x => !cancelled.Contains(x)) .ToList() .ForEach(x => { OnAfterIndex(this, new IndexingEventArgs() { Node = x }); }); } } } }