/// <summary> /// Gets the complete query with the keyword part and the filters part. /// </summary> /// <remarks>This is used by both the Query and Aggregation services.</remarks> /// <returns>A QueryContainer representing the entire query. </returns> /// <param name="keyword">Keyword for the search</param> /// <param name="filtersList">The complete filters list</param> protected QueryContainer GetFullQuery(string keyword, Dictionary <string, string[]> filtersList) { QueryContainer query = null; QueryContainer keywordQuery = GetKeywordQuery(keyword); IEnumerable <QueryContainer> filtersQueries = GetAllFiltersForQuery(filtersList); if (keywordQuery != null && filtersQueries.Count() > 0) { query = new BoolQuery { Filter = filtersQueries, Must = new QueryContainer[] { keywordQuery } }; } else if (keywordQuery != null) { query = keywordQuery; } else if (filtersQueries.Count() > 0) { query = new BoolQuery { Filter = filtersQueries }; } //Else there is no query. return(query); }
/// <summary> /// Gets the keyword part of the query. /// </summary> /// <returns>The keyword query.</returns> /// <param name="keyword">Keyword.</param> /// <param name="fields">Full text fields.</param> protected QueryContainer GetKeywordQuery(string keyword) { // Get list of full text fields from options for query building R4RAPIOptions.FullTextFieldConfig[] fullTextFieldsList = null; try { fullTextFieldsList = this._apiOptions.AvailableFullTextFields.Select(f => f.Value).ToArray(); } catch (Exception ex) { this._logger.LogError("Could not fetch full text fields from configuration."); throw new Exception("Could not fetch full text fields from configuration.", ex); } QueryContainer query = null; if (!string.IsNullOrEmpty(keyword)) { query = new BoolQuery { Should = GetFullTextQuery(keyword, fullTextFieldsList) }; } return(query); }
public IActionResult getOffField(STFilterRequestData _objReqData) { searchcricket sc = new searchcricket(); List <SearchResultFilterData> obj = new List <SearchResultFilterData>(); BoolQuery _objNestedBoolQuery = new BoolQuery(); if (_objReqData != null) { MatchDetail _objMatchDetail = _objReqData.MatchDetail; Moments _objMomentsData = _objReqData.Moments; if (_objMomentsData != null) { if (_objMomentsData.IsBigMoment || _objMomentsData.IsFunnyMoment || _objMomentsData.IsAudioPiece) { QueryContainer _objNestedBoolQueryFor2 = new QueryContainer(); _objNestedBoolQueryFor2 = sc.GetMatchDetailQueryST(_objNestedBoolQueryFor2, _objMatchDetail); _objNestedBoolQueryFor2 = sc.GetS2MomentDetailQueryForST(_objMatchDetail, _objNestedBoolQueryFor2, _objMomentsData); var result = EsClient.Search <SearchResultFilterData>(s => s.Index("cricket").Query(q => _objNestedBoolQueryFor2).Size(10000)); foreach (var hit in result.Hits) { obj.Add(new SearchResultFilterData { Description = hit.Source.Description.ToString(), MarkIn = hit.Source.MarkIn.ToString(), MarkOut = hit.Source.MarkOut.ToString(), ShotType = hit.Source.MarkOut.ToString(), DeliveryType = hit.Source.DeliveryType.ToString() }); } } } } return(Ok(new { results = obj })); }
public static ITypeSearch <T> AddWildCardQuery <T>( this ITypeSearch <T> search, string query, Expression <Func <T, string> > fieldSelector) { var fieldName = search.Client.Conventions.FieldNameConvention .GetFieldNameForAnalyzed(fieldSelector); var wildcardQuery = new WildcardQuery(fieldName, query.ToLowerInvariant()); return(new Search <T, WildcardQuery>(search, context => { if (context.RequestBody.Query != null) { var boolQuery = new BoolQuery(); boolQuery.Should.Add(context.RequestBody.Query); boolQuery.Should.Add(wildcardQuery); boolQuery.MinimumNumberShouldMatch = 1; context.RequestBody.Query = boolQuery; } else { context.RequestBody.Query = wildcardQuery; } })); }
/// <summary> ///联合查询(复杂查询条件下用的最多的一个查询)。Bool查询由一个或者多个子句组成,每个子句都有特定的类型。 ///must: 文档必须完全匹配条件 ///should: should下面会带一个以上的条件,至少满足一个条件,这个文档就符合should ///must_not: 文档必须不匹配条件 ///MinimumShouldMatch: should查询的条件至少满足几个 /// </summary> /// <param name="otsClient"></param> public static void BoolQuery(OTSClient otsClient) { Console.WriteLine("\n Start bool query..."); var searchQuery = new SearchQuery(); searchQuery.GetTotalCount = true; var boolQuery = new BoolQuery(); var shouldQuerys = new List <IQuery>(); shouldQuerys.Add(new TermQuery(Keyword_type_col, new ColumnValue("SearchIndex"))); shouldQuerys.Add(new TermQuery(Keyword_type_col, new ColumnValue("TableStore"))); boolQuery.ShouldQueries = shouldQuerys; boolQuery.MinimumShouldMatch = 1; searchQuery.Query = boolQuery; var request = new SearchRequest(TableName, IndexName, searchQuery); request.ColumnsToGet = new ColumnsToGet() { ReturnAll = true }; var response = otsClient.Search(request); Console.WriteLine("Total Count:" + response.TotalCount); foreach (var row in response.Rows) { PrintRow(row); } }
public static ITypeSearch <T> WildcardSearch <T>(this ITypeSearch <T> search, string query, Expression <Func <T, string> > fieldSelector, double?boost = null) { if (string.IsNullOrWhiteSpace(query)) { return(search); } query = query?.ToLowerInvariant(); query = WrapInAsterisks(query); var fieldName = search.Client.Conventions .FieldNameConvention .GetFieldNameForAnalyzed(fieldSelector); var wildcardQuery = new WildcardQuery(fieldName, query) { Boost = boost }; return(new Search <T, WildcardQuery>(search, context => { if (context.RequestBody.Query != null) { var boolQuery = new BoolQuery(); boolQuery.Should.Add(context.RequestBody.Query); boolQuery.Should.Add(wildcardQuery); boolQuery.MinimumNumberShouldMatch = 1; context.RequestBody.Query = boolQuery; } else { context.RequestBody.Query = wildcardQuery; } })); }
/// <summary> /// 按照指定条件删除 /// </summary> /// <param name="option"></param> /// <returns></returns> public bool Delete(ESDeleteOption option) { var queryCondations = BuildQueryContainer(option.Where, option.Analyzer); var shouldQuerys = queryCondations.Should; var mustQuerys = queryCondations.Must; var mustNotQuerys = queryCondations.MustNot; if (mustQuerys.Count <= 0 && shouldQuerys.Count <= 0 && mustNotQuerys.Count <= 0) { return(false); } var request = new DeleteByQueryRequest <T>(option.IndexName, option.TypeName); var query = new BoolQuery(); if (mustQuerys.Count > 0) { query.Must = mustQuerys; } if (shouldQuerys.Count > 0) { query.Should = shouldQuerys; } if (mustNotQuerys.Count > 0) { query.MustNot = mustNotQuerys; } request.Query = query; var res = _es.DeleteByQuery(request); return(res.Deleted > 0); }
private static BoolQuery ParseBoolQuery(JsonObject jo) { var @bool = new BoolQuery(); foreach (var jp in jo.Properties()) { switch (jp.Name) { case "must": @bool.Must(GetBoolQueries(jp.Value)); break; case "filter": @bool.Filter(GetBoolQueries(jp.Value)); break; case "must_not": @bool.Not(GetBoolQueries(jp.Value)); break; case "should": @bool.Should(GetBoolQueries(jp.Value)); break; } } if (@bool.IsEmpty) { return(null); } return(@bool); }
/// <summary> /// Gets a query object used for filtering a field given one or more filters /// </summary> /// <remarks> /// When more than one filter is used we must use a Bool query (Should) to wrap the /// TermQuery objects that represent the filters. When only one filter is used, /// then we only need to return a single TermQuery. /// </remarks> /// <returns>The QueryContainer to be used by the filter.</returns> /// <param name="field">The field to filter on.</param> /// <param name="filters">The filters to turn into the query</param> /// <exception cref="ArgumentNullException">If there are 0 items in the filters list</exception> protected QueryContainer GetQueryForFilterField(string field, string[] filters) { QueryContainer query = null; if (filters.Length == 0) { throw new ArgumentException("Filters must contain at least one item"); } if (filters.Length == 1) { //There is only one, so it can just be a term query. query = GetQueryForField(field, filters[0]); } else { query = new BoolQuery { Should = from filter in filters select(QueryContainer) GetQueryForField(field, filter), MinimumShouldMatch = 1 }; } return(query); }
protected void AddQuery(string fieldName, BoolQuery <ESDocument> query, StringCollection filter, bool lowerCase = true) { fieldName = fieldName.ToLower(); if (filter.Count > 0) { if (filter.Count == 1) { if (!String.IsNullOrEmpty(filter[0])) { AddQuery(fieldName, query, filter[0], lowerCase); } } else { var booleanQuery = new BoolQuery <ESDocument>(); var containsFilter = false; foreach (var index in filter.Cast <string>().Where(index => !String.IsNullOrEmpty(index))) { booleanQuery.Should(q => q.Custom("{{\"wildcard\" : {{ \"{0}\" : \"{1}\" }}}}", fieldName.ToLower(), lowerCase ? index.ToLower() : index)); containsFilter = true; } if (containsFilter) { query.Must(q => q.Bool(b => booleanQuery)); } } } }
public void GetQueryForFullTextField_MultipleMatchTypes() { var fullTextFieldQueries = this._junkSvc.TEST_GetQueryForFullTextField("testfield", "testkeyword", 1, new string[] { "common", "match_phrase" }); BoolQuery actual = new BoolQuery { Should = fullTextFieldQueries }; var expectedStr = @" { ""bool"": { ""should"": [ { ""common"": { ""testfield"": { ""query"": ""testkeyword"", ""cutoff_frequency"": 1.0, ""low_freq_operator"": ""and"", ""boost"": 1.0 } } }, { ""match"": { ""testfield"": { ""query"": ""testkeyword"", ""boost"": 1.0, ""type"": ""phrase"" } } } ], ""minimum_should_match"": null, ""disable_coord"": null, ""_name"": null, ""boost"": null } } "; ElasticTools.AssertQueryJson(expectedStr, actual); }
public void Bool_PlainSyntax() { QueryContainer wildcardQuery = new BoolQuery { Must = new List <QueryContainer> { new WildcardQuery() { Field = "myprefix_field", Value = "value" }, new WildcardQuery() { Field = "my_prefix_field", Value = "value" } } }; var searchRequest = new SearchRequest() { Query = wildcardQuery }; var search = this._client.Search <ElasticsearchProject>(searchRequest); var request = search.RequestInformation.Request.Utf8String(); request.Should().Contain("my_prefix_field"); Assert.Pass(request); }
public static List <tbl_userdata> AllUsers() { _connectionToEs = new ConnectionToES(); var client = _connectionToEs.EsClient(); BoolQuery boolQuery1 = new BoolQuery { }; Nest.ISearchResponse <tbl_userdata> response = client.Search <tbl_userdata>(s => s .Index("moll_users") .Type("User") .Query(q => q .MatchAll() ) .From(0) .Size(1000) ); var json = client.RequestResponseSerializer.SerializeToString(boolQuery1); var datasend = (from hits in response.Hits select hits.Source).ToList(); List <tbl_userdata> packages = response.Documents.ToList <tbl_userdata>(); return(response.Documents.ToList <tbl_userdata>()); }
private static BoolQuery GetQueryWithSecurity(QueryContainer querycontainer, UserAccess access) { if (access == null) { throw new ArgumentNullException(nameof(access)); } if (access.CombinedTokens?.Length == 0) { throw new ArgumentException($"{nameof(access)} is not valid"); } var queryWithSecurity = new BoolQuery { Must = new[] { querycontainer } }; queryWithSecurity.Filter = new QueryContainer[] { new TermsQuery { Field = "metadataAccessTokens", Terms = access.CombinedTokens } }; return(queryWithSecurity); }
public List <OfferDetails> GetByAnyFieldKeywords(string keywords, int categoryId, int userId) { string[] args = keywords.Split(','); QueryContainer qc = new QueryContainer(); BoolQuery bq = new BoolQuery(); foreach (var VARIABLE in args) { qc &= new MultiMatchQuery() { Fields = "*", Query = VARIABLE, Operator = Operator.Or }; } bq = new BoolQuery() { Must = new[] { qc } }; string indexName = $"{userId}_cat{categoryId}"; if (userId == 1) { indexName = "offer_details"; } SearchRequest request = new SearchRequest <OfferDetails>(indexName) { Size = 100, Query = bq }; IRequestConfiguration conf = new RequestConfiguration(); conf.Headers = new System.Collections.Specialized.NameValueCollection(); conf.Headers.Add(new System.Collections.Specialized.NameValueCollection() { { "authorization", "opnsdgsd353sapgqejpg" }, { "http_authorization", "opnsdgsd353sapgqejpg" } }); request.RequestConfiguration = conf; var k = client.Search <OfferDetails>(request); for (int x = 0; x < k.Documents.Count; x++) { k.Documents.ElementAt(x).Id = k.Hits.ElementAt(x).Source.Id; } var json = client.RequestResponseSerializer.SerializeToString(request); return(k.Documents.ToList()); }
public QueryContainer GetQuery() { var boolQuery = new BoolQuery(); if (!Predicates.Any()) { return(boolQuery); } var mustList = new List <QueryContainer>(); var mustNotList = new List <QueryContainer>(); var shouldList = new List <QueryContainer>(); foreach (var predicate in Predicates) { switch (Operator) { case GroupOperator.And: if (predicate is IFieldPredicate fieldPredicate && fieldPredicate.Not) { mustNotList.Add(fieldPredicate.GetQuery()); } else { mustList.Add(predicate.GetQuery()); } break;
public SearchResult <Post> SearchByCategory(string query, IEnumerable <string> tags, int page = 1, int pageSize = 10) { var fieldQuery = new MultiMatchQuery { Query = query, Fields = new[] { Infer.Field <Post>(p => p.Title), Infer.Field <Post>(p => p.Body), Infer.Field <Post>(p => p.Tags) }, Fuzziness = Fuzziness.EditDistance(1) }; var categoryFilter = new BoolQuery { Must = new QueryContainer[] { new TermsQuery { Field = Infer.Field <Post>(p => p.Tags), Terms = tags } } }; var searchRequest = new SearchRequest { From = page - 1, Size = pageSize, Query = new BoolQuery { Must = new QueryContainer[] { fieldQuery }, Filter = new QueryContainer[] { categoryFilter } }, Aggregations = new TermsAggregation("by_tags") { Field = Infer.Field <Post>(p => p.Tags), Size = 10 } }; var result = _client.Search <Post>(searchRequest); return(new SearchResult <Post> { Total = (int)result.Total, Page = page, Results = result.Hits.Select(hit => new SearchResultItem <Post>(hit.Source, hit.Score)), ElapsedMilliseconds = result.Took, AggregationsByTags = result.Aggs.Terms("by_tags").Buckets.ToDictionary(x => x.Key, y => y.DocCount.GetValueOrDefault(0)) }); }
private static IEnumerable <IScoreFunction> GetDecayFunctions() { foreach (var decay in ServiceLocator.Current.GetInstance <IDynamicDataRepository <Decay> >().ReadAll().Where(e => e.IsActive)) { var filter = new BoolQuery { Must = new List <QueryContainer> { new MatchQuery { Field = Infer.Field <ElasticEpiDocument>(e => e.ContainerContentGuid), Query = decay.ContentGuid.ToString() }, // only apply decay to documents newer than 2 years //new DateRangeQuery //{ // Field = Infer.Field<ElasticEpiDocument>(e => e.StartPublish), // GreaterThan = DateMath.Now.Subtract(TimeSpan.FromDays(365*2)) //} } }; yield return(new GaussDateDecayFunction { Field = Infer.Field <ElasticEpiDocument>(e => e.StartPublish), Scale = $"{decay.Scale}d", Decay = decay.Rate, Offset = $"{decay.Offset}d", Filter = filter }); } }
private static IEnumerable <IScoreFunction> GetSimulatedDecayFunctions() { foreach (var decay in ServiceLocator.Current.GetInstance <IDynamicDataRepository <Decay> >().ReadAll().Where(e => e.IsActive)) { var filter = new BoolQuery { Must = new List <QueryContainer> { new MatchQuery { Field = Infer.Field <ElasticEpiDocument>(e => e.ContainerContentGuid), Query = decay.ContentGuid.ToString() }, // only apply simulated decay to documents older than 2 years new DateRangeQuery { Field = Infer.Field <ElasticEpiDocument>(e => e.StartPublish), LessThanOrEqualTo = DateMath.Now.Subtract(TimeSpan.FromDays(365 * 2)) } } }; yield return(new WeightFunction { Weight = 0.01, Filter = filter }); } }
private string VisitQuery(BoolQuery query) { var visitor = new ElasticSearchDSLVisitor(SchemaRetrieverMock.CreateMockSchemaRetriever()); visitor.Visit(query); return(query.KustoQL); }
public string BoolQueryVisit_WithShouldNotLeaf_ReturnsValidResponse() { var boolQuery = new BoolQuery { ShouldNot = CreateSimpleLeafList("ItemD"), }; return(VisitQuery(boolQuery)); }
private static IQuery Transform(BoolQuery query, IDictionary <string, string[]> aliases, IQueryExpander qe) { var must = query.MustQueries == null || query.MustQueries.Length == 0 ? null : query.MustQueries.Select(e => e.Transform(aliases, qe)).ToArray(); var not = query.NotQueries == null || query.NotQueries.Length == 0 ? null : query.NotQueries.Select(e => e.Transform(aliases, qe)).ToArray(); var filter = query.FilterQueries == null || query.FilterQueries.Length == 0 ? null : query.FilterQueries.Select(e => e.Transform(aliases, qe)).ToArray(); var should = query.ShouldQueries == null || query.ShouldQueries.Length == 0 ? null : query.ShouldQueries.Select(e => e.Transform(aliases, qe)).ToArray(); return(new BoolQuery(must, not, should, filter)); }
/// <inheritdoc/> public void Visit(BoolQuery boolQuery) { Ensure.IsNotNull(boolQuery, nameof(boolQuery)); AddListInternal(boolQuery.Must, KustoQLOperators.And, false /* positive */, boolQuery); AddListInternal(boolQuery.MustNot, KustoQLOperators.And, true /* negative */, boolQuery); AddListInternal(boolQuery.Should, KustoQLOperators.Or, false /* positive */, boolQuery); AddListInternal(boolQuery.ShouldNot, KustoQLOperators.Or, true /* negative */, boolQuery); }
public override BoolQuery Activate(BoolQuery query) { query.Must = query.Must.Append(new MatchQuery() { Field = FieldName, Query = Value }); return(query); }
public override BoolQuery Activate(BoolQuery query) { query.Must = query.Must.Append(new NumericRangeQuery() { Field = FieldName, GreaterThanOrEqualTo = Min, LessThanOrEqualTo = Max }); return(query); }
public BoolQuery GetAllTransactions(string accountId) { var query = new BoolQuery() { Should = SetupShouldQuery(accountId), MinimumShouldMatch = 1 }; return(query); }
public static bool TryGetBoolQuery(IQuery query, out BoolQuery currentBoolQuery) { currentBoolQuery = query as BoolQuery; if (currentBoolQuery == null) { return(false); } return(true); }
public void SerializerBoolQuery() { JsonSerializer jsonSerializer = new JsonSerializer(); BoolQuery boolQuery = new BoolQuery(); boolQuery.Must(new TermQuery("termfield", "termvalue")); boolQuery.Should(new MatchQuery("matchfield", "matchvalue")); string jsonString = jsonSerializer.Serialize(boolQuery); Console.WriteLine(jsonString); }
/** *.... * |=== * | Median| StdDev| Gen 0| Gen 1| Gen 2| Bytes Allocated/Op * | 1.8507 ms| 0.1878 ms| 1,793.00| 21.00| -| 1.872.672,28 * |=== *.... * * As you can see while still fast its causes a lot of allocations to happen because with each iteration * we need to re evaluate the mergability of our bool query. * * Since we already know the shape of our bool query in advance its much much faster to do this instead: * */ private static void FastCombine() { QueryContainer q = new TermQuery { Field = "x", Value = "x" }; var x = Enumerable.Range(0, 1000).Select(f => q).ToArray(); var boolQuery = new BoolQuery { Must = x }; }
public string BoolQueryVisit_WithMultipleTypeLeafs_ReturnsValidResponse() { var boolQuery = new BoolQuery { Must = CreateSimpleLeafList("ItemA"), MustNot = CreateSimpleLeafList("ItemB"), Should = CreateSimpleLeafList("ItemC"), ShouldNot = CreateSimpleLeafList("ItemD"), }; return(VisitQuery(boolQuery)); }
public void Bool_PlainSyntax() { QueryContainer wildcardQuery = new BoolQuery { Must = new List<QueryContainer> { new WildcardQuery() { Field = "myprefix_field", Value = "value"}, new WildcardQuery() { Field = "my_prefix_field", Value = "value"} } }; var searchRequest = new SearchRequest() { Query = wildcardQuery }; var search = this._client.Search<ElasticsearchProject>(searchRequest); var request = search.RequestInformation.Request.Utf8String(); request.Should().Contain("my_prefix_field"); Assert.Pass(request); }
protected void AddQuery(string fieldName, BoolQuery<ESDocument> query, string filter) { query.Must(q => q.Custom("{{\"wildcard\" : {{ \"{0}\" : \"{1}\" }}}}", fieldName.ToLower(), filter.ToLower())); }
public int GetCountByM(SearchCondition sc) { int count = 0; string indexname = ConfigurationManager.AppSettings["CRMIndex"].ToString(); string typename = ConfigurationManager.AppSettings["CRMMemberType"].ToString(); string field = ""; if (string.IsNullOrEmpty(sc.field)) { field = ""; } else { field = sc.field.ToLower(); } string classVaule = ""; if (string.IsNullOrEmpty(sc.classx)) { sc.classx = ""; } else { sc.classx = sc.classx.ToLower(); classVaule = "1"; } //must List<QueryContainer> mustquerys = new List<QueryContainer>(); if (field.Equals("lastcontacttime")) { string timeG = sc.keywords[0]; string timeL = DateTime.Parse(timeG).AddDays(-7).ToString("yyyy-MM-dd"); QueryContainer rangeQuyery = new RangeQuery() { Field = field, GreaterThanOrEqualTo = timeL, LowerThanOrEqualTo = timeG, TimeZone = "+08:00" }; mustquerys.Add(rangeQuyery); } else if (field.Equals("enterprise")) { foreach (string keyw in sc.keywords) { List<QueryContainer> shouooo = new List<QueryContainer>(); QueryContainer termQ = new TermQuery() { Field = "enterprise", Value = sc.keyword.Replace(',', ' ') }; QueryContainer lowerQuery = new WildcardQuery() { Field = "enterprise", Value = string.IsNullOrEmpty(keyw) ? "*" : string.Format("*{0}*", keyw.ToLower()) }; QueryContainer notlowerQuery = new WildcardQuery() { Field = "enterprise.lower", Value = string.IsNullOrEmpty(keyw) ? "*" : string.Format("*{0}*", keyw.ToLower()) }; shouooo.Add(termQ); shouooo.Add(lowerQuery); shouooo.Add(notlowerQuery); QueryContainer boooQuery = new BoolQuery() { Should = shouooo }; mustquerys.Add(boooQuery); } } else { foreach (string keyw in sc.keywords) { QueryContainer wildcardQuery = new WildcardQuery() { Field = field, Value = string.IsNullOrEmpty(keyw) ? "*" : string.Format("*{0}*", keyw) }; mustquerys.Add(wildcardQuery); } } QueryContainer matchQueryT = new MatchQuery() { Field = "tracktypeid", Query = Convert.ToString(sc.tracktype) }; QueryContainer matchQueryC = new MatchQuery() { Field = sc.classx, Query = classVaule }; QueryContainer queryCountry = new WildcardQuery() { Field = "country", Value = string.Format("*{0}*", sc.country) }; QueryContainer queryProvince = new WildcardQuery() { Field = "province", Value = string.Format("*{0}*", sc.province) }; QueryContainer queryCity = new WildcardQuery() { Field = "city", Value = string.Format("*{0}*", sc.city) }; if (!string.IsNullOrEmpty(sc.tracktype)) { mustquerys.Add(matchQueryT); } if (!string.IsNullOrEmpty(sc.classx)) { mustquerys.Add(matchQueryC); } if (!string.IsNullOrEmpty(sc.country)) { mustquerys.Add(queryCountry); } if (!string.IsNullOrEmpty(sc.province)) { mustquerys.Add(queryProvince); } if (!string.IsNullOrEmpty(sc.city)) { mustquerys.Add(queryCity); } QueryContainer boolQuery = new BoolQuery() { Must = mustquerys }; //QueryContainer wildcardQuery = new WildcardQuery() { Field = field, Value = string.IsNullOrEmpty(sc.keyword) ? "*" : string.Format("*{0}*", sc.keyword) }; var searchResults = Connect.GetSearchClient().Count<Member>(s => s .Index(indexname) .Type(typename) .Query(boolQuery) ); count = (int)searchResults.Count; return count; }
public int GetCountByTrack(SearchCondition sc) { int count = 0; string indexname = ConfigurationManager.AppSettings["CRMIndex"].ToString(); string typename = ConfigurationManager.AppSettings["CRMMemberType"].ToString(); string ctype = ConfigurationManager.AppSettings["CRMMTrackType"].ToString(); if (string.IsNullOrEmpty(sc.field)) { sc.field = "mtmemo"; } string classVaule = ""; if (string.IsNullOrEmpty(sc.classx)) { sc.classx = ""; } else { sc.classx = sc.classx.ToLower(); classVaule = "1"; } var searchResults = Connect.GetSearchClient().Count<Member>(s => s .Index(indexname) .Type(typename) .Query(q => q .Bool(b => b .Must( #region 不行留用 m => m.HasChild<MemberTrack>(h => h.Type(ctype).Query(qu => { List<QueryContainer> mustquery = new List<QueryContainer>(); foreach (string str in sc.keywords) { QueryContainer termQuery = new QueryStringQuery() { DefaultField = sc.field.ToLower(), Query = str, DefaultOperator = Operator.And }; mustquery.Add(termQuery); } QueryContainer boolQuery = new BoolQuery() { Must = mustquery }; return boolQuery; }) ), #endregion //m => m.HasChild<MemberTrack>(h => h.Type(ctype).Query(qu => qu.Prefix(mt => mt.OnField(sc.field.ToLower()).Value(sc.keyword)))), m => m.Bool(bl => bl.Must( mu => mu.Wildcard(mt => mt.OnField("country").Value(Convert.ToString(string.IsNullOrEmpty(sc.country) ? "" : string.Format("*{0}*", sc.country)))), mu => mu.Wildcard(mt => mt.OnField("province").Value(Convert.ToString(string.IsNullOrEmpty(sc.province) ? "" : string.Format("*{0}*", sc.province)))), mu => mu.Wildcard(mt => mt.OnField("city").Value(Convert.ToString(string.IsNullOrEmpty(sc.city) ? "" : string.Format("*{0}*", sc.city)))), mu => mu.Wildcard(mt => mt.OnField("address").Value(Convert.ToString(string.IsNullOrEmpty(sc.address) ? "" : string.Format("*{0}*", sc.address)))), mu => mu.Wildcard(mt => mt.OnField("memo").Value(Convert.ToString(string.IsNullOrEmpty(sc.memo) ? "" : string.Format("*{0}*", sc.memo)))), mu => mu.Match(mt => mt.OnField("tracktypeid").Query(Convert.ToString(sc.tracktype))), mu => mu.Match(mt => mt.OnField("aftersalesid").Query(Convert.ToString(sc.aftersales))), mu => mu.Match(mt => mt.OnField(sc.classx).Query(classVaule)) ) ) ) )) ); count = (int)searchResults.Count; return count; }
/// <summary> /// WEBAPI使用方法,通过Track表进行父子查询到Member /// </summary> /// <param name="sc"></param> /// <param name="em"></param> /// <returns></returns> public string GetListByTrack(SearchCondition sc, out int em) { string indexname = ConfigurationManager.AppSettings["CRMIndex"].ToString(); string typename = ConfigurationManager.AppSettings["CRMMemberType"].ToString(); string ctype = ConfigurationManager.AppSettings["CRMMTrackType"].ToString(); if (string.IsNullOrEmpty(sc.field)) { sc.field = "mtmemo"; } string classVaule = ""; if (string.IsNullOrEmpty(sc.classx)) { sc.classx = ""; } else { sc.classx = sc.classx.ToLower(); classVaule = "1"; } var searchResults = Connect.GetSearchClient().Search<Member>(s => s .Index(indexname) .Type(typename) .Fields(f => f.Id, f => f.Enterprise, f => f.Isstar, f => f.Masterlinkman, f => f.Tracktypeid, f => f.Sourceid, f => f.Lastcontacttime, f => f.Enddate, f => f.Adminname, f => f.Addtime) .Query(q => q .Bool(b => b .Must( #region 不行留用 m => m.HasChild<MemberTrack>(h => h.Type(ctype).Query(qu => { List<QueryContainer> mustquery = new List<QueryContainer>(); foreach (string str in sc.keywords) { QueryContainer termQuery = new QueryStringQuery() { DefaultField = sc.field.ToLower(), Query = str, DefaultOperator = Operator.And }; mustquery.Add(termQuery); } QueryContainer boolQuery = new BoolQuery() { Must = mustquery }; return boolQuery; }) ), #endregion //m => m.HasChild<MemberTrack>(h => h.Type(ctype).Query(qu => qu.Prefix(mt => mt.OnField(sc.field.ToLower()).Value(sc.keyword)))), m => m.Bool(bl => bl.Must( mu => mu.Wildcard(mt => mt.OnField("country").Value(Convert.ToString(string.IsNullOrEmpty(sc.country) ? "" : string.Format("*{0}*", sc.country)))), mu => mu.Wildcard(mt => mt.OnField("province").Value(Convert.ToString(string.IsNullOrEmpty(sc.province) ? "" : string.Format("*{0}*", sc.province)))), mu => mu.Wildcard(mt => mt.OnField("city").Value(Convert.ToString(string.IsNullOrEmpty(sc.city) ? "" : string.Format("*{0}*", sc.city)))), mu => mu.Wildcard(mt => mt.OnField("address").Value(Convert.ToString(string.IsNullOrEmpty(sc.address) ? "" : string.Format("*{0}*", sc.address)))), mu => mu.Wildcard(mt => mt.OnField("memo").Value(Convert.ToString(string.IsNullOrEmpty(sc.memo) ? "" : string.Format("*{0}*", sc.memo)))), mu => mu.Match(mt => mt.OnField("tracktypeid").Query(Convert.ToString(sc.tracktype))), mu => mu.Match(mt => mt.OnField("aftersalesid").Query(Convert.ToString(sc.aftersales))), mu => mu.Match(mt => mt.OnField(sc.classx).Query(classVaule)) ) ) ) )) .Sort(st => st.OnField(f => f.Lastcontacttime).Order(SortOrder.Descending)) /*排序*/ .From(sc.start) .Size(sc.size) ); em = searchResults.ElapsedMilliseconds; StringBuilder ResultJson = new StringBuilder(""); ResultJson.Append("["); foreach (var hit in searchResults.Hits) { ResultJson.Append("{"); ResultJson.Append( String.Join(",", hit.Fields.FieldValuesDictionary .Select(FVD => "'" + FVD.Key + "':'" + FVD.Value.ToString().Replace("[", "").Replace("]", "") + "'") .ToArray() ) ); ResultJson.Append("},"); } if (ResultJson.Length > 1) ResultJson.Length = ResultJson.Length - 1; ResultJson.Append("]"); return ResultJson.ToString(); }
/// <summary> /// WEBAPI使用方法,直接获取Member /// </summary> /// <param name="sc"></param> /// <param name="em"></param> /// <returns></returns> public string GetMember(SearchCondition sc, out int em) { string indexname = ConfigurationManager.AppSettings["CRMIndex"].ToString(); string typename = ConfigurationManager.AppSettings["CRMMemberType"].ToString(); string field = ""; if (string.IsNullOrEmpty(sc.field)) { field = ""; } else { field = sc.field.ToLower(); } string classVaule = ""; if (string.IsNullOrEmpty(sc.classx)) { sc.classx = ""; } else { sc.classx = sc.classx.ToLower(); classVaule = "1"; } //must List<QueryContainer> mustquerys = new List<QueryContainer>(); if (field.Equals("lastcontacttime")) { string timeG = sc.keywords[0]; string timeL = DateTime.Parse(timeG).AddDays(-7).ToString("yyyy-MM-dd"); QueryContainer rangeQuyery = new RangeQuery() { Field = field, GreaterThanOrEqualTo = timeL, LowerThanOrEqualTo = timeG, TimeZone = "+08:00" }; mustquerys.Add(rangeQuyery); } else if (field.Equals("enterprise")) { foreach (string keyw in sc.keywords) { List<QueryContainer> shouooo = new List<QueryContainer>(); QueryContainer termQ = new TermQuery() { Field = "enterprise", Value = sc.keyword.Replace(',', ' ') }; QueryContainer lowerQuery = new WildcardQuery() { Field = "enterprise", Value = string.IsNullOrEmpty(keyw) ? "*" : string.Format("*{0}*", keyw.ToLower()) }; QueryContainer notlowerQuery = new WildcardQuery() { Field = "enterprise.lower", Value = string.IsNullOrEmpty(keyw) ? "*" : string.Format("*{0}*", keyw.ToLower()) }; shouooo.Add(termQ); shouooo.Add(lowerQuery); shouooo.Add(notlowerQuery); QueryContainer boooQuery = new BoolQuery() { Should = shouooo }; mustquerys.Add(boooQuery); } } else { foreach (string keyw in sc.keywords) { QueryContainer wildcardQuery = new WildcardQuery() { Field = field, Value = string.IsNullOrEmpty(keyw) ? "*" : string.Format("*{0}*", keyw) }; mustquerys.Add(wildcardQuery); } } QueryContainer matchQueryT = new MatchQuery() { Field = "tracktypeid", Query = Convert.ToString(sc.tracktype) }; QueryContainer matchQueryC = new MatchQuery() { Field = sc.classx, Query = classVaule }; QueryContainer queryCountry = new WildcardQuery() { Field = "country", Value = string.Format("*{0}*", sc.country) }; QueryContainer queryProvince = new WildcardQuery() { Field = "province", Value = string.Format("*{0}*", sc.province) }; QueryContainer queryCity = new WildcardQuery() { Field = "city", Value = string.Format("*{0}*", sc.city) }; if (!string.IsNullOrEmpty(sc.tracktype)) { mustquerys.Add(matchQueryT); } if (!string.IsNullOrEmpty(sc.classx)) { mustquerys.Add(matchQueryC); } if (!string.IsNullOrEmpty(sc.country)) { mustquerys.Add(queryCountry); } if (!string.IsNullOrEmpty(sc.province)) { mustquerys.Add(queryProvince); } if (!string.IsNullOrEmpty(sc.city)) { mustquerys.Add(queryCity); } QueryContainer boolQuery = new BoolQuery() { Must = mustquerys }; var searchResults = Connect.GetSearchClient().Search<Member>(s => s .Index(indexname) .Type(typename) .Fields(f => f.Id, f => f.Enterprise, f => f.Isstar, f => f.Masterlinkman, f => f.Tracktypeid, f => f.Sourceid, f => f.Lastcontacttime, f => f.Enddate, f => f.Adminname, f => f.Addtime) .Query(boolQuery) .Sort(st => st.OnField(f => f.Lastcontacttime).Order(SortOrder.Descending)) /*排序*/ .From(sc.start) .Size(sc.size) ); em = searchResults.ElapsedMilliseconds; StringBuilder ResultJson = new StringBuilder(""); ResultJson.Append("["); foreach (var hit in searchResults.Hits) { ResultJson.Append("{"); ResultJson.Append( String.Join(",", hit.Fields.FieldValuesDictionary .Select(FVD => "'" + FVD.Key + "':'" + FVD.Value.ToString().Replace("[", "").Replace("]", "") + "'") .ToArray() ) ); ResultJson.Append("},"); } if (ResultJson.Length > 1) ResultJson.Length = ResultJson.Length - 1; ResultJson.Append("]"); return ResultJson.ToString(); }
protected void AddQueryString(string fieldName, BoolQuery<ESDocument> query, CatalogItemSearchCriteria filter) { var searchPhrase = filter.SearchPhrase; if (filter.IsFuzzySearch) { var keywords = Regex.Split(searchPhrase, @"\s+"); searchPhrase = string.Empty; searchPhrase = keywords.Aggregate(searchPhrase, (current, keyword) => current + String.Format("{0}~{1}", keyword, filter.FuzzyMinSimilarity)); } query.Must(q => q.QueryString(t => t.DefaultField(fieldName).DefaultOperator(Operator.AND).Query(searchPhrase))); }
public object BuildQuery(ISearchCriteria criteria) { var query = new BoolQuery<ESDocument>(); #region Filters if (criteria.CurrentFilterValues != null) { for (var index = 0; index < criteria.CurrentFilterFields.Length; index++) { var filter = criteria.CurrentFilters.ElementAt(index); var value = criteria.CurrentFilterValues.ElementAt(index); var field = criteria.CurrentFilterFields.ElementAt(index).ToLower(); // Skip currencies that are not part of the filter if (filter.GetType() == typeof(PriceRangeFilter)) // special filtering { var priceRangeFilter = filter as PriceRangeFilter; if (priceRangeFilter != null) { var currency = priceRangeFilter.Currency; if (!currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase)) continue; } } if (filter.GetType() == typeof(PriceRangeFilter)) { var tempQuery = ElasticQueryHelper.CreatePriceRangeFilter(criteria, field, value as RangeFilterValue); if (tempQuery != null) { query.Must(q => q.ConstantScore(c => c.Filter(f => f.Bool(b=>tempQuery)))); } } else { if (value.GetType() == typeof(AttributeFilterValue)) { query.Must(q => q.Text(t => t.Field(field).Query(((AttributeFilterValue)value).Value))); } else if (value.GetType() == typeof(RangeFilterValue)) { var tempValue = value as RangeFilterValue; var tempFilter = new RangeFilter<ESDocument>(); tempFilter.Field(field).From(tempValue.Lower).To(tempValue.Upper).IncludeLower(true).IncludeUpper(false); query.Should(q => q.ConstantScore(c => c.Filter(f => f.Range(r => tempFilter)))); } } } } #endregion #region CatalogItemSearchCriteria if (criteria is CatalogItemSearchCriteria) { var c = criteria as CatalogItemSearchCriteria; query.Must(m => m .Range(r => r.Field("startdate").To(c.StartDate.ToString("s"))) ); if (c.StartDateFrom.HasValue) { query.Must(m => m .Range(r => r.Field("startdate").From(c.StartDateFrom.Value.ToString("s"))) ); } if (c.EndDate.HasValue) { query.Must(m => m .Range(r => r.Field("enddate").From(c.EndDate.Value.ToString("s"))) ); } query.Must(m => m.Term(t => t.Field("__hidden").Value("false"))); if (c.Outlines != null && c.Outlines.Count > 0) AddQuery("__outline", query, c.Outlines); if (!String.IsNullOrEmpty(c.SearchPhrase)) { AddQueryString("__content", query, c); } if (!String.IsNullOrEmpty(c.Catalog)) { AddQuery("catalog", query, c.Catalog); } } #endregion if (criteria is ElasticSearchCriteria) { var c = criteria as ElasticSearchCriteria; query.Must(m => m.Custom(c.RawQuery)); } return query; }
protected void AddQueryString(BoolQuery<ESDocument> query, CatalogIndexedSearchCriteria filter, params string[] fields) { var searchPhrase = filter.SearchPhrase; if (filter.IsFuzzySearch) { query.Must( q => q.MultiMatch( x => x.Fields(fields).Operator(Operator.AND).Fuzziness(filter.FuzzyMinSimilarity).Query(searchPhrase))); } else { query.Must( q => q.MultiMatch( x => x.Fields(fields).Operator(Operator.AND).Query(searchPhrase))); } }
protected void AddQueryString(string fieldName, BoolQuery<ESDocument> query, CatalogItemSearchCriteria filter) { var searchPhrase = filter.SearchPhrase; if (filter.IsFuzzySearch) { query.Must( q => q.Match( x => x.Field(fieldName).Operator(Operator.AND).Fuzziness(filter.FuzzyMinSimilarity).Query(searchPhrase))); } else { query.Must( q => q.Match( x => x.Field(fieldName).Operator(Operator.AND).Query(searchPhrase))); } }
public object BuildQuery(ISearchCriteria criteria) { var builder = new QueryBuilder<ESDocument>(); var mainFilter = new Filter<ESDocument>(); var mainQuery = new BoolQuery<ESDocument>(); #region Sorting // Add sort order if (criteria.Sort != null) { var fields = criteria.Sort.GetSort(); foreach (var field in fields) { builder.Sort(d => d.Field(field.FieldName, field.IsDescending ? SortDirection.desc : SortDirection.asc, ignoreUnmapped: field.IgnoredUnmapped)); } } #endregion #region Filters // Perform facet filters if (criteria.CurrentFilters != null) { var combinedFilter = new BoolFilter<ESDocument>(); // group filters foreach (var filter in criteria.CurrentFilters) { // Skip currencies that are not part of the filter if (filter.GetType() == typeof(PriceRangeFilter)) // special filtering { var priceRangeFilter = filter as PriceRangeFilter; if (priceRangeFilter != null) { var currency = priceRangeFilter.Currency; if (!currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase)) continue; } } var filterQuery = ElasticQueryHelper.CreateQuery(criteria, filter); if (filterQuery != null) { combinedFilter.Must(c => c.Bool(q=>filterQuery)); } } mainFilter.Bool(bl => combinedFilter); } #endregion #region CatalogItemSearchCriteria if (criteria is CatalogItemSearchCriteria) { var c = criteria as CatalogItemSearchCriteria; mainQuery.Must(m => m .Range(r => r.Field("startdate").To(c.StartDate.ToString("s"))) ); if (c.StartDateFrom.HasValue) { mainQuery.Must(m => m .Range(r => r.Field("startdate").From(c.StartDateFrom.Value.ToString("s"))) ); } if (c.EndDate.HasValue) { mainQuery.Must(m => m .Range(r => r.Field("enddate").From(c.EndDate.Value.ToString("s"))) ); } mainQuery.Must(m => m.Term(t => t.Field("__hidden").Value("false"))); if (c.Outlines != null && c.Outlines.Count > 0) AddQuery("__outline", mainQuery, c.Outlines); if (!String.IsNullOrEmpty(c.SearchPhrase)) { AddQueryString("__content", mainQuery, c); } if (!String.IsNullOrEmpty(c.Catalog)) { AddQuery("catalog", mainQuery, c.Catalog); } } #endregion if (criteria is ElasticSearchCriteria) { var c = criteria as ElasticSearchCriteria; mainQuery.Must(m => m.Custom(c.RawQuery)); } builder.Query(q => q.Bool(b => mainQuery)); builder.Filter(f => mainFilter); // Add search facets var facets = GetFacets(criteria); builder.Facets(f => facets); return builder; }
protected void AddQuery(string fieldName, BoolQuery<ESDocument> query, StringCollection filter) { fieldName = fieldName.ToLower(); if (filter.Count > 0) { if (filter.Count == 1) { if (!String.IsNullOrEmpty(filter[0])) { AddQuery(fieldName, query, filter[0].ToLower()); } } else { var booleanQuery = new BoolQuery<ESDocument>(); var containsFilter = false; foreach (var index in filter.Cast<string>().Where(index => !String.IsNullOrEmpty(index))) { booleanQuery.Should(q => q.Custom("{{\"wildcard\" : {{ \"{0}\" : \"{1}\" }}}}", fieldName.ToLower(), index.ToLower())); containsFilter = true; } if (containsFilter) query.Must(q => q.Bool(b => booleanQuery)); } } }
public override SearchResult DoSearch(string input, int pageNumber, Primitive filterByOwner, Type filterByType) { Initialise(); int perPage = 10; int start = (pageNumber - 1) * perPage; List<ISearchableItem> results = new List<ISearchableItem>(); List<ItemKey> itemKeys = new List<ItemKey>(); List<long> applicationIds = new List<long>(); BoolQuery query = new BoolQuery(); QueryStringQuery bodyQuery = new QueryStringQuery(); bodyQuery.Query = input; BoolQuery accessQuery = new BoolQuery(); TermQuery accessPublicQuery = new TermQuery(); accessPublicQuery.Field = "item_public"; accessPublicQuery.Value = 1; if (core.Session.IsLoggedIn) { List<long> friends = core.Session.LoggedInMember.GetFriendsWithMeIds(); BoolQuery accessFriendQuery = new BoolQuery(); TermQuery friendQuery = new TermQuery(); friendQuery.Field = "item_public"; friendQuery.Value = 2; accessFriendQuery.Must = new List<QueryContainer> { friendQuery }; string userTypeId = ItemType.GetTypeId(core, typeof(User)).ToString(); foreach (long friendId in friends) { BoolQuery ownerQuery = new BoolQuery(); TermQuery ownerIdQuery = new TermQuery(); ownerIdQuery.Field = "owner_id"; ownerIdQuery.Value = friendId; TermQuery ownerTypeQuery = new TermQuery(); ownerTypeQuery.Field = "owner_type_id"; ownerTypeQuery.Value = userTypeId; ownerQuery.Must = new List<QueryContainer> { ownerIdQuery, ownerTypeQuery }; accessFriendQuery.Should = new List<QueryContainer> { ownerQuery }; } accessQuery.Should = new List<QueryContainer> { accessPublicQuery, accessFriendQuery }; } query.Must = new List<QueryContainer> { bodyQuery, accessQuery }; if (filterByType != null) { TermQuery typeQuery = new TermQuery(); typeQuery.Field = "item_type_id"; typeQuery.Value = ItemType.GetTypeId(core, filterByType); ((List<QueryContainer>)query.Must).Add(typeQuery); } if (filterByOwner != null) { TermQuery ownerIdQuery = new TermQuery(); ownerIdQuery.Field = "owner_id"; ownerIdQuery.Value = filterByOwner.Id; TermQuery ownerTypeIdQuery = new TermQuery(); ownerTypeIdQuery.Field = "owner_type_id"; ownerTypeIdQuery.Value = filterByOwner.TypeId; ((List<QueryContainer>)query.Must).Add(ownerIdQuery); ((List<QueryContainer>)query.Must).Add(ownerTypeIdQuery); } int totalResults = 0; SearchRequest request = new SearchRequest(); request.Query = query; request.Size = perPage; request.From = start; ElasticsearchResponse<List<ItemIndexDocument>> response = client.Search<List<ItemIndexDocument>>(request); foreach (ItemIndexDocument doc in response.Body) { } return new SearchResult(results, totalResults); }