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); }
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); }
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)); } } } }
/// <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()); }
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); }
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); }
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)); }
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); } }
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() { }; }
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 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 }; }
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; }
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); }
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 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; }
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); }
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; }
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); }
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); }
public int GetCountByTrack(SearchCondition sc) { int count = 0; string indexname = ConfigurationManager.AppSettings["CRMIndex"].ToString(); string typename = ConfigurationManager.AppSettings["CRMMemberType"].ToString(); string ctype = ConfigurationManager.AppSettings["CRMMTrackType"].ToString(); if (string.IsNullOrEmpty(sc.field)) { sc.field = "mtmemo"; } string classVaule = ""; if (string.IsNullOrEmpty(sc.classx)) { sc.classx = ""; } else { sc.classx = sc.classx.ToLower(); classVaule = "1"; } var searchResults = Connect.GetSearchClient().Count<Member>(s => s .Index(indexname) .Type(typename) .Query(q => q .Bool(b => b .Must( #region 不行留用 m => m.HasChild<MemberTrack>(h => h.Type(ctype).Query(qu => { List<QueryContainer> mustquery = new List<QueryContainer>(); foreach (string str in sc.keywords) { QueryContainer termQuery = new QueryStringQuery() { DefaultField = sc.field.ToLower(), Query = str, DefaultOperator = Operator.And }; mustquery.Add(termQuery); } QueryContainer boolQuery = new BoolQuery() { Must = mustquery }; return boolQuery; }) ), #endregion //m => m.HasChild<MemberTrack>(h => h.Type(ctype).Query(qu => qu.Prefix(mt => mt.OnField(sc.field.ToLower()).Value(sc.keyword)))), m => m.Bool(bl => bl.Must( mu => mu.Wildcard(mt => mt.OnField("country").Value(Convert.ToString(string.IsNullOrEmpty(sc.country) ? "" : string.Format("*{0}*", sc.country)))), mu => mu.Wildcard(mt => mt.OnField("province").Value(Convert.ToString(string.IsNullOrEmpty(sc.province) ? "" : string.Format("*{0}*", sc.province)))), mu => mu.Wildcard(mt => mt.OnField("city").Value(Convert.ToString(string.IsNullOrEmpty(sc.city) ? "" : string.Format("*{0}*", sc.city)))), mu => mu.Wildcard(mt => mt.OnField("address").Value(Convert.ToString(string.IsNullOrEmpty(sc.address) ? "" : string.Format("*{0}*", sc.address)))), mu => mu.Wildcard(mt => mt.OnField("memo").Value(Convert.ToString(string.IsNullOrEmpty(sc.memo) ? "" : string.Format("*{0}*", sc.memo)))), mu => mu.Match(mt => mt.OnField("tracktypeid").Query(Convert.ToString(sc.tracktype))), mu => mu.Match(mt => mt.OnField("aftersalesid").Query(Convert.ToString(sc.aftersales))), mu => mu.Match(mt => mt.OnField(sc.classx).Query(classVaule)) ) ) ) )) ); count = (int)searchResults.Count; return count; }
/// <summary> /// 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); }
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()); } }
/// <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); }
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); }
/// <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>()); }
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); }
/// <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); }
/// <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); }
/// <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>()); }
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); }