示例#1
0
        private void AppendFilters <T>(SearchRequest <T> request, SearchFilter[] filters)
        {
            if (filters != null)
            {
                foreach (var filter in filters)
                {
                    if (filter.Value == null)
                    {
                        continue;
                    }

                    //var qsq = new TermQuery { Field = new Field(filter.Field), Value = filter.Value };
                    //MatchQuery qsq=new MatchQuery { Field = filter.Field,  Query = new  };
                    QueryStringQuery qsq = new QueryStringQuery {
                        DefaultField = filter.Field, Query = filter.Value.ToString()
                    };                                                                                                             // Fuzzy
                    if (request.Query == null)
                    {
                        request.Query = qsq;
                    }
                    else
                    {
                        request.Query &= qsq;
                    }
                }
            }
        }
 public void PASS_CreateQuery_DefaultField()
 {
     QueryStringQuery query = new QueryStringQuery("field", "term1 term2");
     Assert.IsNotNull(query);
     Assert.AreEqual(1, query.NumberOfFields);
     Assert.AreEqual("term1 term2", query.Query);
 }
示例#3
0
        public void Query_string_query_must_transform_correclty_to_ES()
        {
            var query = new QueryStringQuery("Yuri Metelkin", new string[] { "head" }, true);

            Assert.IsTrue(query.Query == "Yuri Metelkin");
            Assert.IsTrue(query.IsAnd);
            Assert.IsTrue(query.Fields[0] == "head");

            string json = query.ToString();
            var    jo   = JsonObject.Parse(json);
            var    q    = jo.ToQuery();

            Assert.IsTrue(q.Type == QueryType.QueryStringQuery);
            query = q as QueryStringQuery;
            Assert.IsTrue(query.Query == "Yuri Metelkin");
            Assert.IsTrue(query.IsAnd);
            Assert.IsTrue(query.Fields[0] == "head");

            query = new QueryStringQuery("head:YM AND body:SV");
            Assert.IsTrue(query.Query == "head:YM AND body:SV");
            Assert.IsFalse(query.IsAnd);
            Assert.IsNull(query.Fields);

            json = query.ToString();
            jo   = JsonObject.Parse(json);
            q    = jo.ToQuery();
            Assert.IsTrue(q.Type == QueryType.QueryStringQuery);
            query = q as QueryStringQuery;
            Assert.IsTrue(query.Query == "head:YM AND body:SV");
            Assert.IsFalse(query.IsAnd);
            Assert.IsNull(query.Fields);
        }
示例#4
0
        private static IQuery Transform(QueryStringQuery query, IDictionary <string, string[]> aliases, IQueryExpander qe)
        {
            bool qsq  = false;
            bool sqsq = false;

            var qs = query.Query.ToQueryString().Transform(aliases, ref qsq, ref sqsq);

            if (qsq)
            {
                return(new QueryStringQuery(qs.ToString(), query.Fields, query.IsAnd));
            }
            else
            {
                if (sqsq)
                {
                    return(new SimpleQueryStringQuery(qs.ToString(), query.Fields, query.IsAnd));
                }
                else
                {
                    var terms = qs.GetTerms();
                    if (terms.Length == 0)
                    {
                        return(new MatchAllQuery());
                    }
                    else
                    {
                        var match = new MultiMatchQuery(string.Join(" ", terms), query.Fields, MultiMatchType.BestFields, query.IsAnd);
                        return(qe == null ? match : qe.Expand(match));
                    }
                }
            }
        }
示例#5
0
        /// <summary>
        /// 检索
        /// </summary>
        /// <param name="KeyWord"></param>
        /// <returns></returns>
        public static List <Article> Search(string KeyWord, string Field)
        {
            var            KeyWordArray = KeyWord.Split(" ".ToArray());
            QueryContainer query        = null;

            for (int i = 0; i < KeyWordArray.Length; i++)
            {
                if (query == null)
                {
                    query = new QueryStringQuery()
                    {
                        DefaultField = Field.ToLower(), Query = KeyWordArray[i], DefaultOperator = Operator.And
                    };
                }
                else
                {
                    query = query && new QueryStringQuery()
                    {
                        DefaultField = Field.ToLower(), Query = KeyWordArray[i], DefaultOperator = Operator.And
                    };
                }
            }
            ISearchRequest s = new SearchRequest();

            s.Query = query;
            s.Size  = 1000;
            var searchResults = client.Search <Article>(s);

            return(searchResults.Documents.ToList());
        }
示例#6
0
        public int GetCount(string keyword, string type)
        {
            int count = 0;


            string indexname = ConfigurationManager.AppSettings["IndexName"].ToString();
            string typename  = ConfigurationManager.AppSettings["TypeName"].ToString();

            if (string.IsNullOrEmpty(type))
            {
                type = "_all";
            }
            QueryContainer matchQuery = new MatchQuery()
            {
                Field = type, Query = keyword, Operator = Operator.And
            };
            QueryContainer querystring = new QueryStringQuery()
            {
                Query = keyword, DefaultOperator = Operator.And
            };
            //调用仅取数量方法
            var counts = Connect.GetSearchClient().Count <NewsBase>(s => s
                                                                    .Index(indexname)
                                                                    .Type(typename)
                                                                    .Query(matchQuery)
                                                                    );

            count = (int)counts.Count;
            return(count);
        }
示例#7
0
        private void AppendFilters <T>(SearchRequest <T> request, SearchFilter[] filters)
        {
            if (filters != null)
            {
                foreach (var filter in filters)
                {
                    if (filter.Value == null)
                    {
                        continue;
                    }

                    //MatchQuery mq=new MatchQuery { Field = key.ToLower(), Query = nvc[key] };
                    QueryStringQuery qsq = new QueryStringQuery {
                        DefaultField = filter.Field, Query = filter.Value.ToString()
                    };
                    if (request.Query == null)
                    {
                        request.Query = qsq;
                    }
                    else
                    {
                        request.Query &= qsq;
                    }
                }
            }
        }
 public void PASS_CreateQuery_Fields()
 {
     QueryStringQuery query = new QueryStringQuery(new List<string>() { "field1", "field2" }, "term1 term2");
     Assert.IsNotNull(query);
     Assert.AreEqual(2, query.NumberOfFields);
     Assert.AreEqual("term1 term2", query.Query);
 }
示例#9
0
        public void SearchDoc_QueryString(ElasticClient client)
        {
            var queryStringQuery = new QueryStringQuery()
            {
                Fields = Infer.Field <Product>(p => p.Description).And("name"),
                Query  = "dog",
                //Query = "test"
            };

            var searchRequest = new SearchRequest <Product>(Indices.Parse("esdemo"), Types.Parse("product"))
            {
                From  = 0,
                Size  = 10,
                Query = queryStringQuery
            };

            var searchResponse = client.Search <Product>(searchRequest);

            var list  = searchResponse.Documents.ToList();
            var count = searchResponse.Total;

            System.Console.WriteLine("QueryStringQuery");
            System.Console.WriteLine(list.ToJsonString());
            System.Console.WriteLine(count);
        }
        public void PASS_Serialize()
        {
            QueryStringQuery query = new QueryStringQuery("field", "term1 term2");
            string json = JsonConvert.SerializeObject(query);
            Assert.IsNotNull(json);

            string expectedJson = "{\"query_string\":{\"default_field\":\"field\",\"query\":\"term1 term2\"}}";
            Assert.AreEqual(expectedJson, json);
        }
        public void Export_ReturnsValidJson()
        {
            var query = new QueryStringQuery("description:water and some other stuff");

            var expected = JsonConvert.SerializeObject(new
            {
                query = "description:water and some other stuff"
            }, Formatting.None);

            Assert.AreEqual(expected, query.Export().ToString(Formatting.None));
        }
