/// <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);
        }
Example #3
0
        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 }));
        }
Example #4
0
        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;
                }
            }));
        }
Example #7
0
        /// <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);
        }
Example #8
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);
        }
Example #10
0
 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);
        }
Example #12
0
        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>());
        }
Example #14
0
        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);
        }
Example #15
0
        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());
        }
Example #16
0
        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
                });
            }
        }
Example #20
0
        private string VisitQuery(BoolQuery query)
        {
            var visitor = new ElasticSearchDSLVisitor(SchemaRetrieverMock.CreateMockSchemaRetriever());

            visitor.Visit(query);
            return(query.KustoQL);
        }
Example #21
0
        public string BoolQueryVisit_WithShouldNotLeaf_ReturnsValidResponse()
        {
            var boolQuery = new BoolQuery
            {
                ShouldNot = CreateSimpleLeafList("ItemD"),
            };

            return(VisitQuery(boolQuery));
        }
Example #22
0
        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));
        }
Example #23
0
        /// <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);
        }
Example #24
0
 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);
        }
Example #27
0
        public static bool TryGetBoolQuery(IQuery query, out BoolQuery currentBoolQuery)
        {
            currentBoolQuery = query as BoolQuery;
            if (currentBoolQuery == null)
            {
                return(false);
            }

            return(true);
        }
Example #28
0
        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);
        }
Example #29
0
 /**
  *....
  * |===
  * |     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
     };
 }
Example #30
0
        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()));
 }
Example #33
0
        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;
        }
Example #34
0
 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;
 }
Example #35
0
        /// <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();
        }
Example #36
0
        /// <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();
        }
		/**
		 *....
		 * |===
		 * |     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
			};
		}
		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));
                }
            }
        }
Example #44
0
        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);
        }