Ejemplo n.º 1
0
        public async Task <IQueryResults> ExecuteQueryAsync(Query query, IDictionary <string, object> parameters)
        {
            var    elasticQuery        = query as ElasticQuery;
            var    elasticQueryResults = new SQLQueryResults();
            object result = null;


            await _elasticIndexProvider.SearchAsync(elasticQuery.Index, async() =>
            {
                //var templateContext = new TemplateContext();
                var templateContext = _liquidTemplateManager.Context;
                // await  templateContext.ContextualizeAsync(_serviceProvider);

                if (parameters != null)
                {
                    foreach (var parameter in parameters)
                    {
                        templateContext.SetValue(parameter.Key, parameter.Value);
                    }
                }

                var tokenizedContent   = await _liquidTemplateManager.RenderAsync(elasticQuery.Template, System.Text.Encodings.Web.JavaScriptEncoder.Default, templateContext);
                var parameterizedQuery = JObject.Parse(tokenizedContent);

                //var analyzer = _luceneAnalyzerManager.CreateAnalyzer(LuceneSettings.StandardAnalyzer);
                //var context = new ElasticQueryContext(searcher, LuceneSettings.DefaultVersion, analyzer);
                var context = new ElasticQueryContext(elasticQuery.Index);
                var docs    = await _queryService.SearchAsync(context, parameterizedQuery);

                if (elasticQuery.ReturnContentItems)
                {
                    /*todo
                     * // Load corresponding content item versions
                     * var contentItemVersionIds = docs.Results.Select(x => doc.Get("Content.ContentItem.ContentItemVersionId")).ToArray();
                     * var contentItems = await _session.Query<ContentItem, ContentItemIndex>(x => x.ContentItemVersionId.IsIn(contentItemVersionIds)).ListAsync();
                     *
                     * // Reorder the result to preserve the one from the lucene query
                     * var indexed = contentItems.ToDictionary(x => x.ContentItemVersionId, x => x);
                     * result = contentItemVersionIds.Select(x => indexed[x]).ToArray();
                     */
                }
                else
                {
                    var results = new List <JObject>();
                    foreach (var document in docs.Results.Select(hit => hit))
                    {
                        //todo
                        // results.Add(new JObject(document.Select(x => new JProperty(x.Name, x.GetStringValue()))));
                    }

                    result = results;
                }
            });

            elasticQueryResults.Items = new object[] { result };    //result; // new  object[results];
            return(elasticQueryResults);
        }
Ejemplo n.º 2
0
//        public Query CreateQueryFragment(ElasticQueryContext context, JObject queryObj)
        public object CreateQueryFragment(ElasticQueryContext context, JObject queryObj)
        {
            var first = queryObj.Properties().First();

//            Query query = null;
            object query = null;

            foreach (var queryProvider in _queryProviders)
            {
                query = queryProvider.CreateQuery(this, context, first.Name, (JObject)first.Value);

                if (query != null)
                {
                    break;
                }
            }

            return(query);
        }
Ejemplo n.º 3
0
//        public Task<TopDocs> SearchAsync(ElasticQueryContext context, JObject queryObj)
        public async Task <SearchResult <object> > SearchAsync(ElasticQueryContext context, JObject queryObj)
        {
            var queryProp = queryObj["query"] as JObject;

            if (queryProp == null)
            {
                throw new ArgumentException("Query DSL requires a [query] property");
            }

            var query = CreateQueryFragment(context, queryProp);

            var sortProperty = queryObj["sort"];
            var fromProperty = queryObj["from"];
            var sizeProperty = queryObj["size"];

            var size = sizeProperty?.Value <int>() ?? 50;
            var from = fromProperty?.Value <int>() ?? 0;

            string sortField = null;
            string sortOrder = null;

            if (sortProperty != null)
            {
                if (sortProperty.Type == JTokenType.String)
                {
                    sortField = sortProperty.ToString();
                }
                else if (sortProperty.Type == JTokenType.Object)
                {
                    sortField = ((JProperty)sortProperty.First).Name;
                    sortOrder = ((JProperty)sortProperty.First).Value["order"].ToString();
                }
            }

//            TopDocs docs = context.IndexSearcher.Search(
//                query,
//                size + from,
//                sortField == null ? Sort.RELEVANCE : new Sort(new SortField(sortField, SortFieldType.STRING, sortOrder == "desc"))
//            );
//
//            if (from > 0)
//            {
//                docs = new TopDocs(docs.TotalHits - from, docs.ScoreDocs.Skip(from).ToArray(), docs.MaxScore);
//            }
//
//            return Task.FromResult(docs);

            var elasticClient = await _elasticClientService.Client();

            var result = elasticClient.Search <object>(x => x.Query(q => q
                                                                    .MultiMatch(mp => mp
                                                                                .Query(query.ToString())
//                        .Fields(f => f
//                            .Fields(f1 => f1.Title, f2 => f2.Body, f3 => f3.Tags))
                                                                                ))
                                                       .Aggregations(a => a
                                                                     .Terms("by_tags", t => t
                                                                            // .Field(f => f.Tags)
                                                                            .Size(10)))
                                                       .From(from - 1)
                                                       .Size(size + from));



            var searchResult = new SearchResult <object>
            {
                Total               = (int)result.Total,
                Page                = from,
                Results             = result.Documents,
                ElapsedMilliseconds = Convert.ToInt32(result.Took),
                // AggregationsByTags = result.Aggs.Terms("by_tags").Buckets.ToDictionary(x => x.Key, y => y.DocCount.GetValueOrDefault(0))
            };

            return(searchResult);

//            var docs = context.IndexSearcher.Search(
//                query,
//                size + from,
//                sortField == null ? Sort.RELEVANCE : new Sort(new SortField(sortField, SortFieldType.STRING, sortOrder == "desc"))
//            );
//
//            if (from > 0)
//            {
//                docs = new TopDocs(docs.TotalHits - from, docs.ScoreDocs.Skip(from).ToArray(), docs.MaxScore);
//            }
//
//            return Task.FromResult(docs);
        }