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");
            }
        }
예제 #2
0
        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());
    }