示例#1
0
        public IEnumerable <News> FuzzySearchByFields(string searchQuery, List <string> fieldsName, int page)
        {
            var searchResponse = _elasticClient.Search <News>(s => s
                                                              .Query(q => q
                                                                     .MultiMatch(mm => mm
                                                                                 .Fields(f => f.Fields(fieldsName.ToArray()))
                                                                                 .Query(searchQuery)
                                                                                 .Fuzziness(Fuzziness.EditDistance(1))
                                                                                 ))
                                                              .From((page - 1) * PageSize)
                                                              .Size(PageSize));

            return(searchResponse.Documents);
        }
示例#2
0
        public IEnumerable <News> FuzzySearchByAllFields(string searchQuery, int page)
        {
            var searchResponse = _elasticClient.Search <News>(s => s
                                                              .Query(q => q
                                                                     .Fuzzy(f => f
                                                                            .Name(searchQuery)
                                                                            .Fuzziness(Fuzziness.EditDistance(1))
                                                                            .Transpositions(false))
                                                                     )
                                                              .From((page - 1) * PageSize)
                                                              .Size(PageSize));

            return(searchResponse.Documents);
        }
示例#3
0
        public static OsobaEsSearchResult FulltextSearch(string query, int page, int pageSize, int?status = null)
        {
            string modifQ = Lib.Searching.SimpleQueryCreator
                            .GetSimpleQuery(query, new Searching.Rules.IRule[] { new Searching.Rules.RemoveAllOperators() })
                            .FullQuery();

            if (string.IsNullOrWhiteSpace(modifQ))
            {
                return(new OsobaEsSearchResult()
                {
                    OrigQuery = query,
                    Total = 0,
                    IsValid = true,
                    ElasticResults = null,
                    ElapsedTime = TimeSpan.Zero
                });
            }

            page = page - 1 < 0 ? 0 : page - 1;

            var sw = new Devmasters.DT.StopWatchEx();

            sw.Start();


            ISearchResponse <OsobaES> res = null;

            try
            {
                int fuzzyDistance = 1;
                if (status.HasValue)
                {
                    res = _esClient
                          .Search <OsobaES>(s => s
                                            .Size(pageSize)
                                            .From(page * pageSize)
                                            .Query(_query => _query
                                                   .Bool(_bool => _bool
                                                         .Must(_must => _must
                                                               .Fuzzy(_fuzzy => _fuzzy
                                                                      .Field(_field => _field.FullName)
                                                                      .Value(modifQ)
                                                                      .Fuzziness(Fuzziness.EditDistance(fuzzyDistance))
                                                                      ) &&
                                                               _must.Term(_field => _field.Status, status.Value)
                                                               )
                                                         .Should(
                                                             _boostWomen => _boostWomen
                                                             .Match(_match => _match
                                                                    .Field(_field => _field.FullName)
                                                                    .Query(modifQ)
                                                                    .Operator(Operator.And)
                                                                    ),
                                                             _boostExact => _boostExact
                                                             .Match(_match => _match
                                                                    .Field("fullName.lower")
                                                                    .Query(modifQ)
                                                                    .Operator(Operator.And)
                                                                    ),
                                                             _boostAscii => _boostAscii
                                                             .Match(_match => _match
                                                                    .Field("fullName.lowerascii")
                                                                    .Query(modifQ)
                                                                    .Operator(Operator.And)
                                                                    )
                                                             )
                                                         )
                                                   )
                                            .TrackTotalHits(true)
                                            );
                }
                else
                {
                    res = _esClient //.MultiSearch<OsobaES>(s => s
                          .Search <OsobaES>(s => s
                                            .Size(pageSize)
                                            .From(page * pageSize)
                                            .Query(_query => _query
                                                   .MultiMatch(c => c
                                                               .Fields(f => f
                                                                       .Field(p => p.FullName)
                                                                       .Field("fullName.lower", 2)
                                                                       .Field("fullName.lowerascii", 1.5)
                                                                       )
                                                               .Type(TextQueryType.MostFields)
                                                               .Fuzziness(Fuzziness.EditDistance(fuzzyDistance))
                                                               .Query(modifQ)
                                                               .Operator(Operator.And)
                                                               )
                                                   )
                                            .TrackTotalHits(true)
                                            );
                }
            }
            catch (Exception e)
            {
                Audit.Add(Audit.Operations.Search, "", "", "OsobaES", "error", query, null);
                if (res != null && res.ServerError != null)
                {
                    ES.Manager.LogQueryError <OsobaES>(res, "Exception, Orig query:"
                                                       + query + "   query:"
                                                       + modifQ
                                                       , ex: e);
                }
                else
                {
                    HlidacStatu.Util.Consts.Logger.Error("", e);
                }
                throw;
            }
            sw.Stop();

            Audit.Add(Audit.Operations.Search, "", "", "OsobaES", res.IsValid ? "valid" : "invalid", query, null);

            if (res.IsValid == false)
            {
                ES.Manager.LogQueryError <OsobaES>(res, "Exception, Orig query:"
                                                   + query + "   query:"
                                                   + query
                                                   );
            }

            var search = new OsobaEsSearchResult
            {
                OrigQuery      = query,
                Total          = res?.Total ?? 0,
                IsValid        = res?.IsValid ?? false,
                ElasticResults = res,
                ElapsedTime    = sw.Elapsed
            };

            return(search);
        }
        public ISearchResponse <DocumentElastic> Search(
            AutoCompleteSettingsElastic autoCompleteSettings,
            SearchSettingsElastic searchSettings,
            string text,
            IEnumerable <string> documentObjectFieldNames,
            string tagField,
            IEnumerable <string> interPretedFields,
            FilterElastic defaultFilter,
            List <WeightElastic> defaultWeights
            )
        {
            var sdesc = new SearchDescriptor <DocumentElastic>();

            #region SEARCH

            if (searchSettings?.Count > 0)
            {
                var queryContDesc   = new QueryContainerDescriptor <DocumentElastic>();
                var queryContainers = new List <QueryContainer>();

                var searchFields = searchSettings.SearchFieldList.Select(f => MapDocumentObjectName(f)).ToArray();
                //FILTER
                if (searchSettings.UseDefaultFilter)
                {
                    if (!string.IsNullOrEmpty(defaultFilter?.Query))
                    {
                        var modifiedQuery = documentObjectFieldNames?.Any() == true?
                                            PrefixQueryFields(defaultFilter.Query, documentObjectFieldNames) :
                                                defaultFilter.Query;

                        queryContainers.Add(queryContDesc.QueryString(q => q.Query(modifiedQuery)));
                    }
                    if (defaultFilter?.TagIdList?.Any() == true)
                    {
                        var shouldDesc = new BoolQueryDescriptor <DocumentElastic>();
                        foreach (var batchTagIds in defaultFilter.TagIdList.Batch(1000))
                        {
                            shouldDesc.Should(queryContDesc
                                              .Terms(t => t
                                                     .Terms(batchTagIds)
                                                     .Field(MapDocumentObjectName(tagField))));
                        }
                        queryContainers.Add(queryContDesc.Bool(q => shouldDesc));
                    }
                }
                if (!string.IsNullOrEmpty(searchSettings.Filter?.Query))
                {
                    var modifiedQuery = documentObjectFieldNames?.Any() == true?
                                        PrefixQueryFields(searchSettings.Filter.Query, documentObjectFieldNames) :
                                            searchSettings.Filter.Query;

                    queryContainers.Add(queryContDesc.QueryString(q => q.Query(modifiedQuery)));
                }
                if (searchSettings.Filter?.TagIdList?.Any() == true)
                {
                    var shouldDesc = new BoolQueryDescriptor <DocumentElastic>();
                    foreach (var batchTagIds in searchSettings.Filter.TagIdList.Batch(1000))
                    {
                        shouldDesc.Should(queryContDesc
                                          .Terms(t => t
                                                 .Terms(batchTagIds)
                                                 .Field(MapDocumentObjectName(tagField))));
                    }
                    queryContainers.Add(queryContDesc.Bool(q => shouldDesc));
                }

                // MATCH TYPE SEARCH
                if (searchSettings.Type == (int)SDK.Net.Models.Enums.SearchTypeEnum.Match)
                {
                    var mqd = new MultiMatchQueryDescriptor <DocumentElastic>()
                              .Query(text)
                              .Type(TextQueryType.BestFields)
                              .CutoffFrequency(searchSettings.CutOffFrequency)
                              .Fuzziness(searchSettings.Fuzziness < 0 ? Fuzziness.Auto : Fuzziness.EditDistance(searchSettings.Fuzziness))
                              .Fields(f => f.Fields(searchFields))
                              .Operator((Operator)searchSettings.Operator);
                    queryContainers.Add(queryContDesc.MultiMatch(q => mqd));
                }

                // QUERY(STRING) TYPE SEARCH
                if (searchSettings.Type == (int)SDK.Net.Models.Enums.SearchTypeEnum.Query)
                {
                    var modifiedQuery = documentObjectFieldNames?.Any() == true?
                                        PrefixQueryFields(text, documentObjectFieldNames) :
                                            text;

                    var qsd = new QueryStringQueryDescriptor <DocumentElastic>()
                              .Query(text)
                              //cutoff_frequency is not supported for querystring query
                              //.CutoffFrequency(searchSettings.CutOffFrequency)
                              .Fuzziness(searchSettings.Fuzziness < 0 ? Fuzziness.Auto : Fuzziness.EditDistance(searchSettings.Fuzziness))
                              .Fields(f => f.Fields(searchFields))
                              .DefaultOperator((Operator)searchSettings.Operator);
                    queryContainers.Add(queryContDesc.QueryString(q => qsd));
                }

                // WEIGHTS
                // a REAL _should_ query, if we just add to the queryContainer then at least one of this condition must satisfied
                var weights = new List <WeightElastic>();
                if (searchSettings.UseDefaultWeights && (defaultWeights?.Any() == true))
                {
                    weights.AddRange(defaultWeights);
                }
                if (searchSettings.Weights?.Any() == true)
                {
                    weights.AddRange(searchSettings.Weights);
                }
                if (weights.Any())
                {
                    var shouldQuery   = string.Join(" ", weights.Select(k => $"({k.Query})^{k.Value}"));
                    var modifiedQuery = documentObjectFieldNames?.Any() == true?
                                        PrefixQueryFields(shouldQuery, documentObjectFieldNames) :
                                            shouldQuery;

                    sdesc.Query(q => q.Bool(b => b
                                            .Must(queryContainers.ToArray())
                                            .Should(sq => sq.QueryString(qs => qs.Query(modifiedQuery)))));
                }
                else
                {
                    sdesc.Query(q => q.Bool(b => b.Must(queryContainers.ToArray())));
                }

                // ORDER
                if (!string.IsNullOrEmpty(searchSettings.Order?.OrderByField))
                {
                    var fieldName = MapDocumentObjectName(searchSettings.Order.OrderByField);
                    if (interPretedFields != null && interPretedFields.Contains(searchSettings.Order.OrderByField))
                    {
                        fieldName += ".raw";
                    }
                    sdesc.Sort(s => (int)SortOrder.Descending == searchSettings.Order.OrderDirection ? s.Descending(fieldName) : s.Ascending(fieldName));
                }

                // COUNT
                sdesc.Size(searchSettings.Count);

                ApplyDocumentFieldFilter(sdesc, searchSettings.ResponseFieldList.Select(f => MapDocumentObjectName(f)));
            }
            else
            {
                sdesc.Size(0);
            }

            #endregion


            #region SUGGEST

            if (autoCompleteSettings?.Count > 0)
            {
                var psgd = new PhraseSuggesterDescriptor <DocumentElastic>()
                           .Field(DocumentElastic.TextField)
                           .Size(autoCompleteSettings.Count)
                           //.RealWordErrorLikelihood(0.95), 0.95 is the default value
                           .Confidence(autoCompleteSettings.Confidence)
                           .MaxErrors(autoCompleteSettings.MaximumErrors)
                           .DirectGenerator(dg => dg
                                            .Field(DocumentElastic.TextField)
                                            .SuggestMode(SuggestMode.Always)
                                            .MinWordLength(3)
                                            .MinDocFrequency(3)
                                            .Size(1))
                           .Collate(c => c
                                    .Prune()
                                    .Query(q => q
                                           //unfortunately Params is not working here so had to hack the text field like this
                                           .Inline($"{{\"match\": {{\"{DocumentElastic.TextField}\" : {{\"query\": \"{{{{suggestion}}}}\", \"operator\": \"and\"}}}}}}")
                                           )
                                    )
                           .Text(text);
                sdesc.Suggest(s => s.Phrase(SuggestName, p => psgd));
            }


            #endregion


            var resp = Client.Search <DocumentElastic>(sdesc);
            ResponseValidator(resp);

            return(resp);
        }
        public ISearchResponse <WebsiteInfo> FullTextSearch(string searchedContent, SearchPagination pagination)
        {
            var searchResult = client.Search <WebsiteInfo>(s => s
                                                           .Index(Constants.VISITED_WEBSITES_INDEX)
                                                           .Type(mapping)
                                                           .From(pagination.From)
                                                           .Size(pagination.Take)
                                                           .Query(q => q
                                                                  .Bool(b => b
                                                                        .Must(
                                                                            m => m.MultiMatch(w => w
                                                                                              .Fields(f => f.Field("Url").Field("Title").Field("DescriptionMeta").Field("Paragraphs"))
                                                                                              .Query(searchedContent)
                                                                                              .Fuzziness(Fuzziness.EditDistance(2)))
                                                                            , m => m.Term(t => t.Language, "en")
                                                                            )
                                                                        //.Should(m => m.Term(t => t.Language, "en"))
                                                                        )
                                                                  )
                                                           .Highlight(h => h
                                                                      .PreTags("<b>").PostTags("</b>")
                                                                      .Fields(f => f.Field("Url").Field("Title").Field("DescriptionMeta").Field("Paragraphs"))
                                                                      )
                                                           );

            return(searchResult);
        }
            public QueryContainer BuildQuery(
                QueryContainerDescriptor <ProductDocument> qc,
                SearchQuery searchQuery,
                IDictionary <string, ISet <string> > tags = null,
                bool addPriceFilterTags    = false,
                bool addNewsFilterTags     = false,
                bool addCategoryFilterTags = false,
                bool addDefaultQuery       = true)
            {
                var allQueries = new List <QueryContainer>();

                if (addDefaultQuery)
                {
                    allQueries.Add(qc.PublishedOnChannel());
                    allQueries.Add(qc.Bool(b => b.Filter(bf => bf.Term(t => t.Field(x => x.Assortments).Value(_assortmentSystemId.Value)))));
                    if (_personStorage.CurrentSelectedOrganization != null)
                    {
                        allQueries.Add((qc.Bool(b => b.Filter(bf => bf.Term(t => t.Field(x => x.Organizations).Value(Guid.Empty)))) ||
                                        qc.Bool(b => b.Filter(bf => bf.Term(t => t.Field(x => x.Organizations).Value(_personStorage.CurrentSelectedOrganization.SystemId))))));
                    }
                    else
                    {
                        allQueries.Add(qc.Bool(b => b.Filter(bf => bf.Term(t => t.Field(x => x.Organizations).Value(Guid.Empty)))));
                    }

                    if (searchQuery.ProductListSystemId == null)
                    {
                        if (searchQuery.CategorySystemId != null)
                        {
                            if (searchQuery.CategoryShowRecursively)
                            {
                                allQueries.Add(qc.Bool(b => b.Filter(bf => bf.Term(t => t.Field(x => x.ParentCategories).Value(searchQuery.CategorySystemId.Value)))));
                            }
                            else
                            {
                                allQueries.Add(qc.Bool(b => b.Filter(bf => bf.Term(t => t.Field(x => x.Categories).Value(searchQuery.CategorySystemId.Value)))));
                            }
                        }

                        if (!string.IsNullOrWhiteSpace(searchQuery.Text))
                        {
                            var fuzziness = searchQuery.Text.Length > 2 ? Fuzziness.EditDistance(2) : Fuzziness.Auto;
                            allQueries.Add((qc.Match(x => x.Field(z => z.Name).Query(searchQuery.Text).Fuzziness(fuzziness).Boost(10).SynonymAnalyzer()) ||
                                            qc.Match(x => x.Field(z => z.ArticleNumber).Query(searchQuery.Text.ToLower()).Boost(2).SynonymAnalyzer()) ||
                                            qc.Match(x => x.Field(z => z.Content).Query(searchQuery.Text).Fuzziness(fuzziness).SynonymAnalyzer())));
                        }
                    }
                    else
                    {
                        allQueries.Add(qc.Bool(b => b.Filter(bf => bf.Term(t => t.Field(x => x.ProductLists).Value(searchQuery.ProductListSystemId.Value)))));
                    }

                    var pageModel = _requestModelAccessor.RequestModel.CurrentPageModel;
                    if (pageModel.IsBrandPageType())
                    {
                        if (tags != null)
                        {
                            if (!tags.ContainsKey(BrandListViewModel.TagName))
                            {
                                tags.Add(BrandListViewModel.TagName, new SortedSet <string>(new[] { pageModel.Page.Localizations.CurrentUICulture.Name }));
                            }
                        }
                        else
                        {
                            tags = new Dictionary <string, ISet <string> > {
                                { BrandListViewModel.TagName, new SortedSet <string>(new[] { pageModel.Page.Localizations.CurrentUICulture.Name }) }
                            };
                        }
                    }
                }

                if (tags != null)
                {
                    foreach (var tag in tags.Where(x => x.Value.Count > 0))
                    {
                        var filterTags = tag.Value
                                         .Select <string, Func <QueryContainerDescriptor <ProductDocument>, QueryContainer> >(tagValue =>
                                                                                                                              s => s
                                                                                                                              .Nested(n => n
                                                                                                                                      .Path(x => x.Tags)
                                                                                                                                      .Query(nq
                                                                                                                                             => nq.Term(t => t.Field(f => f.Tags[0].Key).Value(tag.Key)) &&
                                                                                                                                             nq.Term(t => t.Field(f => f.Tags[0].Value).Value(tagValue))
                                                                                                                                             )
                                                                                                                                      ));
                        allQueries.Add(qc.Bool(b => b.Filter(bf => bf.Bool(bb => bb.Should(filterTags)))));
                    }
                }

                if (addCategoryFilterTags)
                {
                    if (searchQuery.Category.Count > 0)
                    {
                        allQueries.Add(qc.Bool(b => b.Filter(bf => bf.Bool(bb => bb.Should(searchQuery.Category
                                                                                           .Select <Guid, Func <QueryContainerDescriptor <ProductDocument>, QueryContainer> >(x =>
                                                                                                                                                                              s => s.Term(t => t.Field(f => f.Categories).Value(x))))))));
                    }
                }

                if (addPriceFilterTags)
                {
                    var priceFilters = _priceFilterService
                                       .GetPriceFilterTags(searchQuery, _priceContainer.Value, _countrySystemId.Value)
                                       .ToList();

                    if (priceFilters.Count > 0)
                    {
                        allQueries.Add(qc.Bool(b => b.Filter(bf => bf.Bool(bb => bb.Should(priceFilters)))));
                    }
                }

                if (addNewsFilterTags)
                {
                    if (searchQuery.NewsDate != null)
                    {
                        allQueries.Add(qc.Bool(b => b.Filter(bf => bf.DateRange(r => r
                                                                                .Field(x => x.NewsDate)
                                                                                .GreaterThan(searchQuery.NewsDate.Item1)
                                                                                .LessThan(searchQuery.NewsDate.Item2)))));
                    }
                }

                if (allQueries.Count == 0)
                {
                    return(qc);
                }

                return(allQueries.Aggregate((a, b) => a & b));
            }
