Beispiel #1
0
        private IRavenQueryable <Apps_Search2.Result> BoostMethod(IRavenQueryable <Apps_Search2.Result> q)
        {
            var boosted = DocumentSession.Load <BoostedResults>("options/boostedResults");

            if (boosted != null)
            {
                // Boost by developer
                if (boosted.Developers.Any())
                {
                    var boostDevelopersQuery = "* " +
                                               string.Join(" ",
                                                           boosted.Developers.Select(
                                                               x => "\"" + x.Criteria + "\"^" + x.Value));
                    q = q.Search(x => x.Developer, boostDevelopersQuery, 1, SearchOptions.And,
                                 EscapeQueryOptions.RawQuery);
                }

                // Boost by language
                if (boosted.Languages.Any())
                {
                    var boostedLanguagesQuery = "* " +
                                                string.Join(" ",
                                                            boosted.Languages.Select(
                                                                x => "\"" + x.Criteria + "\"^" + x.Value));
                    q = q.Search(x => x.Language, boostedLanguagesQuery, 1, SearchOptions.And,
                                 EscapeQueryOptions.RawQuery);
                }


                // Boost by specific apps
                if (boosted.Apps.Any())
                {
                    var boostedAppsQuery = "* " +
                                           string.Join(" ",
                                                       boosted.Apps.Select(x => "\"" + x.Criteria + "\"^" + x.Value));
                    q = q.Search(x => x.AppId, boostedAppsQuery, 1, SearchOptions.And, EscapeQueryOptions.RawQuery);
                }
            }
            return(q);
        }
Beispiel #2
0
        public virtual async Task <IRavenQueryable <M> > Init(IRavenQueryable <M> query, PagedFilter filter, string favKey)
        {
            Favs = await Session.Query <FavMaster, FavFanIndex>()
                   .Where(c => c.UserId == CurrentUser.Id && c.FilterKey == favKey).ToListAsync();

            if (filter.FavouriteRestrict)
            {
                query = query.Where(c => c.Id.In(Favs.Select(f => f.Id)));
            }

            if (!string.IsNullOrEmpty(filter.Search))
            {
                query = query.Search(c => c.Searchable, $"*{filter.Search}*", options: SearchOptions.And);
            }

            return(query);
        }
        public static IRavenQueryable <T> QueryMultipleWords <T>(this IRavenQueryable <T> query, Expression <Func <T, object> > fieldSelector, string queryString,
                                                                 SearchOptions options = SearchOptions.And)
        {
            if (string.IsNullOrWhiteSpace(queryString))
            {
                return(query);
            }

            queryString = queryString.Trim().Replace(" ", "* AND ").Replace(",", "* AND ");
            if (!queryString.EndsWith("*"))
            {
                queryString = queryString + "*";
            }

            var result = query.Search(fieldSelector, queryString, options: options, escapeQueryOptions: EscapeQueryOptions.AllowAllWildcards);

            return(result);
        }
Beispiel #4
0
        protected IRavenQueryable <T> ApplySearch <T>(IRavenQueryable <T> query, Expression <Func <T, object?> > fieldExpression, string?search)
        {
            if (string.IsNullOrWhiteSpace(search))
            {
                return(query);
            }

            search = search.Trim();

            // Generate a search string for just beginning of the words.
            // E.g. "David Smith-Lowe" becomes "David* Smith-Lowe*"
            string searchWildCards = Regex.Replace(search + " ", @"[\s,;:""{}[]|\\/`~!@#$%^&*()_=\+]+", "* ").Trim();

            IsSearchResult = true;

            // boost exact matches more so they are displayed first
            return(query
                   .Search(fieldExpression, search.ToLower(), boost: 1000M)
                   .Search(fieldExpression, searchWildCards.ToLower(), boost: 800M));
        }