public List <OfferDetails> GetByAnyFieldKeywords(string keywords, int categoryId, int userId) { string[] args = keywords.Split(','); QueryContainer qc = new QueryContainer(); BoolQuery bq = new BoolQuery(); foreach (var VARIABLE in args) { qc &= new MultiMatchQuery() { Fields = "*", Query = VARIABLE, Operator = Operator.Or }; } bq = new BoolQuery() { Must = new[] { qc } }; string indexName = $"{userId}_cat{categoryId}"; if (userId == 1) { indexName = "offer_details"; } SearchRequest request = new SearchRequest <OfferDetails>(indexName) { Size = 100, Query = bq }; IRequestConfiguration conf = new RequestConfiguration(); conf.Headers = new System.Collections.Specialized.NameValueCollection(); conf.Headers.Add(new System.Collections.Specialized.NameValueCollection() { { "authorization", "opnsdgsd353sapgqejpg" }, { "http_authorization", "opnsdgsd353sapgqejpg" } }); request.RequestConfiguration = conf; var k = client.Search <OfferDetails>(request); for (int x = 0; x < k.Documents.Count; x++) { k.Documents.ElementAt(x).Id = k.Hits.ElementAt(x).Source.Id; } var json = client.RequestResponseSerializer.SerializeToString(request); return(k.Documents.ToList()); }
private static QueryContainer GetQuery(SearchRequest request) { QueryContainer result = null; if (!string.IsNullOrEmpty(request?.SearchKeywords)) { var keywords = request.SearchKeywords; var fields = request.SearchFields?.Select(ElasticSearchHelper.ToElasticFieldName).ToArray() ?? new[] { "_all" }; var multiMatch = new MultiMatchQuery { Fields = fields, Query = keywords, Analyzer = "standard", Operator = Operator.And, }; if (request.IsFuzzySearch) { multiMatch.Fuzziness = request.Fuzziness != null?Fuzziness.EditDistance(request.Fuzziness.Value) : Fuzziness.Auto; } result = multiMatch; } return(result); }
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)); } } } }
public SearchResult <Post> SearchByCategory(string query, IEnumerable <string> tags, int page = 1, int pageSize = 10) { var fieldQuery = new MultiMatchQuery { Query = query, Fields = new[] { Infer.Field <Post>(p => p.Title), Infer.Field <Post>(p => p.Body), Infer.Field <Post>(p => p.Tags) }, Fuzziness = Fuzziness.EditDistance(1) }; var categoryFilter = new BoolQuery { Must = new QueryContainer[] { new TermsQuery { Field = Infer.Field <Post>(p => p.Tags), Terms = tags } } }; var searchRequest = new SearchRequest { From = page - 1, Size = pageSize, Query = new BoolQuery { Must = new QueryContainer[] { fieldQuery }, Filter = new QueryContainer[] { categoryFilter } }, Aggregations = new TermsAggregation("by_tags") { Field = Infer.Field <Post>(p => p.Tags), Size = 10 } }; var result = _client.Search <Post>(searchRequest); return(new SearchResult <Post> { Total = (int)result.Total, Page = page, Results = result.Hits.Select(hit => new SearchResultItem <Post>(hit.Source, hit.Score)), ElapsedMilliseconds = result.Took, AggregationsByTags = result.Aggs.Terms("by_tags").Buckets.ToDictionary(x => x.Key, y => y.DocCount.GetValueOrDefault(0)) }); }
public Tuple <string, List <BoardGame> > QueryData_CombinedStructured(string query) { _elasticClient.Flush("boardgames"); var queryContainer = new QueryContainer(); queryContainer &= new MultiMatchQuery() { Fields = new Field[] { Infer.Field <BoardGame>(b => b.Title), Infer.Field <BoardGame>(b => b.Description) }, Type = TextQueryType.MostFields, Query = query, Fuzziness = Fuzziness.Auto }; queryContainer &= new NumericRangeQuery { Field = Infer.Field <BoardGame>(ff => ff.PlayingTime), LessThan = 60, }; var searchRequest = new SearchRequest("boardgames", typeof(BoardGame)) { Query = queryContainer, }; var searchResponse = _elasticClient.Search <BoardGame>(searchRequest); return(new Tuple <string, List <BoardGame> >( searchResponse.DebugInformation, searchResponse.Documents.ToList() )); }
protected override IQuery Expand(MultiMatchQuery query) { return(new BoolQuery() .Must(query) .Should(new IQuery[] { new MultiMatchQuery(query.Query, query.Fields, MultiMatchType.Phrase), new MultiMatchQuery(query.Query, query.Fields, query.MatchType, true) })); }
/// <summary> /// 多字段匹配词条 /// </summary> /// <param name="value">值</param> /// <param name="expressions">字段表达式列表</param> public EsQuery <TResult> MultiMatch(string value, params Expression <Func <TResult, object> >[] expressions) { var condition = new MultiMatchQuery { Fields = CreateFields(expressions), Query = value }; return(And(condition)); }
public override ISearchResults Search(string searchText, int maxResults = 500) { var query = new MultiMatchQuery { Query = searchText, Analyzer = "standard", Slop = 2, Type = TextQueryType.Phrase }; return(new ElasticSearchSearchResults(_client.Value, query, indexAlias, _sortFields, maxResults)); }
public static QueryContainer MakeMultiMatchQuery(string query, string[] fields, int fuzziness = 1) { QueryContainer multiMatchQuery = new MultiMatchQuery { Query = query, Fields = fields, Fuzziness = Fuzziness.EditDistance(fuzziness) }; return(multiMatchQuery); }
internal static QueryContainer BuildQuery <T>(QueryInfo <T> info) where T : class { QueryContainer notQuery = null; QueryContainer andQuery = null; QueryContainer orQuery = null; foreach (var field in info.Fields) { QueryContainer mquery; if (field.MultiFields != null) { mquery = new MultiMatchQuery { Fields = field.MultiFields, Query = field.Value.ToString() }; } else { mquery = QueryItem(field.Field, field.Value, field.QueryType, field.Nested, field.Boost); } switch (field.Operator) { case EnQueryOperator.Must: andQuery &= mquery; break; case EnQueryOperator.Not: notQuery &= !mquery; break; default: orQuery |= mquery; break; } } var returnQuery = new QueryContainer(new BoolQuery { Must = new QueryContainer[] { andQuery }, Should = new QueryContainer[] { orQuery }, MustNot = new QueryContainer[] { notQuery } }); return(returnQuery); }
public void Multi_match_query_must_transform_correclty_to_ES() { var query = new MultiMatchQuery("Yuri Metelkin", new string[] { "head", "body" }, MultiMatchType.MostFields, true, 0.3); Assert.IsTrue(query.Query == "Yuri Metelkin"); Assert.IsTrue(query.MatchType == MultiMatchType.MostFields); Assert.IsTrue(query.IsAnd); Assert.IsTrue(query.Fields[0] == "head"); Assert.IsTrue(query.Fields[1] == "body"); Assert.IsTrue(query.TieBreaker == 0.3); string json = query.ToString(); var jo = JsonObject.Parse(json); var q = jo.ToQuery(); Assert.IsTrue(q.Type == QueryType.MultiMatchQuery); query = q as MultiMatchQuery; Assert.IsTrue(query.Query == "Yuri Metelkin"); Assert.IsTrue(query.MatchType == MultiMatchType.MostFields); Assert.IsTrue(query.IsAnd); Assert.IsTrue(query.Fields[0] == "head"); Assert.IsTrue(query.Fields[1] == "body"); Assert.IsTrue(query.TieBreaker == 0.3); query = new MultiMatchQuery("Yuri Metelkin", new string[] { "head", "body" }); Assert.IsTrue(query.Query == "Yuri Metelkin"); Assert.IsTrue(query.MatchType == MultiMatchType.BestFields); Assert.IsFalse(query.IsAnd); Assert.IsTrue(query.Fields[0] == "head"); Assert.IsTrue(query.Fields[1] == "body"); Assert.IsTrue(query.TieBreaker == 0); json = query.ToString(); jo = JsonObject.Parse(json); q = jo.ToQuery(); Assert.IsTrue(q.Type == QueryType.MultiMatchQuery); query = q as MultiMatchQuery; Assert.IsTrue(query.Query == "Yuri Metelkin"); Assert.IsTrue(query.MatchType == MultiMatchType.BestFields); Assert.IsFalse(query.IsAnd); Assert.IsTrue(query.Fields[0] == "head"); Assert.IsTrue(query.Fields[1] == "body"); Assert.IsTrue(query.TieBreaker == 0); }
private static IQuery Transform(MultiMatchQuery 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)); } if (sqsq) { return(new SimpleQueryStringQuery(qs.ToString(), query.Fields, query.IsAnd)); } return(qe == null ? query : qe.Expand(query)); }
public List <Race> SearchRaceConditions(string fields, string queryValue) { var client = SetupElasticSearch(); var query = new MultiMatchQuery { Fields = fields, Query = queryValue, Operator = Operator.Or }; var response = client.Search <Race>(new SearchRequest { Query = query }); var races = response.Documents.ToList(); return(races); }
public void SearchDoc_MultiMatch(ElasticClient client) { var multiMatchQuery = new MultiMatchQuery { Fields = Infer.Field <Product>(p => p.Description).And("name"), Query = "dog", Analyzer = "standard", Boost = 1.1, Slop = 2, Fuzziness = Fuzziness.Auto, PrefixLength = 2, MaxExpansions = 2, Operator = Operator.Or, MinimumShouldMatch = 2, FuzzyRewrite = MultiTermQueryRewrite.ConstantScoreBoolean, TieBreaker = 1.1, CutoffFrequency = 0.001, Lenient = true, ZeroTermsQuery = ZeroTermsQuery.All, Name = "named_query" }; var searchRequest = new SearchRequest <Product>(Indices.Parse("esdemo"), Types.Parse("product")) { From = 0, Size = 10, Query = multiMatchQuery }; var searchResponse = client.Search <Product>(searchRequest); var list = searchResponse.Documents.ToList(); var count = searchResponse.Total; System.Console.WriteLine("MultiMatchQuery"); System.Console.WriteLine(list.ToJsonString()); System.Console.WriteLine(count); }
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); }
protected override IQuery Expand(MultiMatchQuery query) { return(new BoolQuery() .Must(query) .Should(new MatchPhraseQuery(Field, query.Query, Slop))); }
public IActionResult Search([FromBody] Requests.SearchRequest request) { var sfConfig = new Dictionary <string, int>() { { "title", 10 }, { "code", 20 }, { "target", 2 } }; var splitTexts = request.SearchText.Split(' '); var query = new QueryContainer(); var titleField = Infer.Field <MyIndexDocument>(p => p.Title, 4); var bodyField = Infer.Field <MyIndexDocument>(p => p.Code, 10); var targetField = Infer.Field <MyIndexDocument>(p => p.Target, 2); query |= new MultiMatchQuery { Fields = titleField.And(bodyField).And(targetField), Query = request.SearchText }; query |= new QueryStringQuery { Query = $"\"{request.SearchText}\"", Boost = 50 }; var functions = new List <IScoreFunction>(); foreach (var item in sfConfig) { foreach (var text in splitTexts) { functions.Add(new WeightFunction { Filter = new MatchQuery { Field = item.Key, Query = text }, Weight = item.Value }); } } var fsQuery = new FunctionScoreQuery() { Name = "named_query", Boost = 1.1, Query = query, BoostMode = FunctionBoostMode.Sum, ScoreMode = FunctionScoreMode.Sum, MinScore = 1.0, Functions = functions }; var searchDescriptor = new SearchDescriptor <MyIndexDocument>() .Index("my-index") .Query(q => q.FunctionScore(fs => fsQuery)) .Explain(); var json = _elasticClient.RequestResponseSerializer.SerializeToString(searchDescriptor); var result = _elasticClient.Search <MyIndexDocument>(searchDescriptor); return(Ok(result.Documents)); }
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); }
protected abstract IQuery Expand(MultiMatchQuery query);