public Task <TopDocs> SearchAsync(LuceneQueryContext 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)); }
public Query CreateQueryFragment(LuceneQueryContext context, JObject queryObj) { var first = queryObj.Properties().First(); Query query = null; foreach (var queryProvider in _queryProviders) { query = queryProvider.CreateQuery(this, context, first.Name, (JObject)first.Value); if (query != null) { break; } } return(query); }