示例#12
0
        public async void searchUsers(String searchText, bool isAutoComplete)
        {
            String indexName = "users";

            string query;

            searchText = searchText.Replace("%", "").Replace("/", " ").Replace("\"", "").Trim();
            if (isAutoComplete)
            {
                query = $"{searchText}*";
            }
            else
            {
                query = $"*{string.Join("* AND *", searchText.Split())}*";
            }
            QueryStringQuery qsq = new QueryStringQuery
            {
                Fields = Infer.Field <User>(d => d.firstName)
                         .And <User>(d => d.lastName),
                Query = query
            };


            var filters = new List <QueryContainer>
            {
                new NumericRangeQuery {
                    Field = "age", GreaterThanOrEqualTo = 23
                }
            };

            var must = new List <QueryContainer>();

            must.Add(qsq);


            var sort = new List <ISort>();

            sort.Add(new FieldSort {
                Field = "age", Order = SortOrder.Descending
            });

            var searchRequest = new SearchRequest(indexName)
            {
                Query = new BoolQuery
                {
                    Must   = must,
                    Filter = filters
                },
                Sort = sort
            };

            var json   = esClient.RequestResponseSerializer.SerializeToString(searchRequest);
            var result = await esClient.SearchAsync <User>(searchRequest);
        }
 public void FAIL_CreateQuery_Field()
 {
     try
     {
         QueryStringQuery query = new QueryStringQuery("", "query");
     }
     catch (ArgumentNullException ex)
     {
         Assert.AreEqual("field", ex.ParamName);
     }
 }
示例#14
0
文件: ESTest.cs 项目: lulzzz/WCloud
        static void DifferentQuerysInEs(QueryContainer qc)
        {
            //匹配查询
            qc &= new MatchQuery()
            {
                Field              = "analyized field name",
                Query              = "关键词",
                Operator           = Operator.Or,
                MinimumShouldMatch = "100%",
                Analyzer           = "ik_smart"
            };

            //https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-syntax
            //https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html
            //query string自定义了一个查询语法
            var qsq = new QueryStringQuery()
            {
            };

            //https://www.elastic.co/guide/cn/elasticsearch/guide/current/_wildcard_and_regexp_queries.html
            //使用通配符查询,比如name.*
            var wcq = new WildcardQuery()
            {
            };

            //精准匹配,不分词
            var tq = new TermQuery()
            {
            };

            //字段存在且不为空
            var eq = new ExistsQuery()
            {
            };

            //https://www.elastic.co/guide/cn/elasticsearch/guide/current/fuzzy-query.html
            //模糊查询,它会计算关键词和目标字段的“距离”。如果在允许的距离范围内,计算拼写错误也可以匹配到
            var fq = new FuzzyQuery()
            {
            };

            //范围查询
            var drq = new DateRangeQuery()
            {
            };
            var nrq = new NumericRangeQuery()
            {
            };
        }
示例#15
0
 public int GetCount(string keyword, string field)
 {
     int count = 0;
     string indexname = ConfigurationManager.AppSettings["CRMIndexV"].ToString();
     string typename = ConfigurationManager.AppSettings["VSmsClassType"].ToString();
     QueryContainer query = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.Or, DefaultField = field };
     //调用仅取数量方法
     var counts = Connect.GetSearchClient().Count<VSmsClass>(s => s
         .Index(indexname)
         .Type(typename)
         .Query(query)
     );
     count = (int)counts.Count;
     return count;
 }
示例#16
0
 public List<VCommonProduct> GetList(string keyword, string field, int start, int size)
 {
     string indexname = ConfigurationManager.AppSettings["CRMIndexV"].ToString();
     string typename = ConfigurationManager.AppSettings["VCProductType"].ToString();
     QueryContainer query = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.Or, DefaultField = field };
     var searchResults = Connect.GetSearchClient().Search<VCommonProduct>(s => s
         .Index(indexname)
         .Type(typename)
         .Query(query)
         .From(start)
         .Size(size)
     );
     List<VCommonProduct> eslist = new List<VCommonProduct>(searchResults.Documents);
     return eslist;
 }
        public override void BuildQuery <T>(object query, object options, ref QueryContainer container)
        {
            var searchQuery = query as ISearchQuery;

            if (String.IsNullOrEmpty(searchQuery?.SearchQuery))
            {
                return;
            }

            container &= new QueryStringQuery {
                Query           = searchQuery.SearchQuery,
                DefaultOperator = searchQuery.DefaultSearchQueryOperator == SearchOperator.Or ? Operator.Or : Operator.And,
                AnalyzeWildcard = true
            };
        }
示例#18
0
 public List<VSmsClass> GetList(string keyword, string field, int start, int size)
 {
     string indexname = ConfigurationManager.AppSettings["CRMIndexV"].ToString();
     string typename = ConfigurationManager.AppSettings["VSmsClassType"].ToString();
     QueryContainer query = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.Or, DefaultField = field };
     var searchResults = Connect.GetSearchClient().Search<VSmsClass>(s => s
         .Index(indexname)
         .Type(typename)
         .Query(query)
         //.Sort(st => st.OnField(f => f.newsid).Order(SortOrder.Descending))  /*按ID排序,id为数字,排序正常*/
         .From(start)
         .Size(size)
     );
     List<VSmsClass> eslist = new List<VSmsClass>(searchResults.Documents);
     return eslist;
 }
示例#19
0
        protected virtual QueryContainer GetSimpleQuery <T>(SimpleCatalogItemSearchCriteria criteria)
            where T : class
        {
            QueryContainer result = null;

            if (criteria != null)
            {
                if (criteria.RawQuery != null && !string.IsNullOrEmpty(criteria.RawQuery))
                {
                    result = new QueryStringQuery {
                        Query = criteria.RawQuery, Lenient = true, DefaultOperator = Operator.And, Analyzer = "standard"
                    };
                }
            }

            return(result);
        }
示例#20
0
        public List <VCommonProduct> GetList(string keyword, string field, int start, int size)
        {
            string         indexname = ConfigurationManager.AppSettings["CRMIndexV"].ToString();
            string         typename  = ConfigurationManager.AppSettings["VCProductType"].ToString();
            QueryContainer query     = new QueryStringQuery()
            {
                Query = keyword, DefaultOperator = Operator.Or, DefaultField = field
            };
            var searchResults = Connect.GetSearchClient().Search <VCommonProduct>(s => s
                                                                                  .Index(indexname)
                                                                                  .Type(typename)
                                                                                  .Query(query)
                                                                                  .From(start)
                                                                                  .Size(size)
                                                                                  );
            List <VCommonProduct> eslist = new List <VCommonProduct>(searchResults.Documents);

            return(eslist);
        }
