public IEnumerable <IDictionary <string, object> > Search(string indexName, string term, string outFieldNames = null, int size = 20, string sortFieldName = null, bool sortReverse = false, ISpatialFilter spatialFilter = null) { var searcher = _resources.GetIndexSearcher(indexName); var mapping = _resources.GetMapping(indexName); Query query = null; Filter filter = null; if (String.IsNullOrEmpty(term)) { query = new MatchAllDocsQuery(); } else { // https://lucene.apache.org/core/2_9_4/queryparsersyntax.html //var parser = new QueryParser(AppLuceneVersion, mapping.PrimaryField, _resources.GetAnalyzer(indexName)); var parser = new MultiFieldQueryParser( AppLuceneVersion, mapping.PrimaryFields.ToArray(), _resources.GetAnalyzer(indexName)); query = parser.Parse(term); } // Spatial Filter if (spatialFilter != null) { InitSpatial(); filter = spatialFilter.ToFilter(_spatialContext, _tree); } ScoreDoc[] hits = null; FieldMapping sortField = String.IsNullOrEmpty(sortFieldName) ? null : mapping.GetField(sortFieldName); if (sortField != null) { Sort sort = new Sort(new SortField(sortFieldName, sortField.GetSortFieldType(), sortReverse)); hits = searcher.Search(query, filter, size, sort).ScoreDocs; } else { hits = searcher.Search(query, filter, size).ScoreDocs; } var outFields = new QueryOutFields(outFieldNames); var selectOutFields = outFields.SelectOutFields(mapping); List <IDictionary <string, object> > docs = new List <IDictionary <string, object> >(); if (hits != null && hits.Length > 0) { foreach (var hit in hits) { var foundDoc = searcher.Doc(hit.Doc); if (foundDoc != null) { var doc = new Dictionary <string, object>(); //doc.Add("_id", hit.Doc); if (!float.IsNaN(hit.Score)) { doc.Add("_score", hit.Score); } foreach (var selectOutField in selectOutFields) { var field = mapping.GetField(selectOutField.Name); if (field == null) { continue; } object val = field.GetValue(foundDoc); var fieldName = field.Name; val = selectOutField.Invoke(val, ref fieldName); doc.Add(fieldName, val); } docs.Add(doc); } } } return(docs); }