示例#7
0
        public override SearchResponse Search(SearchQuery searchQuery, bool?onlyBrands = null)
        {
            if (!_searchClientService.IsConfigured)
            {
                return(_parent.Search(searchQuery, onlyBrands));
            }

            var fuzziness = !string.IsNullOrEmpty(searchQuery.Text) ? (searchQuery.Text.Length > 2 ? Fuzziness.EditDistance(2) : Fuzziness.Auto) : null;

            return(new ElasticSearchResponse <PageDocument>(_searchClientService
                                                            .Search <PageDocument>(CultureInfo.CurrentUICulture, selector => selector
                                                                                   .From((searchQuery.PageNumber - 1) * searchQuery.PageSize.GetValueOrDefault(10000))
                                                                                   .Size(searchQuery.PageSize)
                                                                                   .QueryWithPermission(q =>
                                                                                                        q.PublishedOnChannel() &&
                                                                                                        (!string.IsNullOrEmpty(searchQuery.PageType)
                                ? SearchByPageType(q, searchQuery) && q.PublishedOnWebsite()
                                : !string.IsNullOrEmpty(searchQuery.Text)
                                        ? (onlyBrands == true ? SearchInBrands(q) && q.PublishedOnWebsite() : q.PublishedOnWebsite()) &&
                                                                                                         SearchByText(q, searchQuery.Text, fuzziness)
                                        : q.PublishedOnWebsite()))
                                                                                   .Sort(x => searchQuery.PageType == PageTemplateNameConstants.NewsList ? x.Descending(f => f.NewsDate) : null)
                                                                                   .Source(x => x.Includes(z => z.Fields(p => p.PageSystemId))))
                                                            ));
        }