示例#21
0
        public int GetCount(string keyword, string field)
        {
            int            count     = 0;
            string         indexname = ConfigurationManager.AppSettings["CRMIndexV"].ToString();
            string         typename  = ConfigurationManager.AppSettings["VSmsClassType"].ToString();
            QueryContainer query     = new QueryStringQuery()
            {
                Query = keyword, DefaultOperator = Operator.Or, DefaultField = field
            };
            //调用仅取数量方法
            var counts = Connect.GetSearchClient().Count <VSmsClass>(s => s
                                                                     .Index(indexname)
                                                                     .Type(typename)
                                                                     .Query(query)
                                                                     );

            count = (int)counts.Count;
            return(count);
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            Dictionary<string, object> fieldDict = serializer.Deserialize<Dictionary<string, object>>(reader);
            if (fieldDict.ContainsKey(QueryTypeEnum.QueryString.ToString()))
                fieldDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(fieldDict.First().Value.ToString());

            QueryStringQuery query = null;
            string queryStr = fieldDict.GetString(_QUERY);
            IEnumerable<string> fields = null;
            //string fields = null;
            if(fieldDict.ContainsKey(_DEFAULT_FIELD))
                query = new QueryStringQuery(fieldDict.GetString(_DEFAULT_FIELD), queryStr);
            else if(fieldDict.ContainsKey(_FIELDS))
                query = new QueryStringQuery(JsonConvert.DeserializeObject<IEnumerable<string>>(fieldDict.GetString(_FIELDS)), queryStr);
            else
                query = new QueryStringQuery(queryStr);

            query.AllowLeadingWildcard = fieldDict.GetBool(_ALLOW_LEADING_WILDCARD, _ALLOW_LEADING_WILDCARD_DEFAULT);
            query.Analyzer = fieldDict.GetStringOrDefault(_ANALYZER);
            query.AnalyzeWildcard = fieldDict.GetBool(_ANALYZE_WILDCARD, _ANALYZE_WILDCARD_DEFAULT);
            query.AutoGeneratePhraseQueries = fieldDict.GetBool(_AUTO_GENERATE_PHRASE_QUERIES, _AUTO_GENERATE_PHRASE_QUERIES_DEFAULT);
            query.Boost = fieldDict.GetDouble(QuerySerializer._BOOST, QuerySerializer._BOOST_DEFAULT);
            query.DefaultOperator = OperatorEnum.Find(fieldDict.GetString(_DEFAULT_OPERATOR, _DEFAULT_OPERATOR_DEFAULT.ToString()));
            query.EnablePositionIncrements = fieldDict.GetBool(_ENABLE_POSITION_INCREMENTS, _ENABLE_POSITION_INCREMENTS_DEFAULT);
            query.Fuzziness = fieldDict.GetDoubleOrNull(_FUZZINESS);
            query.FuzzyMaximumExpansions = fieldDict.GetInt32(_FUZZY_MAXIMUM_EXPANSIONS, _FUZZY_MAXIMUM_EXPANSIONS_DEFAULT);
            query.FuzzyPrefixLength = fieldDict.GetInt32(_FUZZY_PREFIX_LENGTH, _FUZZY_PREFIX_LENGTH_DEFAULT);
            query.IsLenient = fieldDict.GetBool(_IS_LENIENT, _IS_LENIENT_DEFAULT);
            query.LowerCaseExpandedTerms = fieldDict.GetBool(_LOWERCASE_EXPANDED_TERMS, _LOWERCASE_EXPANDED_TERMS_DEFAULT);
            query.QueryName = fieldDict.GetStringOrDefault(QuerySerializer._QUERY_NAME);

            if (fieldDict.ContainsKey(_MINIMUM_SHOULD_MATCH))
                query.MinimumShouldMatch = MinimumShouldMatchBase.BuildMinimumShouldMatch(fieldDict.GetString(_MINIMUM_SHOULD_MATCH));
            else
                query.MinimumShouldMatch = _MINIMUM_SHOULD_MATCH_DEFAULT;

            query.PhraseSlop = fieldDict.GetInt32(_PHRASE_SLOP, _PHRASE_SLOP_DEFAULT);
            query.TieBreaker = fieldDict.GetInt32(_TIE_BREAKER, _TIE_BREAKER_DEFAULT);
            query.UseDisMax = fieldDict.GetBool(_USE_DIS_MAX, _USE_DIS_MAX_DEFAULT);

            return query;
        }
示例#23
0
        public List <VSmsClass> GetList(string keyword, string field, int start, int size)
        {
            string         indexname = ConfigurationManager.AppSettings["CRMIndexV"].ToString();
            string         typename  = ConfigurationManager.AppSettings["VSmsClassType"].ToString();
            QueryContainer query     = new QueryStringQuery()
            {
                Query = keyword, DefaultOperator = Operator.Or, DefaultField = field
            };
            var searchResults = Connect.GetSearchClient().Search <VSmsClass>(s => s
                                                                             .Index(indexname)
                                                                             .Type(typename)
                                                                             .Query(query)
                                                                             //.Sort(st => st.OnField(f => f.newsid).Order(SortOrder.Descending))  /*按ID排序,id为数字,排序正常*/
                                                                             .From(start)
                                                                             .Size(size)
                                                                             );
            List <VSmsClass> eslist = new List <VSmsClass>(searchResults.Documents);

            return(eslist);
        }
示例#24
0
        public int GetCount(string keyword,string type )
        {
            int count = 0;

            string indexname = ConfigurationManager.AppSettings["IndexName"].ToString();
            string typename = ConfigurationManager.AppSettings["TypeName"].ToString();
            if (string.IsNullOrEmpty(type))
            {
                type = "_all";
            }
            QueryContainer matchQuery = new MatchQuery() { Field = type, Query = keyword, Operator = Operator.And };
            QueryContainer querystring = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.And };
            //调用仅取数量方法
            var counts = Connect.GetSearchClient().Count<NewsBase>(s => s
                .Index(indexname)
                .Type(typename)
                .Query(matchQuery)
            );
            count = (int)counts.Count;
            return count;
        }
示例#25
0
        private QueryContainer GenerateSearchProductQuery(string keyword, Dictionary <string, object> terms)
        {
            QueryContainer nameQuery = new QueryStringQuery()
            {
                Query        = $"name:{keyword}",
                Analyzer     = "ik_syno",
                DefaultField = "name",
            };

            QueryContainer shopNameQuery = new QueryStringQuery()
            {
                Query        = $"shopName:{keyword}",
                Analyzer     = "ik_syno",
                DefaultField = "shopName",
            };

            QueryContainer queryContainer = nameQuery || shopNameQuery;

            if (terms != null)
            {
                foreach (var term in terms)
                {
                    QueryContainer termQuery = new TermQuery
                    {
                        Field = term.Key,
                        Value = term.Value
                    };

                    queryContainer = queryContainer && termQuery;
                }
            }

            var queryDescriptor = new QueryDescriptor <Product>()
                                  .FunctionScore(fsq => fsq
                                                 .Query(q => queryContainer)
                                                 .BoostMode(FunctionBoostMode.Replace)
                                                 .ScriptScore(script => script.Script("_score + doc['weight']")));

            return(queryDescriptor);
        }
