Exemple #1
0
        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);
        }