示例#8
0
        public void FullExample_InitializerSyntax_Search()
        {
            QueryContainer query = new TermQuery()
            {
                Field = Property.Path <ElasticsearchProject>(p => p.Name),
                Value = "value"
            } && new PrefixQuery()
            {
                Field   = "prefix_field",
                Value   = "prefi",
                Rewrite = RewriteMultiTerm.constant_score_boolean
            };

            var result = _client.Search <ElasticsearchProject>(new SearchRequest
            {
                From     = 0,
                Size     = 20,
                Index    = "alternative-index",
                Type     = "alternative-type",
                MinScore = 2.1,
                Rescore  = new Rescore
                {
                    WindowSize = 10,
                    Query      = new RescoreQuery
                    {
                        Query = new TermQuery()
                        {
                        }.ToContainer(),
                        QueryWeight        = 1.2,
                        RescoreQueryWeight = 2.1
                    }
                },
                Fields = new[]
                {
                    "field",
                    Property.Path <ElasticsearchProject>(p => p.Name)
                },
                Query  = query,
                Filter = new FilterContainer(new BoolFilter
                {
                    Cache = true,
                    Must  = new FilterContainer[]
                    {
                        new TermFilter {
                            Field = "value", Value = "asdasd"
                        }
                    }
                }),
                TrackScores  = true,
                Explain      = true,
                IndicesBoost = new Dictionary <IndexNameMarker, double>
                {
                    { Infer.Index <ElasticsearchProject>(), 2.3 }
                },
                ScriptFields = new FluentDictionary <string, IScriptFilter>()
                               .Add("script_field_name", new ScriptFilter
                {
                    Script = "doc['loc'].value * multiplier",
                    Params = new Dictionary <string, object>
                    {
                        { "multiplier", 4 }
                    }
                }),
                Sort = new Dictionary <PropertyPathMarker, ISort>()
                {
                    { "field", new Sort {
                          Order = SortOrder.Ascending, Missing = "_first"
                      } }
                },
                Source = new SourceFilter
                {
                    Include = new PropertyPathMarker[]
                    {
                        "na*"
                    }
                },
                Suggest = new Dictionary <string, ISuggestBucket>
                {
                    {
                        "suggestion", new SuggestBucket
                        {
                            Text       = "suggest me",
                            Completion = new CompletionSuggester
                            {
                                Analyzer  = "standard",
                                Field     = Property.Path <ElasticsearchProject>(p => p.Content),
                                Size      = 4,
                                ShardSize = 10,
                                Fuzzy     = new FuzzySuggester
                                {
                                    Fuzziness    = Fuzziness.Ratio(0.3),
                                    PrefixLength = 4
                                }
                            }
                        }
                    }
                },
                Facets = new Dictionary <PropertyPathMarker, IFacetContainer>()
                {
                    { "name", new FacetContainer
                      {
                          Terms = new TermFacetRequest
                          {
                              Field       = "field",
                              Size        = 10,
                              FacetFilter = new TermFilter()
                              {
                                  Field = "other_field",
                                  Value = "term"
                              }.ToContainer()
                          }
                      } }
                },
                Aggregations = new Dictionary <string, IAggregationContainer>
                {
                    { "my_agg", new AggregationContainer
                      {
                          Terms = new TermsAggregator
                          {
                              Field         = Property.Path <ElasticsearchProject>(p => p.Name),
                              Size          = 10,
                              ExecutionHint = TermsAggregationExecutionHint.ordinals,
                          },
                          Aggregations = new Dictionary <string, IAggregationContainer>
                          {
                              { "max_count", new AggregationContainer()
                                                    {
                                                        Max = new MaxAggregator()
                                                        {
                                                            Field = "loc"
                                                        }
                                                    } }
                          }
                      } }
                }
            });

            var json = result.ConnectionStatus.Request.Utf8String();

            Assert.Pass(json);
        }