示例#26
0
        public bool PartiallyUpdated(string id, int trang_thai, string tu_khoa, int kieu_doi_sanh, string url_cuoi)
        {
            var query = new QueryContainer();

            switch (kieu_doi_sanh)
            {
            case (int)KieuDoiSanh.DOI_SANH_RONG:
                query = new QueryStringQuery()
                {
                    Query = tu_khoa, DefaultField = "tu_khoa"
                };
                break;

            case (int)KieuDoiSanh.KHOP_CHINH_XAC:
                query = new TermQuery()
                {
                    Value = tu_khoa, Field = "tu_khoa"
                };
                break;

            case (int)KieuDoiSanh.KHOP_CUM_TU:
                query = new QueryStringQuery()
                {
                    Query = string.Format("\"{0}\"", tu_khoa), DefaultField = "tu_khoa"
                };
                break;
            }
            var re = client.Update <TuKhoa, object>(id,
                                                    u => u.Doc(new
            {
                trang_thai    = trang_thai,
                kieu_doi_sanh = kieu_doi_sanh,
                tu_khoa       = tu_khoa,
                query         = query,
                url_cuoi      = url_cuoi
            }));

            return(re.Result == Result.Updated);
        }
        public void Boost_ReturnsStringQuery()
        {
            var query = new QueryStringQuery("description:water and some other stuff").Boost(2.2);

            Assert.IsInstanceOf <QueryStringQuery> (query);
        }
        public void Boost_WhenBoostIsLessThanZero_ThrowsArgumentOutOfRangeException()
        {
            var query = new QueryStringQuery("description:water and some other stuff");

            Assert.Throws <ArgumentOutOfRangeException>(() => query.Boost(-.1));
        }
        public static QueryBase GetDefaultQuery(this TermNode node, IQueryVisitorContext context)
        {
            if (!(context is IElasticQueryVisitorContext elasticContext))
            {
                throw new ArgumentException("Context must be of type IElasticQueryVisitorContext", nameof(context));
            }

            QueryBase query;
            string    nodeFullName = node.GetFullName();

            if (elasticContext.IsPropertyAnalyzed(nodeFullName))
            {
                var fields = !String.IsNullOrEmpty(nodeFullName) ? new[] { nodeFullName } : elasticContext.DefaultFields;

                if (!node.IsQuotedTerm && node.UnescapedTerm.EndsWith("*"))
                {
                    query = new QueryStringQuery {
                        Fields = fields,
                        AllowLeadingWildcard = false,
                        AnalyzeWildcard      = true,
                        Query = node.UnescapedTerm
                    };
                }
                else
                {
                    if (fields.Length == 1)
                    {
                        if (node.IsQuotedTerm)
                        {
                            query = new MatchPhraseQuery {
                                Field = fields[0],
                                Query = node.UnescapedTerm
                            };
                        }
                        else
                        {
                            query = new MatchQuery {
                                Field = fields[0],
                                Query = node.UnescapedTerm
                            };
                        }
                    }
                    else
                    {
                        query = new MultiMatchQuery {
                            Fields = fields,
                            Query  = node.UnescapedTerm
                        };
                        if (node.IsQuotedTerm)
                        {
                            (query as MultiMatchQuery).Type = TextQueryType.Phrase;
                        }
                    }
                }
            }
            else
            {
                query = new TermQuery {
                    Field = nodeFullName,
                    Value = node.UnescapedTerm
                };
            }

            return(query);
        }
示例#30
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;
 }
示例#31
0
        /// <summary>
        /// Run a full text search with a selected refiner against the Elasticsearch index
        /// </summary>
        /// <param name="client"></param>
        /// <param name="indexMarker"></param>
        /// <param name="refinerNames"></param>
        /// <returns></returns>
        private ISearchResponse <ResultsModel> RefinedSearch(ElasticClient client, QueryModel query)
        {
            QueryContainer excludeQuery1 = new TermQuery
            {
                Field = "contentType",
                Value = "Telerik.Sitefinity.Pages.Model.PageNode"
            };
            QueryContainer excludeQuery2 = new TermQuery
            {
                Field = "_type",
                Value = "document"
            };


            // get the selected refiner property and value
            string refinerProperty = query.getRefiner().RefinementName;
            string refinerValue    = query.getRefiner().RefinementValue;

            // We could have a mapping from the aggregation name to the field name but why bother/
            // Just stick to a naming convention that says we always use the fieldname as the refinement aggregation name
            //            string filterFieldName = "";
            //            if (refinerProperty.Equals("filter by") || refinerProperty.Equals("FILTER BY")) { filterFieldName = "SiteSection"; }
            //            if (refinerProperty.Equals("refiner your search") || refinerProperty.Equals("REFINER YOUR SEARCH")) { filterFieldName = "SiteSubsection"; }

            string filterFieldName = refinerProperty;

            var _fields = (new List <string>()
            {
                "title^2", "content"
            }).ToArray();

            ISearchResponse <ResultsModel> result = null;


            QueryContainer qry = new QueryStringQuery()
            {
                DefaultOperator = Operator.And,
                Query           = query.getQueryText(),
                Fields          = _fields
            };

            if (query.getOptionalBoostQuery() != null)
            {
                QueryContainer optqry = new QueryStringQuery()
                {
                    DefaultOperator = Operator.And,
                    Query           = query.getOptionalBoostQuery(),
                };


                result = client.Search <ResultsModel>(d => d
                                                      .Index(query.getIndexName())
                                                      .AllTypes()
                                                      .Query(fq => fq
                                                             .Nested(fqq => fqq
                                                                     .Query(q => q
                                                                            .Bool(qb => qb
                                                                                  .Must(optqry || qry)))
                                                                     .Query(ff => ff
                                                                            .Bool(b => b
                                                                                  .Must(m1 => m1.Term(refinerProperty, refinerValue))))
                                                                     ))
                                                      .Aggregations(a => a
                                                                    .Terms("siteSubsection", c => c.Field(cf => cf.SiteSubsection)
                                                                           .Size(0)))
                                                      .Highlight(h => h
                                                                 .PreTags("<b>")
                                                                 .PostTags("</b>")
                                                                 .Fields(f => f
                                                                         .Field(e => e.Content)
                                                                         .ForceSource(true)
                                                                         .PreTags("<em>")
                                                                         .PostTags("</em>")))
                                                      .Highlight(h => h
                                                                 .PreTags("<b>")
                                                                 .PostTags("</b>")
                                                                 .Fields(f => f
                                                                         .Field(e => e.Title)
                                                                         .PreTags("<em>")
                                                                         .PostTags("</em>")))
                                                      .From((query.getPageNumber() - 1) * query.getPageSize())
                                                      .Size(query.getPageSize())
                                                      );
            }
            else
            {
                result = client.Search <ResultsModel>(d => d
                                                      .Index(query.getIndexName())
                                                      .AllTypes()
                                                      .Query(fq => fq
                                                             .Nested(fqq => fqq
                                                                     .Query(q => q
                                                                            .Bool(qb => qb
                                                                                  .Must(qry)))
                                                                     .Query(ff => ff
                                                                            .Bool(b => b
                                                                                  .Must(m1 => m1.Term(refinerProperty, refinerValue))))
                                                                     ))
                                                      .Aggregations(a => a
                                                                    .Terms("siteSubsection", c => c.Field(cf => cf.SiteSubsection)
                                                                           .Size(0)))
                                                      .Highlight(h => h
                                                                 .PreTags("<b>")
                                                                 .PostTags("</b>")
                                                                 .Fields(f => f
                                                                         .Field(e => e.Content)
                                                                         .ForceSource(true)
                                                                         .PreTags("<em>")
                                                                         .PostTags("</em>")))
                                                      .Highlight(h => h
                                                                 .PreTags("<b>")
                                                                 .PostTags("</b>")
                                                                 .Fields(f => f
                                                                         .Field(e => e.Title)
                                                                         .PreTags("<em>")
                                                                         .PostTags("</em>")))
                                                      .From((query.getPageNumber() - 1) * query.getPageSize())
                                                      .Size(query.getPageSize())
                                                      );
            }



            return(result);
        }
