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)); }
/// <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 }); }