示例#9
0
        public IEnumerable <IndexObject> Get([FromQuery] string searchParam)
        {
            var dateSearchTerm = DateTime.MinValue;

            DateTime.TryParse(searchParam, out dateSearchTerm);

            if (searchParam == null || String.IsNullOrEmpty(searchParam))
            {
                return(_client.Search <IndexObject>(s => s.Query(q => q.MatchAll())).Documents);
            }

            searchParam = searchParam.Insert(0, "*").Insert(searchParam.Length + 1, "*").ToLower().Trim();
            var searchResponse = _client.Search <IndexObject>(s => s
                                                              .Query(q => q
                                                                     .QueryString(qs => qs
                                                                                  .Fields(f => f.Field(a => a.ArtistName, 3.0)
                                                                                          .Field(v => v.VenueName, 2.0)
                                                                                          .Field(c => c.City, 1.5)
                                                                                          .Field(d => d.ConcertDate.ToShortDateString()))
                                                                                  //.AllowLeadingWildcard()
                                                                                  .Fuzziness(Fuzziness.EditDistance(3))
                                                                                  .Query(searchParam))).Explain(true));

            return(searchResponse.Documents);
        }
示例#10
0
        /// <summary>
        /// Searches for the pages matching the query.
        /// </summary>
        public async Task <IReadOnlyList <PageDocumentSearchResult> > SearchAsync(string query, int page = 0)
        {
            const string PRE_TAG  = "<b>";
            const string POST_TAG = "</b>";

            PageDocumentSearchResult Map(IHit <PageDocument> hit)
            {
                string GetHitValue(string fieldName, string fallback)
                {
                    if (hit.Highlights.TryGetValue(fieldName.ToLower(), out var hitList))
                    {
                        var hitValue      = hitList.Highlights.First();
                        var rawHitValue   = hitValue.Replace(PRE_TAG, "").Replace(POST_TAG, "");
                        var startEllipsis = !rawHitValue.StartsWithPart(fallback, 10);
                        var endEllipsis   = !rawHitValue.EndsWithPart(fallback, 10);
                        if (!startEllipsis && !endEllipsis)
                        {
                            return(hitValue);
                        }

                        return(string.Concat(
                                   startEllipsis ? "..." : "",
                                   hitValue,
                                   endEllipsis ? "..." : ""
                                   ));
                    }

                    if (fallback.Length > FRAGMENT_SIZE)
                    {
                        return(fallback.Substring(0, FRAGMENT_SIZE) + "...");
                    }

                    return(fallback);
                }

                return(new PageDocumentSearchResult
                {
                    Id = hit.Source.Id,
                    Key = hit.Source.Key,

                    HighlightedTitle = GetHitValue(nameof(PageDocument.Title), hit.Source.Title),
                    HighlightedDescription = GetHitValue(nameof(PageDocument.Description), hit.Source.Description),
                });
            }

            var result = await _client.SearchAsync <PageDocument>(
                s => s.Index(PAGE_INDEX)
                .Query(q =>
                       q.MultiMatch(
                           f => f.Fields(x =>
                                         x.Fields(
                                             y => y.Title,
                                             y => y.Description
                                             )
                                         )
                           .Query(query)
                           .Fuzziness(Fuzziness.EditDistance(1))
                           ) ||
                       q.Match(
                           f => f.Field(x => x.Aliases)
                           .Query(query)
                           .Fuzziness(Fuzziness.EditDistance(1))
                           ) ||
                       q.Prefix(f => f.Field(x => x.Title).Value(query))
                       )
                .Skip(PAGE_SIZE *page)
                .Take(PAGE_SIZE)
                .Highlight(
                    h => h.FragmentSize(FRAGMENT_SIZE)
                    .PreTags(PRE_TAG)
                    .PostTags(POST_TAG)
                    .BoundaryScanner(BoundaryScanner.Sentence)
                    .BoundaryScannerLocale("ru-RU")
                    .Fields(
                        x => x.Field(f => f.Title),
                        x => x.Field(f => f.Description)
                        )
                    )
                );

            return(result.Hits.Select(Map).ToList());
        }
        private ISearchResponse <ManagementContainer> SearchingManagement(string term, int size, int page, Dictionary <string, object> arguments)
        {
            var managements = _elasticService.Search <ManagementContainer>(x =>
                                                                           x.Index(Indices.Index("managements"))
                                                                           .Size(size)
                                                                           .From(page)
                                                                           .Query(q =>
                                                                                  q.Bool(
                                                                                      b1 => b1.Should(
                                                                                          s1 => s1.Match(m1 => m1.Field("mgmt.name").Query(term).Fuzziness(Fuzziness.EditDistance(2)).Operator(Operator.And).Analyzer("stop"))
                                                                                          ).Must(
                                                                                          s1 =>
            {
                if (arguments["market"] != null && arguments["market"].ToString().Trim() != string.Empty)
                {
                    string[] markets = arguments["market"].ToString().Trim().Split(",");
                    List <QueryContainer> queries = new List <QueryContainer>();
                    foreach (string market in markets)
                    {
                        queries.Add(new MatchQuery()
                        {
                            Field = "mgmt.market",
                            Query = market
                        });
                    }
                    return(new QueryContainerDescriptor <ManagementContainer>().Bool(
                               d => d.Should(queries.ToArray())));
                }
                else
                {
                    return(null);
                }
            })
                                                                                      )
                                                                                  )
                                                                           );

            return(managements);
        }
        public ISearchResponse <WebsiteInfo> FullTextSearchAdvanced(SearchContentDTO searchContent, SearchPagination pagination)
        {
            if (searchContent.MatchUncrawledWebsites)
            {
                return(FullTextSearchPendingWebsites(searchContent, pagination));
            }

            if (searchContent.MatchExactSentence)
            {
                return(FullTextSearchMatchSentence(searchContent, pagination));
            }

            var searchResult = client.Search <WebsiteInfo>(s => s
                                                           .Index(Constants.VISITED_WEBSITES_INDEX)
                                                           .Type(mapping)
                                                           .From(pagination.From)
                                                           .Size(pagination.Take)
                                                           .Query(q => q
                                                                  .Bool(b => b
                                                                        .Must(
                                                                            m =>
                                                                            m.MultiMatch(w => w
                                                                                         .Fields(f => f.Field("Url").Field("Title").Field("DescriptionMeta")
                                                                                                 .Field("Paragraphs").Field("FullPageContent"))
                                                                                         .Query(searchContent.Input)
                                                                                         .Fuzziness(Fuzziness.EditDistance(searchContent.Fuzziness))
                                                                                         ),
                                                                            m => m.Term(t => t.Language, searchContent.Language),
                                                                            m => m.DateRange(t => t
                                                                                             .Field(f => f.CreateDate)
                                                                                             .GreaterThanOrEquals(searchContent.StartDate)
                                                                                             .LessThanOrEquals(searchContent.EndDate))
                                                                            )
                                                                        )
                                                                  )
                                                           .Highlight(h => h.PreTags("<b>").PostTags("</b>")
                                                                      .Fields(f => f.Field("Url").Field("Title").Field("DescriptionMeta")
                                                                              .Field("Paragraphs").Field("FullPageContent"))
                                                                      )
                                                           );

            return(searchResult);
        }
        public ISearchResponse <WebsiteInfo> FullTextSearch(string searchedContent)
        {
            var searchResult = client.Search <WebsiteInfo>(s => s
                                                           .AllIndices()
                                                           .Type(mapping)
                                                           .From(0)
                                                           .Size(15)
                                                           .Query(q => q
                                                                  .MultiMatch(w => w
                                                                              .Fields(f => f.Field("Url").Field("Title").Field("DescriptionMeta").Field("Paragraphs"))
                                                                              .Query(searchedContent)
                                                                              .Fuzziness(Fuzziness.EditDistance(1))
                                                                              )
                                                                  )
                                                           .Highlight(h => h
                                                                      .PreTags("<b>").PostTags("</b>")
                                                                      .Fields(f => f.Field("Url").Field("Title").Field("DescriptionMeta").Field("Paragraphs"))
                                                                      )
                                                           );

            return(searchResult);
        }