示例#32
0
        public void VisitMethod(QNode node)
        {
            var method = EnumResolver.ResolveNodeType(node.Type);

            switch (method)
            {
            case NodeType.OrderBy:
            case NodeType.OrderByDescending:
                var member = this.ContextField.Pop();
                var query  = this.ContextQuery.Pop();
                this.SortingRequest.Add(new KeyValuePair <Field, NodeType>(member, method));
                break;

            case NodeType.Where:
                break;

            case NodeType.Contains:
            {
                var value = string.Format("*{0}*", this.ContextValue.Pop());
                var term  = new QueryStringQuery {
                    DefaultField = this.ContextField.Pop(), Query = value
                };
                this.ContextQuery.Push(term);
            }
            break;

            case NodeType.StartsWith:
            {
                var term = new PrefixQuery {
                    Field = this.ContextField.Pop(), Value = this.ContextValue.Pop()
                };
                this.ContextQuery.Push(term);
            }
            break;

            case NodeType.EndsWith:
            {
                var value = string.Format("*{0}", this.ContextValue.Pop());
                var term  = new WildcardQuery {
                    Field = this.ContextField.Pop(), Value = value
                };
                this.ContextQuery.Push(term);
            }
            break;

            case NodeType.In:
            {
                var value = this.ContextValue.Pop() as List <string>;
                var terms = new TermsQuery {
                    Field = this.ContextField.Pop(), Terms = value
                };
                this.ContextQuery.Push(terms);
            }
            break;

            case NodeType.NotIn:
            {
                var value = this.ContextValue.Pop() as List <string>;
                var terms = !new TermsQuery {
                    Field = this.ContextField.Pop(), Terms = value
                };
                this.ContextQuery.Push(terms);
            }
            break;

            default:
                throw new NotImplementedException(method.ToString());
            }
        }
示例#33
0
        /// <summary>
        /// Run a full text search against Elasticsearch index
        /// </summary>
        /// <param name="client">The client.</param>
        /// <param name="indexMarker">The index marker.</param>
        /// <param name="queryTerm">The query term.</param>
        /// <param name="pageNo">The page no.</param>
        /// <param name="refinerList">The refiner list.</param>
        /// <returns></returns>
        private ISearchResponse <ResultsModel> PlainSearch(ElasticClient client, QueryModel query)
        {
            ISearchResponse <ResultsModel> result = null;
            // All queries need to exclude any page nodes that are not of type = dahuindexablepage
            // They have been sent incorrectly by Sitefinity and are duplicates
            // Hence we need to ensure all queries have this following clause to exclude the dupes
            //q=NOT+contentType:"Telerik.Sitefinity.Pages.Model.PageNode"%20AND%20_type:document
            QueryContainer excludeQuery1 = new TermQuery
            {
                Field = "contentType",
                Value = "Telerik.Sitefinity.Pages.Model.PageNode",
                Boost = 4
            };
            QueryContainer excludeQuery2 = new TermQuery
            {
                Field = "_type",
                Value = "document",
                Boost = 1
            };


            try
            {
                if (query.getQueryText().Equals("*"))
                {
                    result = client.Search <ResultsModel>(d => d
                                                          .Index(query.getIndexName())
                                                          .AllTypes()
                                                          .Query(q => q.MatchAll() && !(excludeQuery1 && excludeQuery2))
                                                          .Aggregations(a => a
                                                                        .Terms("siteSubsection", k => k.Field(kf => kf.SiteSubsection)
                                                                               .ExecutionHint(TermsAggregationExecutionHint.GlobalOrdinalsHash)
                                                                               .Size(0)))
                                                          .From((query.getPageNumber() - 1) * query.getPageSize())
                                                          .Size(query.getPageSize())
                                                          );
                }
                else
                {
                    var _fields = (new List <string>()
                    {
                        "title^2", "content"
                    }).ToArray();

                    QueryContainer qry = new QueryStringQuery()
                    {
                        DefaultOperator = Operator.And,
                        Query           = query.getQueryText(),
                        Fields          = _fields
                    };

                    if (query.getOptionalBoostQuery() != null)
                    {
                        QueryContainer optqry = new QueryStringQuery()
                        {
                            DefaultOperator = Operator.And,
                            Query           = query.getOptionalBoostQuery(),
                        };


                        result = client.Search <ResultsModel>(d => d
                                                              .Index(query.getIndexName())
                                                              .AllTypes()
                                                              .Query(q => q
                                                                     .Bool(b => b
                                                                           .Must((optqry || qry) && !(excludeQuery1 && excludeQuery2))
                                                                           )
                                                                     )
                                                              .Aggregations(a => a
                                                                            .Terms("siteSubsection", k => k.Field(kf => kf.SiteSubsection)
                                                                                   .ExecutionHint(TermsAggregationExecutionHint.GlobalOrdinals)
                                                                                   .Size(0)))
                                                              // Highlight the hits on matching on the content field
                                                              .Highlight(h => h
                                                                         .PreTags("<b>")
                                                                         .PostTags("</b>")
                                                                         .Fields(f => f
                                                                                 .Field(e => e.Content)
                                                                                 .ForceSource(true)
                                                                                 .PreTags("<b>")
                                                                                 .PostTags("</b>")))
                                                              .Highlight(h => h
                                                                         .PreTags("<b>")
                                                                         .PostTags("</b>")
                                                                         .Fields(f => f
                                                                                 .Field(e => e.Title)
                                                                                 .PreTags("<b>")
                                                                                 .PostTags("</b>")))
                                                              .From((query.getPageNumber() - 1) * query.getPageSize())
                                                              .Size(query.getPageSize())
                                                              );
                    }
                    else
                    {
                        result = client.Search <ResultsModel>(d => d
                                                              .Index(query.getIndexName())
                                                              .AllTypes()
                                                              .Query(q => q
                                                                     .Bool(b => b
                                                                           .Must(qry && !(excludeQuery1 && excludeQuery2))))
                                                              //q
                                                              .Aggregations(a => a
                                                                            .Terms("siteSubsection", k => k.Field(kf => kf.SiteSubsection)
                                                                                   .ExecutionHint(TermsAggregationExecutionHint.GlobalOrdinals)
                                                                                   .Size(0)))
                                                              // Highlight the hits on matching on the content field
                                                              .Highlight(h => h
                                                                         .PreTags("<b>")
                                                                         .PostTags("</b>")
                                                                         .Fields(f => f
                                                                                 .Field(e => e.Content)
                                                                                 .ForceSource(true)
                                                                                 .PreTags("<b>")
                                                                                 .PostTags("</b>")))
                                                              .Highlight(h => h
                                                                         .PreTags("<b>")
                                                                         .PostTags("</b>")
                                                                         .Fields(f => f
                                                                                 .Field(e => e.Title)
                                                                                 .PreTags("<b>")
                                                                                 .PostTags("</b>")))
                                                              .From((query.getPageNumber() - 1) * query.getPageSize())
                                                              .Size(query.getPageSize())
                                                              );
                    }
                }

                return(result);
            }
            catch (Exception ex)
            {
                string stack      = ex.StackTrace;
                string ex_message = ex.Message;
            }
            return(result);
        }
