示例#1
0
        public void Match_prefix_phrase_query_must_transform_correclty_to_ES()
        {
            var query = new MatchPhrasePrefixQuery("headline", "Yuri M");

            Assert.IsTrue(query.Field == "headline");
            Assert.IsTrue(query.Value.ToString() == "Yuri M");

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

            Assert.IsTrue(q.Type == QueryType.MatchPhrasePrefixQuery);
            query = q as MatchPhrasePrefixQuery;
            Assert.IsTrue(query.Field == "headline");
            Assert.IsTrue(query.Value.ToString() == "Yuri M");
        }
        public IActionResult Search(string searchText)
        {
            searchText = searchText.ToUpperInvariant();

            var host               = "localhost";
            var indexName          = "products";
            var pool               = new SingleNodeConnectionPool(new Uri($"http://{host}:9200"));
            var defaultIndex       = indexName;
            var connectionSettings = new ConnectionSettings(new Uri($"http://{host}:9200"));

            connectionSettings.DefaultIndex(defaultIndex);
            connectionSettings.PrettyJson();
            connectionSettings.DisableDirectStreaming();

            var client = new ElasticClient(connectionSettings);


            var query = new MatchPhrasePrefixQuery
            {
                Field    = "name",
                Analyzer = "standard",
                Boost    = 1.1,
                Name     = "named_query",
                Query    = searchText,
                Slop     = 2,
            };

            var request = new SearchRequest(indexName)
            {
                Size  = 500,
                Query = query
            };

            var response = client.Search <Product>(request);
            var res      = response.Documents;

            return(Ok(res));
        }
示例#3
0
        /// <summary>
        /// 构建查询条件
        /// </summary>
        /// <param name="fields"></param>
        /// <returns>{item1:must,item2:should}</returns>
        public ESConditionModel BuildQueryContainer(List <ESField> fields, string analyzer)
        {
            List <QueryContainer> must    = new List <QueryContainer>(),
                                  should  = new List <QueryContainer>(),
                                  mustNot = new List <QueryContainer>();

            if (fields != null && fields.Count > 0)
            {
                foreach (var item in fields)
                {
                    QueryContainer container = null;
                    //1.数据类型辨析(暂时不做实现)
                    if (item.DataType == ESDataType.GeoPoint)
                    {
                        //switch (item.QueryType)
                        //{
                        //    case ESQueryType.Geo_Distance:
                        //        container = new GeoDistanceQuery()
                        //        {
                        //            Location = new GeoLocation(0.1, 0.2),
                        //            Distance =new Distance(),
                        //        };
                        //        break;
                        //    case ESQueryType.Geo_Polygon:
                        //        container = new GeoPolygonQuery(){
                        //         Points=,
                        //    };
                        //        break;
                        //    case ESQueryType.Geo_Bounding_Box:
                        //        container = new GeoBoundingBoxQuery()
                        //        {
                        //            BoundingBox = new BoundingBox()
                        //            {
                        //                BottomRight =,
                        //                TopLeft =,
                        //            }
                        //        };
                        //        break;
                        //}
                    }
                    else
                    {
                        switch (item.QueryType)
                        {
                        case ESQueryType.Match:
                            container = new MatchQuery()
                            {
                                Analyzer = analyzer,
                                Field    = item.Key,
                                Query    = item.Value.Item1.ToString(),
                            };
                            break;

                        case ESQueryType.All:
                            container = new MatchAllQuery()
                            {
                            };
                            break;

                        case ESQueryType.Match_Phrase:
                            container = new MatchPhraseQuery()
                            {
                                Field    = item.Key,
                                Analyzer = analyzer,
                                Query    = item.Value.Item1.ToString()
                            };
                            break;

                        case ESQueryType.Match_Phrase_Prefix:
                            container = new MatchPhrasePrefixQuery()
                            {
                                Field    = item.Key,
                                Analyzer = analyzer,
                                Query    = item.Value.ToString()
                            };
                            break;

                        case ESQueryType.Term:
                            container = new TermQuery()
                            {
                                Field = item.Key,
                                Value = item.Value.Item1
                            };
                            break;

                        case ESQueryType.Range:
                            switch (item.DataType)
                            {
                            case ESDataType.Text:
                                break;

                            case ESDataType.Number:
                                container = new NumericRangeQuery()
                                {
                                    Field = item.Key,
                                    GreaterThanOrEqualTo = Convert.ToDouble(item.Value.Item1),
                                    LessThanOrEqualTo    = Convert.ToDouble(item.Value.Item2),
                                };
                                break;

                            case ESDataType.Date:
                                container = new DateRangeQuery()
                                {
                                    Field = item.Key,
                                    GreaterThanOrEqualTo = DateMath.FromString(item.Value.Item1.ToString()),
                                    LessThanOrEqualTo    = DateMath.FromString(item.Value.Item2.ToString())
                                };
                                break;

                            default:
                                break;
                            }
                            break;
                        }
                    }
                    //2.条件类型解析
                    if (container != null)
                    {
                        switch (item.ConditionType)
                        {
                        case ESConditionType.Must:
                            must.Add(container);
                            break;

                        case ESConditionType.Should:
                            should.Add(container);
                            break;

                        case ESConditionType.MustNot:
                            mustNot.Add(container);
                            break;

                        default:
                            break;
                        }
                    }
                }
            }

            return(new ESConditionModel()
            {
                Must = must,
                Should = should,
                MustNot = mustNot
            });
        }