示例#14
0
        //[HttpPost]
        /// <summary>
        /// Méthode pour faire la recherche
        /// </summary>
        /// <param name="recherche"></param>
        /// <param name="categorie"></param>
        /// <param name="currentFilter"></param>
        /// <param name="page"></param>
        /// <returns>la liste des élément trouvées </returns>
        public ActionResult SearchAction(string recherche, string categorie, string motClé, int?page)
        {
            try
            {
                MyApp.Infrastructure.ElasticSearch.ElasticSearchServiceAgent.AssetSearchService.CreateIndex();
                var connectionToEs = ElasticSearchConnectionSettings.connection();


                var ListOfDataIndexed = new List <MyApp.Infrastructure.ElasticSearch.IndexDocuments.AssetDocument>();
                int pageSize          = 6;
                int pageNumber        = (page ?? 1);
                //on test si les schamps de rechercher sont vides
                if (string.IsNullOrEmpty(recherche) && string.IsNullOrEmpty(categorie) && string.IsNullOrEmpty(motClé))
                {
                    return(View("DataNotFound"));
                }

                //au cas ou les deux champs ne sont pas null
                else if (!string.IsNullOrEmpty(recherche) && !string.IsNullOrEmpty(categorie))
                {
                    ViewBag.recherche = recherche;
                    ViewBag.categorie = categorie;
                    //on execute la connection pour élastic search

                    var reponse = connectionToEs.Search <MyApp.Infrastructure.ElasticSearch.IndexDocuments.AssetDocument>
                                      (s => s.Index(MyApp.Infrastructure.ElasticSearch.ElasticSearchServiceAgent.AssetSearchService.assetIndexName)
                                      .Size(50)
                                      .Query(q => q.MultiMatch(m => m.Query(recherche).Fuzziness(Fuzziness.Auto)) //première recherche

                                             && q.Match(m => m.Field(f => f.TypeAssetName)                        //filtrage de la prmiere recherche
                                                        .Query(categorie))
                                             )
                                      );

                    ListOfDataIndexed = (from hits in reponse.Hits
                                         select hits.Source).ToList();


                    if (!ListOfDataIndexed.Any())
                    {
                        return(View("DataNotFound"));
                    }

                    else
                    {
                        return(View(ListOfDataIndexed.ToList().ToPagedList(pageNumber, pageSize)));
                    }
                }
                //au cas ou on fais la recherche sur un seul champs avec le système de fuzinness auto
                //Generates an edit distance based on the length of the term.
                //Low and high distance arguments may be optionally provided AUTO:[low],[high]
                // par défaut it takes [3 , 6]
                else if (!string.IsNullOrEmpty(recherche))
                {
                    ViewBag.recherche = recherche;

                    var reponse = connectionToEs.Search <MyApp.Infrastructure.ElasticSearch.IndexDocuments.AssetDocument>
                                      (s => s.Index(MyApp.Infrastructure.ElasticSearch.ElasticSearchServiceAgent.AssetSearchService.assetIndexName)
                                      .Size(50)
                                      .Query(q => q.MultiMatch(m => m
                                                               .Query(recherche).Fuzziness(Fuzziness.Auto))

                                             )
                                      );

                    ListOfDataIndexed = (from hits in reponse.Hits
                                         select hits.Source).ToList();


                    if (!ListOfDataIndexed.Any())
                    {
                        return(View("DataNotFound"));
                    }

                    else
                    {
                        return(View(ListOfDataIndexed.ToList().ToPagedList(pageNumber, pageSize)));
                    }
                }
                //faire une recherche sur base de type asset (vidéo, audio, image ...)
                else if (!string.IsNullOrEmpty(categorie))
                {
                    ViewBag.categorie = categorie;

                    var reponse = connectionToEs.Search <MyApp.Infrastructure.ElasticSearch.IndexDocuments.AssetDocument>
                                      (s => s.Index(MyApp.Infrastructure.ElasticSearch.ElasticSearchServiceAgent.AssetSearchService.assetIndexName)
                                      .Size(50)
                                      .Query(q => q
                                             .Match(m => m
                                                    .Field(f => f.TypeAssetName)
                                                    .Query(categorie))
                                             )
                                      );

                    ListOfDataIndexed = (from hits in reponse.Hits
                                         select hits.Source).ToList();

                    if (!ListOfDataIndexed.Any())    //on verifie si la listet est vide et on retourne: data non trouvé
                    {
                        return(View("DataNotFound"));
                    }

                    else
                    {
                        return(View(ListOfDataIndexed.ToList().ToPagedList(pageNumber, pageSize)));
                    }
                }

                //faire un recherche par mot clé le système chercher le mot exact
                else if (!string.IsNullOrEmpty(motClé))
                {
                    ViewBag.motClé = motClé;

                    var reponse = connectionToEs.Search <MyApp.Infrastructure.ElasticSearch.IndexDocuments.AssetDocument>
                                      (s => s.Index(MyApp.Infrastructure.ElasticSearch.ElasticSearchServiceAgent.AssetSearchService.assetIndexName)
                                      .Size(50)
                                      .Query(q => q.MultiMatch(m => m
                                                               .Query(motClé).Fuzziness(Fuzziness.EditDistance(0)))

                                             )
                                      );

                    ListOfDataIndexed = (from hits in reponse.Hits
                                         select hits.Source).ToList();


                    if (!ListOfDataIndexed.Any())
                    {
                        return(View("DataNotFound"));
                    }

                    else
                    {
                        return(View(ListOfDataIndexed.ToList().ToPagedList(pageNumber, pageSize)));
                    }
                }

                return(View(ListOfDataIndexed.ToList().ToPagedList(pageNumber, pageSize)));
            }
            catch (Exception ex)
            {
                return(View("SearchAction2", new HandleErrorInfo(ex, "Home", "Index")));
            }
        }