示例#34
0
        private ISearchResponse <ResultsModel> runCategoryCountSearch(ElasticClient client, QueryModel query)
        {
            QueryContainer excludeQuery1 = new TermQuery
            {
                Field = "contentType",
                Value = "Telerik.Sitefinity.Pages.Model.PageNode"
            };
            QueryContainer excludeQuery2 = new TermQuery
            {
                Field = "_type",
                Value = "document"
            };


            ISearchResponse <ResultsModel> result = null;

            try
            {
                if (query.getQueryText().Equals("*"))
                {
                    result = client.Search <ResultsModel>(d => d
                                                          .Index(query.getAlternateIndexes())
                                                          .AllTypes()
                                                          .MatchAll()
                                                          .Aggregations(a => a
                                                                        .Terms("alternate_sources", s => s.Field(sf => sf.SiteSection).ExecutionHint(TermsAggregationExecutionHint.GlobalOrdinalsHash)))
                                                          .Size(0)
                                                          );
                }
                else
                {
                    var _fields = (new List <string>()
                    {
                        "title^2", "content"
                    }).ToArray();

                    QueryContainer qry = new QueryStringQuery()
                    {
                        DefaultOperator = Operator.And,
                        Query           = query.getQueryText(),
                        Fields          = _fields
                    };

                    if (query.getOptionalBoostQuery() != null)
                    {
                        QueryContainer optqry = new QueryStringQuery()
                        {
                            DefaultOperator = Operator.And,
                            Query           = query.getOptionalBoostQuery(),
                        };

                        result = client.Search <ResultsModel>(d => d
                                                              .Index(query.getAlternateIndexes())
                                                              .AllTypes()
                                                              .Query(q => q
                                                                     .Bool(b => b
                                                                           .Must(optqry || qry)))
                                                              .Aggregations(a => a
                                                                            .Terms("alternate_sources", s => s.Field(sf => sf.SiteSection).ExecutionHint(TermsAggregationExecutionHint.GlobalOrdinals)))
                                                              .Size(0)
                                                              );
                    }
                    else
                    {
                        result = client.Search <ResultsModel>(d => d
                                                              .Index(query.getAlternateIndexes())
                                                              .AllTypes()
                                                              .Query(q => q
                                                                     .Bool(b => b
                                                                           .Must(qry)))
                                                              .Aggregations(a => a
                                                                            .Terms("alternate_sources", s => s.Field(sf => sf.SiteSection).ExecutionHint(TermsAggregationExecutionHint.GlobalOrdinals)))
                                                              .Size(0)
                                                              );
                    }
                }

                return(result);
            }
            catch (Exception ex)
            {
                string stack      = ex.StackTrace;
                string ex_message = ex.Message;
            }
            return(result);
        }
示例#35
0
        /// <summary>
        /// Search docs by keyword using query string
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="keyword"></param>
        /// <param name="indexName"></param>
        /// <param name="typeName"></param>
        /// <param name="fieldsForKeyword"></param>
        /// <param name="total"></param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="searchType"></param>
        /// <returns></returns>
        public IEnumerable <T> SearchByQueryString <T>(string keyword,
                                                       string indexName, string typeName, List <string> fieldsForKeyword,
                                                       out long total, int pageIndex = 0, int pageSize = 100, SearchTypeEnum searchType = SearchTypeEnum.IsExtract) where T : class
        {
            total = 0;

            if (!string.IsNullOrEmpty(indexName))
            {
                indexName = indexName.ToLower();
            }
            if (!string.IsNullOrEmpty(typeName))
            {
                typeName = typeName.ToLower();
            }


            var indices = Indices.Index(indexName);
            var types   = Types.Type(typeName);
            var request = new SearchRequest(indices, types)
            {
                From = pageIndex,
                Size = pageSize,
            };

            if (!string.IsNullOrEmpty(keyword))
            {
                switch (searchType)
                {
                case SearchTypeEnum.IsExtract:
                    //keyword = keyword.ToLower();
                    break;

                case SearchTypeEnum.IsLeftRelatively:
                    keyword = string.Format("*{0}", keyword);
                    break;

                case SearchTypeEnum.IsRightRelatively:
                    keyword = string.Format("{0}*", keyword);
                    break;

                case SearchTypeEnum.IsRelatively:
                    keyword = string.Format("*{0}*", keyword);
                    break;

                case SearchTypeEnum.IsFirstCharacter:
                    keyword = string.Format("?{0}", keyword);
                    break;

                case SearchTypeEnum.IsLastCharacter:
                    keyword = string.Format("{0}?", keyword);
                    break;
                }

                if (fieldsForKeyword != null && fieldsForKeyword.Count > 0)
                {
                    for (var i = 0; i < fieldsForKeyword.Count; i++)
                    {
                        fieldsForKeyword[i] = Char.ToLowerInvariant(fieldsForKeyword[i][0]) + fieldsForKeyword[i].Substring(1);
                    }

                    var queryString = new QueryStringQuery
                    {
                        Query = keyword,
                        //Fields = fieldsForKeyword.ToArray(),
                        AllowLeadingWildcard   = true,
                        LowercaseExpendedTerms = true
                    };

                    request.Query = new QueryContainer(queryString);
                }
            }
            //var sort = new List<ISort>
            //{
            //    new SortField()
            //    {

            //        Order = SortOrder.Descending
            //    }
            //};

            //request.Sort = sort;

            ISearchResponse <T> result = _client.Search <T>(request);

            if (result != null)
            {
                total = result.Total;
                return(result.Documents);
            }
            return(new List <T>());
        }
