示例#1
0
        public List <OfferDetails> GetByAnyFieldKeywords(string keywords, int categoryId, int userId)
        {
            string[] args = keywords.Split(',');

            QueryContainer qc = new QueryContainer();
            BoolQuery      bq = new BoolQuery();

            foreach (var VARIABLE in args)
            {
                qc &= new MultiMatchQuery()
                {
                    Fields   = "*",
                    Query    = VARIABLE,
                    Operator = Operator.Or
                };
            }

            bq = new BoolQuery()
            {
                Must = new[] { qc }
            };

            string indexName = $"{userId}_cat{categoryId}";

            if (userId == 1)
            {
                indexName = "offer_details";
            }

            SearchRequest request = new SearchRequest <OfferDetails>(indexName)
            {
                Size  = 100,
                Query = bq
            };
            IRequestConfiguration conf = new RequestConfiguration();

            conf.Headers = new System.Collections.Specialized.NameValueCollection();
            conf.Headers.Add(new System.Collections.Specialized.NameValueCollection()
            {
                {
                    "authorization", "opnsdgsd353sapgqejpg"
                },
                {
                    "http_authorization", "opnsdgsd353sapgqejpg"
                }
            });
            request.RequestConfiguration = conf;
            var k = client.Search <OfferDetails>(request);

            for (int x = 0;
                 x < k.Documents.Count;
                 x++)
            {
                k.Documents.ElementAt(x).Id = k.Hits.ElementAt(x).Source.Id;
            }

            var json = client.RequestResponseSerializer.SerializeToString(request);

            return(k.Documents.ToList());
        }
示例#2
0
        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);
        }
示例#3
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));
                    }
                }
            }
        }
        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))
            });
        }
示例#5
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));
        }
示例#8
0
        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));
        }
示例#9
0
        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);
        }
示例#10
0
        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);
        }
示例#11
0
        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);
        }
示例#12
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));
        }
示例#13
0
        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);
        }
示例#14
0
        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);
        }
示例#16
0
 protected override IQuery Expand(MultiMatchQuery query)
 {
     return(new BoolQuery()
            .Must(query)
            .Should(new MatchPhraseQuery(Field, query.Query, Slop)));
 }
示例#17
0
        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);
        }
示例#19
0
 protected abstract IQuery Expand(MultiMatchQuery query);