示例#15
0
 public QueryContainer SearchByText(QueryContainerDescriptor <PageDocument> selector, string text, Fuzziness fuzziness)
 {
     return(selector.Match(x => x.Field(z => z.Name).Query(text).Fuzziness(fuzziness).Boost(2).SynonymAnalyzer()) ||
            selector.Match(x => x.Field(z => z.Content).Query(text).Fuzziness(fuzziness).SynonymAnalyzer()) ||
            SearchInBlocks(selector, text, fuzziness));
 }
示例#16
0
        public async Task <IEnumerable <CatalogItem> > SearchAsync(string Phrase)
        {
            var response = await elasticClient.SearchAsync <CatalogItem>(s => s
                                                                         .Query(q => q
                                                                                .MultiMatch(c => c
                                                                                            .Fields(t => t.Field(m => m.Name)
                                                                                                    .Field(m => m.CatalogBrand.Brand)
                                                                                                    .Field(m => m.CatalogType.Type))
                                                                                            .Query(Phrase)
                                                                                            .Fuzziness(Fuzziness.AutoLength(1, 5))) ||
                                                                                q.Term(x => x.Description, Phrase)));

            return(response.Documents);
        }
示例#17
0
 public QueryContainer SearchInBlocks(QueryContainerDescriptor <PageDocument> selector, string text, Fuzziness fuzziness)
 {
     return(selector.Nested(qb => qb.Path(x => x.Blocks).Query(nq => nq.Bool(b => b.Filter(bf =>
     {
         var q = bf.Match(t => t.Field(f => f.Blocks.First().Content).Query(text).Fuzziness(fuzziness).SynonymAnalyzer());
         q &= bf.DateRange(t => t.Field(f => f.Blocks.First().ChannelStartDateTime).LessThan(DateTimeOffset.Now.UtcDateTime));
         q &= bf.DateRange(t => t.Field(f => f.Blocks.First().ChannelEndDateTime).GreaterThan(DateTimeOffset.Now.UtcDateTime));
         q &= bf.Bool(_permissionDescriptor);
         return q;
     })))
                            ));
 }