示例#36
0
        public IEnumerable <T> Search <T>(int pageIndex, int pageSize, List <string> fieldsForKeyword, string keyword,
                                          string field, DateTime from, DateTime to, string indexName, string typeName, out long total, SearchTypeEnum searchType = SearchTypeEnum.IsExtract) where T : class
        {
            total = 0;

            if (!string.IsNullOrEmpty(indexName))
            {
                indexName = indexName.ToLower();
            }
            if (!string.IsNullOrEmpty(typeName))
            {
                typeName = typeName.ToLower();
            }
            if (!string.IsNullOrEmpty(field))
            {
                field = Char.ToLowerInvariant(field[0]) + field.Substring(1);
            }

            var dateRange = new DateRangeQuery()
            {
                Field = field
            };

            if (from > DateTime.MinValue)
            {
                dateRange.GreaterThanOrEqualTo = from.ToString(FormatDate);
            }
            if (to > from)
            {
                dateRange.LessThanOrEqualTo = to.ToString(FormatDate);
            }

            var indices = Indices.Index(indexName);
            var types   = Types.Type(typeName);
            var request = new SearchRequest(indices, types)
            {
                From       = pageIndex,
                Size       = pageSize,
                PostFilter = dateRange
            };

            if (!string.IsNullOrEmpty(keyword))
            {
                switch (searchType)
                {
                case SearchTypeEnum.IsExtract:
                    keyword = keyword.ToLower();
                    break;

                case SearchTypeEnum.IsLeftRelatively:
                    keyword = string.Format("*{0}", keyword);
                    break;

                case SearchTypeEnum.IsRightRelatively:
                    keyword = string.Format("{0}*", keyword);
                    break;

                case SearchTypeEnum.IsRelatively:
                    keyword = string.Format("*{0}*", keyword);
                    break;

                case SearchTypeEnum.IsFirstCharacter:
                    keyword = string.Format("?{0}", keyword);
                    break;

                case SearchTypeEnum.IsLastCharacter:
                    keyword = string.Format("{0}?", keyword);
                    break;
                }

                if (fieldsForKeyword != null && fieldsForKeyword.Count > 0)
                {
                    for (var i = 0; i < fieldsForKeyword.Count; i++)
                    {
                        fieldsForKeyword[i] = Char.ToLowerInvariant(fieldsForKeyword[i][0]) + fieldsForKeyword[i].Substring(1);
                    }

                    var queryString = new QueryStringQuery
                    {
                        Query  = keyword.ToLower(),
                        Fields = fieldsForKeyword.ToArray(),
                        AllowLeadingWildcard   = true,
                        LowercaseExpendedTerms = true
                    };

                    request.Query = new QueryContainer(queryString);
                }
            }
            var sort = new List <ISort>
            {
                new SortField()
                {
                    Field = new Field()
                    {
                        Name = field
                    },
                    Order = SortOrder.Descending
                }
            };

            request.Sort = sort;

            ISearchResponse <T> result = _client.Search <T>(request);

            if (result != null)
            {
                total = result.Total;
                return(result.Documents);
            }
            return(new List <T>());
        }
        public static SearchRequest <ImDbBasicTitle> BuildSearchRequest(MovieSearchViewModel vm)
        {
            //1. Container for multiple query filters
            var mustClauses = new List <QueryContainer>();

            //scrub the data
            var criteria = vm.SearchCriteria;

            if (criteria == null)
            {
                criteria = "";
            }

            //make sure AND & OR are upper for query engine
            criteria = criteria.Replace(" and ", " AND ");
            criteria = criteria.Replace(" or ", " OR ");

            //limit search fields
            var fields = new List <Nest.Field>();

            if (vm.OnlyOriginalTitle)
            {
                fields.Add(new Nest.Field("originalTitle"));
            }

            //used for
            var queryStringFilter = new QueryStringQuery()
            {
                Query  = criteria,  //"toy or book"
                Fields = fields.ToArray()
            };

            //ONLY movies
            var titleTypeFilter = new MatchQuery()
            {
                Field = "titleType",
                Query = "movie"
            };



            //single record query
            if (vm.DocumentId != null && vm.DocumentId.Length > 0)
            {
                //By Id
                var idFilter = new MatchQuery()
                {
                    Field = "id",
                    Query = vm.DocumentId
                };
                //ONLY ID
                mustClauses.Add(idFilter);
            }
            else
            {
                //add google style query
                mustClauses.Add(queryStringFilter);

                //only movies filter
                if (vm.OnlyMovies)
                {
                    mustClauses.Add(titleTypeFilter);
                }
            }


            //sort fields
            var sortFields = new List <ISort>();

            sortFields.Add(new FieldSort()
            {
                Field        = "sortYear",
                Order        = SortOrder.Ascending,
                UnmappedType = FieldType.Integer,
            });


            var request = new SearchRequest <ImDbBasicTitle>()
            {
                From  = 0,
                Size  = 50, // 10000,
                Sort  = sortFields,
                Query = new BoolQuery {
                    Must = mustClauses
                }                                            //,
            };

            return(request);
        }
        public static QueryBase GetDefaultQuery(this TermNode node, IQueryVisitorContext context)
        {
            if (!(context is IElasticQueryVisitorContext elasticContext))
            {
                throw new ArgumentException("Context must be of type IElasticQueryVisitorContext", nameof(context));
            }

            QueryBase query;
            string    field         = node.Field;
            var       defaultFields = node.GetDefaultFields(elasticContext.DefaultFields);

            if (field == null && defaultFields != null && defaultFields.Length == 1)
            {
                field = defaultFields[0];
            }

            if (elasticContext.MappingResolver.IsPropertyAnalyzed(field))
            {
                var fields = !String.IsNullOrEmpty(field) ? new[] { field } : defaultFields;

                if (!node.IsQuotedTerm && node.UnescapedTerm.EndsWith("*"))
                {
                    query = new QueryStringQuery {
                        Fields = fields,
                        AllowLeadingWildcard = false,
                        AnalyzeWildcard      = true,
                        Query = node.UnescapedTerm
                    };
                }
                else
                {
                    if (fields != null && fields.Length == 1)
                    {
                        if (node.IsQuotedTerm)
                        {
                            query = new MatchPhraseQuery {
                                Field = fields[0],
                                Query = node.UnescapedTerm
                            };
                        }
                        else
                        {
                            query = new MatchQuery {
                                Field = fields[0],
                                Query = node.UnescapedTerm
                            };
                        }
                    }
                    else
                    {
                        query = new MultiMatchQuery {
                            Fields = fields,
                            Query  = node.UnescapedTerm
                        };
                        if (node.IsQuotedTerm)
                        {
                            ((MultiMatchQuery)query).Type = TextQueryType.Phrase;
                        }
                    }
                }
            }
            else
            {
                if (!node.IsQuotedTerm && node.UnescapedTerm.EndsWith("*"))
                {
                    query = new PrefixQuery {
                        Field = field,
                        Value = node.UnescapedTerm.TrimEnd('*')
                    };
                }
                else
                {
                    query = new TermQuery {
                        Field = field,
                        Value = node.UnescapedTerm
                    };
                }
            }

            return(query);
        }
示例#39
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();
        }
 public void PASS_CreateQuery_NoField()
 {
     QueryStringQuery query = new QueryStringQuery("term1 term2");
     Assert.IsNotNull(query);
     Assert.AreEqual("term1 term2", query.Query);
 }
