public Query CreateQuery(ILuceneQueryService builder, LuceneQueryContext context, string type, JObject query) { if (type != "match") { return(null); } var first = query.Properties().First(); var boolQuery = new BooleanQuery(); switch (first.Value.Type) { case JTokenType.String: foreach (var term in LuceneQueryService.Tokenize(first.Name, first.Value.ToString(), context.DefaultAnalyzer)) { boolQuery.Add(new TermQuery(new Term(first.Name, term)), Occur.SHOULD); } return(boolQuery); case JTokenType.Object: var obj = (JObject)first.Value; var value = obj.Property("query")?.Value.Value <string>(); if (obj.TryGetValue("boost", out var boost)) { boolQuery.Boost = boost.Value <float>(); } var occur = Occur.SHOULD; if (obj.TryGetValue("operator", out var op)) { occur = op.ToString() == "and" ? Occur.MUST : Occur.SHOULD; } var terms = LuceneQueryService.Tokenize(first.Name, value, context.DefaultAnalyzer); if (!terms.Any()) { if (obj.TryGetValue("zero_terms_query", out var zeroTermsQuery)) { if (zeroTermsQuery.ToString() == "all") { return(new MatchAllDocsQuery()); } } } foreach (var term in terms) { boolQuery.Add(new TermQuery(new Term(first.Name, term)), occur); } return(boolQuery); default: throw new ArgumentException("Invalid query"); } }
public FilteredQuery CreateFilteredQuery(ILuceneQueryService builder, LuceneQueryContext context, string type, JToken filter, Query toFilter) { if (type != "match_phrase") { return(null); } if (!(toFilter is BooleanQuery booleanQuery)) { return(null); } var queryObj = filter as JObject; var first = queryObj.Properties().First(); var phraseQuery = new PhraseQuery(); JToken value; switch (first.Value.Type) { case JTokenType.String: value = first.Value; break; case JTokenType.Object: var obj = (JObject)first.Value; if (!obj.TryGetValue("value", out value)) { throw new ArgumentException("Missing value in match phrase query"); } // TODO: read "analyzer" property if (obj.TryGetValue("slop", out var slop)) { phraseQuery.Slop = slop.Value <int>(); } break; default: throw new ArgumentException("Invalid wildcard query"); } foreach (var term in LuceneQueryService.Tokenize(first.Name, value.Value <string>(), context.DefaultAnalyzer)) { phraseQuery.Add(new Term(first.Name, term)); } booleanQuery.Add(phraseQuery, Occur.MUST); var queryFilter = new QueryWrapperFilter(phraseQuery); return(new FilteredQuery(booleanQuery, queryFilter)); }
public static async ValueTask <List <string> > Tokenize(this IOrchardHelper orchardHelper, string field, params string[] text) { var analyzerManager = orchardHelper.HttpContext.RequestServices.GetService <LuceneAnalyzerManager>(); var luceneIndexSettingsService = orchardHelper.HttpContext.RequestServices.GetService <LuceneIndexSettingsService>(); var siteSettings = await orchardHelper.HttpContext.RequestServices.GetService <ISiteService>()?.GetSiteSettingsAsync(); var searchSettings = siteSettings.As <LuceneSettings>(); var luceneIndexSettings = await luceneIndexSettingsService.GetSettingsAsync(searchSettings.SearchIndex); var analyzerName = await luceneIndexSettingsService.LoadIndexAnalyzerAsync(luceneIndexSettings.IndexName); var analyzer = analyzerManager.CreateAnalyzer(analyzerName); var tokens = LuceneQueryService.Tokenize(field, string.Join(" ", text), analyzer).Distinct(); return(tokens.ToList()); }