示例#18
0
        public ISearchResponse <SearchSuggestion> CompletionSuggesterSearch(string searchContent)
        {
            var searchResult = client.Search <SearchSuggestion>(s => s
                                                                .Index(Constants.SEARCH_SUGGESTIONS_INDEX)
                                                                .Type(mapping)
                                                                .Size(SIZE)
                                                                .Suggest(q => q
                                                                         .Completion("search-suggest-fuzzy", c => c
                                                                                     .Fuzzy(f => f
                                                                                            .Fuzziness(Fuzziness.EditDistance(1))
                                                                                            )
                                                                                     .Prefix(searchContent)
                                                                                     .Field("name.completion")
                                                                                     .SkipDuplicates(true)
                                                                                     )
                                                                         )
                                                                );

            return(searchResult);
        }
        public ISearchResponse <WebsiteInfo> FullTextSearchPendingWebsites(SearchContentDTO searchContent, SearchPagination pagination)
        {
            var searchResult = client.Search <WebsiteInfo>(s => s
                                                           .Index(Constants.PENDING_WEBSITES_INDEX)
                                                           .Type(mapping)
                                                           .From(pagination.From)
                                                           .Size(pagination.Take)
                                                           .Query(q => q
                                                                  .Bool(b => b
                                                                        .Must(m => m
                                                                              .MultiMatch(w => w
                                                                                          .Fields(f => f.Field("Url"))
                                                                                          .Query(searchContent.Input)
                                                                                          .Fuzziness(Fuzziness.EditDistance(searchContent.Fuzziness)))
                                                                              )
                                                                        )
                                                                  )
                                                           .Highlight(h => h.PreTags("<b>").PostTags("</b>")
                                                                      .Fields(f => f.Field("Url"))
                                                                      )
                                                           );

            return(searchResult);
        }