示例#41
0
        /// <summary>
        /// Searches the specified query.
        /// </summary>
        /// <param name="query">The query.</param>
        /// <param name="searchType">Type of the search.</param>
        /// <param name="entities">The entities.</param>
        /// <param name="fieldCriteria">The field criteria.</param>
        /// <param name="size">The size.</param>
        /// <param name="from">From.</param>
        /// <param name="totalResultsAvailable">The total results available.</param>
        /// <returns></returns>
        public override List <IndexModelBase> Search(string query, SearchType searchType, List <int> entities, SearchFieldCriteria fieldCriteria, int?size, int?from, out long totalResultsAvailable)
        {
            List <IndexModelBase> documents = new List <IndexModelBase>();

            totalResultsAvailable = 0;

            if (_client != null)
            {
                ISearchResponse <dynamic> results       = null;
                List <SearchResultModel>  searchResults = new List <SearchResultModel>();

                QueryContainer queryContainer = new QueryContainer();

                // add and field constraints
                var searchDescriptor = new SearchDescriptor <dynamic>().AllIndices();

                if (entities == null || entities.Count == 0)
                {
                    searchDescriptor = searchDescriptor.AllTypes();
                }
                else
                {
                    var entityTypes = new List <string>();
                    foreach (var entityId in entities)
                    {
                        // get entities search model name
                        var entityType = new EntityTypeService(new RockContext()).Get(entityId);
                        entityTypes.Add(entityType.IndexModelType.Name.ToLower());

                        // check if this is a person model, if so we need to add two model types one for person and the other for businesses
                        // wish there was a cleaner way to do this
                        if (entityType.Guid == SystemGuid.EntityType.PERSON.AsGuid())
                        {
                            entityTypes.Add("businessindex");
                        }
                    }

                    searchDescriptor = searchDescriptor.Type(string.Join(",", entityTypes));     // todo: consider adding indexmodeltype to the entity cache
                }

                QueryContainer matchQuery = null;
                if (fieldCriteria != null && fieldCriteria.FieldValues?.Count > 0)
                {
                    foreach (var match in fieldCriteria.FieldValues)
                    {
                        if (fieldCriteria.SearchType == CriteriaSearchType.Or)
                        {
                            matchQuery |= new MatchQuery {
                                Field = match.Field, Query = match.Value, Boost = match.Boost
                            };
                        }
                        else
                        {
                            matchQuery &= new MatchQuery {
                                Field = match.Field, Query = match.Value
                            };
                        }
                    }
                }

                switch (searchType)
                {
                case SearchType.ExactMatch:
                {
                    if (!string.IsNullOrWhiteSpace(query))
                    {
                        queryContainer &= new QueryStringQuery {
                            Query = query, AnalyzeWildcard = true
                        };
                    }

                    // special logic to support emails
                    if (query.Contains("@"))
                    {
                        queryContainer |= new QueryStringQuery {
                            Query = "email:" + query, Analyzer = "whitespace"
                        };                                                                                                    // analyzer = whitespace to keep the email from being parsed into 3 variables because the @ will act as a delimitor by default
                    }

                    // special logic to support phone search
                    if (query.IsDigitsOnly())
                    {
                        queryContainer |= new QueryStringQuery {
                            Query = "phone:*" + query + "*", AnalyzeWildcard = true
                        };
                    }

                    // add a search for all the words as one single search term
                    queryContainer |= new QueryStringQuery {
                        Query = query, AnalyzeWildcard = true, PhraseSlop = 0
                    };

                    if (matchQuery != null)
                    {
                        queryContainer &= matchQuery;
                    }

                    if (size.HasValue)
                    {
                        searchDescriptor.Size(size.Value);
                    }

                    if (from.HasValue)
                    {
                        searchDescriptor.From(from.Value);
                    }

                    searchDescriptor.Query(q => queryContainer);

                    results = _client.Search <dynamic>(searchDescriptor);
                    break;
                }

                case SearchType.Fuzzy:
                {
                    results = _client.Search <dynamic>(d =>
                                                       d.AllIndices().AllTypes()
                                                       .Query(q =>
                                                              q.Fuzzy(f => f.Value(query)
                                                                      .Rewrite(RewriteMultiTerm.TopTermsN))
                                                              )
                                                       );
                    break;
                }

                case SearchType.Wildcard:
                {
                    bool enablePhraseSearch = true;

                    if (!string.IsNullOrWhiteSpace(query))
                    {
                        QueryContainer wildcardQuery = null;

                        // break each search term into a separate query and add the * to the end of each
                        var queryTerms = query.Split(' ').Select(p => p.Trim()).ToList();

                        // special logic to support emails
                        if (queryTerms.Count == 1 && query.Contains("@"))
                        {
                            wildcardQuery |= new QueryStringQuery {
                                Query = "email:*" + query + "*", Analyzer = "whitespace"
                            };
                            enablePhraseSearch = false;
                        }
                        else
                        {
                            foreach (var queryTerm in queryTerms)
                            {
                                if (!string.IsNullOrWhiteSpace(queryTerm))
                                {
                                    wildcardQuery &= new QueryStringQuery {
                                        Query = queryTerm + "*", Analyzer = "whitespace", Rewrite = RewriteMultiTerm.ScoringBoolean
                                    };                                                                                                                                             // without the rewrite all results come back with the score of 1; analyzer of whitespaces says don't fancy parse things like check-in to 'check' and 'in'
                                }
                            }

                            // add special logic to help boost last names
                            if (queryTerms.Count > 1)
                            {
                                QueryContainer nameQuery = null;
                                nameQuery &= new QueryStringQuery {
                                    Query = "lastName:" + queryTerms.Last() + "*", Analyzer = "whitespace", Boost = 30
                                };
                                nameQuery &= new QueryStringQuery {
                                    Query = "firstName:" + queryTerms.First() + "*", Analyzer = "whitespace"
                                };
                                wildcardQuery |= nameQuery;
                            }

                            // special logic to support phone search
                            if (query.IsDigitsOnly())
                            {
                                wildcardQuery |= new QueryStringQuery {
                                    Query = "phoneNumbers:*" + query, Analyzer = "whitespace"
                                };
                            }
                        }

                        queryContainer &= wildcardQuery;
                    }

                    // add a search for all the words as one single search term
                    if (enablePhraseSearch)
                    {
                        queryContainer |= new QueryStringQuery {
                            Query = query, AnalyzeWildcard = true, PhraseSlop = 0
                        };
                    }

                    if (matchQuery != null)
                    {
                        queryContainer &= matchQuery;
                    }

                    if (size.HasValue)
                    {
                        searchDescriptor.Size(size.Value);
                    }

                    if (from.HasValue)
                    {
                        searchDescriptor.From(from.Value);
                    }

                    searchDescriptor.Query(q => queryContainer);

                    var indexBoost = GlobalAttributesCache.Value("UniversalSearchIndexBoost");

                    if (indexBoost.IsNotNullOrWhiteSpace())
                    {
                        var boostItems = indexBoost.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
                        foreach (var boostItem in boostItems)
                        {
                            var boostParms = boostItem.Split(new char[] { '^' });

                            if (boostParms.Length == 2)
                            {
                                int boost = 1;
                                Int32.TryParse(boostParms[1], out boost);
                                searchDescriptor.IndicesBoost(b => b.Add(boostParms[0], boost));
                            }
                        }
                    }

                    results = _client.Search <dynamic>(searchDescriptor);
                    break;
                }
                }

                totalResultsAvailable = results.Total;

                // normalize the results to rock search results
                if (results != null)
                {
                    foreach (var hit in results.Hits)
                    {
                        IndexModelBase document = new IndexModelBase();

                        try
                        {
                            if (hit.Source != null)
                            {
                                Type indexModelType = Type.GetType($"{ ((string)((JObject)hit.Source)["indexModelType"])}, { ((string)((JObject)hit.Source)["indexModelAssembly"])}");

                                if (indexModelType != null)
                                {
                                    document = (IndexModelBase)((JObject)hit.Source).ToObject(indexModelType);   // return the source document as the derived type
                                }
                                else
                                {
                                    document = ((JObject)hit.Source).ToObject <IndexModelBase>(); // return the source document as the base type
                                }
                            }

                            if (hit.Explanation != null)
                            {
                                document["Explain"] = hit.Explanation.ToJson();
                            }

                            document.Score = hit.Score;

                            documents.Add(document);
                        }
                        catch { } // ignore if the result if an exception resulted (most likely cause is getting a result from a non-rock index)
                    }
                }
            }

            return(documents);
        }
示例#42
0
        /// <summary>
        /// 根据查询条件、排序条件分页获取索引实体集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="page"></param>
        /// <param name="row"></param>
        /// <param name="total"></param>
        /// <param name="keyword"></param>
        /// <param name="orderbys"></param>
        /// <param name="indexname"></param>
        /// <param name="strdoctype"></param>
        /// <returns></returns>
        public List <T> GetPageEntities <T>(int page, int row, out int total, string keyword = "", string[] fields = null, string[] orderbys = null, string indexname = "", string strdoctype = "") where T : class
        {
            total = 0;

            if (string.IsNullOrWhiteSpace(indexname))
            {
                indexname = this.mIndexName;
            }
            if (string.IsNullOrWhiteSpace(strdoctype))
            {
                strdoctype = this.mStrDocType;
            }

            var countRequest  = new CountRequest(indexname, strdoctype);
            var searchRequest = new SearchRequest(indexname, strdoctype);

            //RegexpQuery rq = new RegexpQuery();
            //rq.Field = "name";
            //rq.Value = string.Format(".*{0}.*", keyword);
            //rq.MaximumDeterminizedStates = 20000;
            //searchRequest.Query = rq;

            var wholeKeyword = keyword;

            keyword = String.Format("*{0}*", keyword);
            QueryContainer query = new QueryStringQuery()
            {
                Query = keyword, DefaultOperator = Operator.And
            };

            if (!string.IsNullOrEmpty(wholeKeyword))
            {
                QueryContainer wholeWordQuery = new QueryStringQuery()
                {
                    Query = wholeKeyword
                };
                query = query || wholeWordQuery;
            }

            searchRequest.Query = query;
            countRequest.Query  = searchRequest.Query;

            total = (int)this.mElasticClent.Count <T>(countRequest).Count;

            searchRequest.From = (page - 1) * row;
            searchRequest.Size = row;

            if (fields != null)
            {
                searchRequest.Source = new SourceFilter()
                {
                    Includes = fields
                };
            }

            if (orderbys != null)
            {
                searchRequest.Sort = new List <ISort>();
                for (int i = 0; i < orderbys.Length; i++)
                {
                    string[] sortArry = orderbys[0].Split(':');
                    string   filed    = sortArry[0];
                    string   order    = sortArry[1];
                    ISort    sort     = new SortField {
                        Field = filed, Order = (order.ToLower() == "asc" ? SortOrder.Ascending : SortOrder.Descending)
                    };
                    searchRequest.Sort.Add(sort);
                }
            }

            var searchResults = this.mElasticClent.Search <T>(searchRequest);

            return(searchResults.Documents.ToList <T>());
        }
示例#43
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);
        }