public void 多字段2() { // 评分规则: title 或 spuname,取分值最高的 + 其余字段 * 0.3 var r1 = Proxy.SearchDocAsync <IndexDataInfo>(IndexName, query: q => q.MultiMatch(mq => mq.Fields(f => f .Field(info => info.title) .Field(info => info.spuname) ).Query("手机") .TieBreaker(0.3) ) ).Result; // 评分规则: title + spuname var r2 = Proxy.SearchDocAsync <IndexDataInfo>(IndexName, query: q => q.MultiMatch(mq => mq.Fields(f => f .Field(info => info.title) .Field(info => info.spuname) ).Query("手机") .Type(TextQueryType.MostFields)// 默认为 BestFields ) ).Result; // 评分规则: 分别计算分词后的每个关键字在各个字段中的分值,每个关键字选取最大的,累加所有关键字。 var r3 = Proxy.SearchDocAsync <IndexDataInfo>(IndexName, query: q => q.MultiMatch(mq => mq.Fields(f => f .Field(info => info.title, 0.8) .Field(info => info.attachtitle, 0.3) .Field(info => info.brandname, 1) .Field(info => info.brandsname, 1) .Field(info => info.keyword, 0.8) .Field(info => info.spuname, 0.5) ).Query("手机华为4G") .Type(TextQueryType.CrossFields) .MinimumShouldMatch(MinimumShouldMatch.Percentage(100)) ) ).Result; }
public async Task <IActionResult> Get([FromForm] IFormFile File) { try { _search.Clear(); List <string[]> Names = new List <string[]>(); using (var reader = new System.IO.StreamReader(File.OpenReadStream())) { while (!reader.EndOfStream) { Names.Add(reader.ReadLine().Split(',')); } } #region Get Keys and score Dictionary <string, double> keys = new Dictionary <string, double>(); for (int i = 0; i < Names.FirstOrDefault().Count(); i++) { keys.Add(Names.FirstOrDefault().ElementAtOrDefault(i), Convert.ToDouble(Names.Skip(1).FirstOrDefault().ElementAtOrDefault(i))); } #endregion #region Add To Elastic int divarr = Names.Count() % 2 == 0 ? Names.Skip(2).Count() / 2 : (Names.Skip(2).Count() / 2) + 1; Task s = Task.Run(() => { for (int i = 2; i < divarr; i++) { _search.Add(_helper.ConvertToDynamic(Names.FirstOrDefault(), Names.ElementAtOrDefault(i))); } }); Task s1 = Task.Run(() => { for (int j = divarr; j < Names.Count(); j++) { _search.Add(_helper.ConvertToDynamic(Names.FirstOrDefault(), Names.ElementAtOrDefault(j))); } }); Task.WaitAll(new[] { s, s1 }); #endregion #region Search List <Func <QueryContainerDescriptor <dynamic>, QueryContainer> > Filter = new List <Func <QueryContainerDescriptor <dynamic>, QueryContainer> >(); ElasticServiceDDL.Model.Result UserSimilar = new ElasticServiceDDL.Model.Result() { Header = Names.FirstOrDefault() }; List <ModelInfo> modelInfos = new List <ModelInfo>(); int j = 0; for (int i = 2; i < Names.Count(); i++) { for (int countFillter = 0; countFillter < Names.FirstOrDefault().Count(); countFillter++) { Filter.Add(new Func <QueryContainerDescriptor <dynamic>, QueryContainer>( sh => sh .Match(c => c .Field(keys.ElementAtOrDefault(j).Key) .Query(Names.ElementAtOrDefault(i).ElementAtOrDefault(j++).ToString()) .MinimumShouldMatch(MinimumShouldMatch.Percentage(keys.ElementAtOrDefault(j).Value)) ) )); } j = 0; var Similar = _search.SerTestTT(Filter).Result; if (Similar.Count > 1) { modelInfos.Add(new ModelInfo { Model = _helper.ConvertToDynamic(Names.FirstOrDefault(), Names.ElementAtOrDefault(i), Similar) }); } Filter.Clear(); } #endregion UserSimilar.Model = modelInfos; return(await Task.FromResult(Ok(UserSimilar))); } catch (Exception ex) { return(BadRequest(ex.Message)); } }
private QueryContainer GetQueryContainer_Generic(QueryContainerDescriptor <T> q, string name, string value) { var q1 = q.MatchPhrase(m => m.Field(name).Query(value).Boost(10)) | q.Match(m => m.Field(name).Query(value).MinimumShouldMatch(MinimumShouldMatch.Percentage(80))); var q2 = q.MatchPhrase(m => m.Field(name).Query(value.Substring(0, 2))); return(q.DisMax(dm => dm.Queries(q1 & q2, q1))); }
public void Line438() { // tag::3cd50a789b8e1f0ebbbc53a8d7ecf656[] var searchResponse = client.Search <object>(s => s .AllIndices() .Query(q => q.Bool(b => b.Should( s => s.MultiMatch(c => c .Query("Will Smith") .Type(TextQueryType.CrossFields) .Fields(new[] { "first", "last" }) .MinimumShouldMatch(MinimumShouldMatch.Percentage(50)) ), s => s.MultiMatch(c => c .Query("Will Smith") .Type(TextQueryType.CrossFields) .Fields("*.edge") ) ) ) ) ); // end::3cd50a789b8e1f0ebbbc53a8d7ecf656[] searchResponse.MatchesExample(@"GET /_search { ""query"": { ""bool"": { ""should"": [ { ""multi_match"" : { ""query"": ""Will Smith"", ""type"": ""cross_fields"", ""fields"": [ ""first"", ""last"" ], ""minimum_should_match"": ""50%"" \<1> } }, { ""multi_match"" : { ""query"": ""Will Smith"", ""type"": ""cross_fields"", ""fields"": [ ""*.edge"" ] } } ] } } }" ); }
public static ISearchResponse <Person> Search_Scroll(SearchParam p) { /** * if p.from >= 10000, we can only use this methods to get data * p.size must be less then 10000, and the better choices are 10, 20, 50, 100, 200, 500, 1000, 2000, 5000 * */ if (p.from % p.size != 0) { throw new Exception("p.from must be integrally divided by p.size"); } var discard_count = p.from / p.size; int count = 0; ISearchResponse <Person> resp = null; resp = ESClientInst.Client.Search <Person>(s => s.Scroll("1m").Index(p.index).Type(p.type).Take(p.size) .Query(q => q.Match(m => m.Field("company.max").MinimumShouldMatch(MinimumShouldMatch.Percentage(80)).Query(p.keyword))) .Sort(sd => p.isAsc ? sd.Ascending(p.sort.ToString()) : sd.Descending(p.sort.ToString()))); string scroll_id = resp.ScrollId; while (count < discard_count && resp.Documents.Any() && scroll_id != null) { count++; resp = ESClientInst.Client.Scroll <Person>("1m", scroll_id); ESClientInst.Client.ClearScroll(cs => cs.ScrollId(scroll_id)); scroll_id = resp.ScrollId; } return(resp); }
/// <summary> /// Elastic search for the keywords entered with filter and sort parameters /// </summary> /// <typeparam name="T"></typeparam> /// <param name="query"></param> /// <param name="pageNum"></param> /// <param name="sortField"></param> /// <param name="filter"></param> /// <returns></returns> public ISearchResponse <T> ElasticSearch <T>(string query, int pageNum = 0, string sortField = "", string filter = "") where T : class { var startIndex = 10 * (pageNum - 1); ISearchResponse <Document> searchResults; if (string.IsNullOrEmpty(filter)) { searchResults = this.ElasticClient.Search <Document>(s => s.From(startIndex).Size(10).Query(q => q.Bool(b => b .Must(sh => sh .MultiMatch(mp => mp .Query(query).MinimumShouldMatch(MinimumShouldMatch.Percentage(50)) .Fields(f => f.Field(f1 => f1.Attachment.Content).Field(f1 => f1.Author).Field(f1 => f1.Title).Field(f1 => f1.Location).Field(f1 => f1.CompanyName).Field(f1 => f1.SectorName).Field(f1 => f1.RegionName).Field(f1 => f1.Country)))) .Should(sh => sh .MultiMatch(mp => mp .Query(query).Type(TextQueryType.Phrase).Slop(50).MinimumShouldMatch(MinimumShouldMatch.Percentage(75)) .Fields(f => f.Field(f1 => f1.Attachment.Content).Field(f1 => f1.Author).Field(f1 => f1.Title).Field(f1 => f1.Location).Field(f1 => f1.CompanyName).Field(f1 => f1.SectorName).Field(f1 => f1.RegionName).Field(f1 => f1.Country)))) )) //.Query(q => q.Bool(b => b //.Should(sh => sh //.MultiMatch(mp => mp //.Query(query) //.Fields(f => f.Field(f1 => f1.Attachment.Content).Field(f1 => f1.Author).Field(f1 => f1.Title).Field(f1 => f1.Location).Field(f1 => f1.CompanyName)))))) .Sort(so => so.Field(fi => SortFromUserInput(fi, sortField))) //.Scroll("1m") //.Fields(f => f.Fields(f1 => f1.Attachment.Content, f2 => f2.Title, f4=>f4.Author, f5=>f5.CompanyName, f6=>f6.DateOfMeeting, f7=>f7.UploadDate)))).Sort(so=>so.Field(fi=>SortFromUserInput(fi,""))) //.Scroll("1m") .Highlight(h => h.PreTags("<b style='color:orange'>") .PostTags("</b>") .Fields ( //f=>f.Field("*").FragmentSize(150).NumberOfFragments(3) f => f.Field(e => e.Attachment.Content).FragmentSize(150).NumberOfFragments(3).NoMatchSize(50) , f => f.Field(e => e.Title).FragmentSize(100).NumberOfFragments(2) , f => f.Field(e => e.Author).FragmentSize(50).NumberOfFragments(2) , f => f.Field(e => e.Location).FragmentSize(50).NumberOfFragments(2) , f => f.Field(e => e.DateOfMeeting) , f => f.Field(e => e.UploadDate) , f => f.Field(e => e.CompanyName) , f => f.Field(e => e.SectorName) , f => f.Field(e => e.RegionName) //.Field(e => e.Attachment.T) ) ) ); } else { var filArr = filter.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); var filters = new List <Func <QueryContainerDescriptor <Document>, QueryContainer> >(); if (filArr[0] == "SEC") { filters.Add(f => f.Terms(t => t.Field(f1 => f1.SectorCode).Terms(filArr[1]))); } if (filArr[0] == "COU") { filters.Add(f => f.Terms(t => t.Field(f1 => f1.RegionCode).Terms(filArr[1]))); } searchResults = this.ElasticClient.Search <Document>(s => s.From(startIndex).Size(10).Query(q => q.Bool(b => b .Must(sh => sh .MultiMatch(mp => mp .Query(query).MinimumShouldMatch(MinimumShouldMatch.Percentage(50)) .Fields(f => f.Field(f1 => f1.Attachment.Content).Field(f1 => f1.Author).Field(f1 => f1.Title).Field(f1 => f1.Location).Field(f1 => f1.CompanyName).Field(f1 => f1.SectorName).Field(f1 => f1.RegionName).Field(f1 => f1.Country)))) .Should(sh => sh .MultiMatch(mp => mp .Query(query).Type(TextQueryType.Phrase).Slop(50).MinimumShouldMatch(MinimumShouldMatch.Percentage(75)) .Fields(f => f.Field(f1 => f1.Attachment.Content).Field(f1 => f1.Author).Field(f1 => f1.Title).Field(f1 => f1.Location).Field(f1 => f1.CompanyName).Field(f1 => f1.SectorName).Field(f1 => f1.RegionName).Field(f1 => f1.Country)))) .Filter(filters) )) //.Query(q => q.Bool(b => b //.Should(sh => sh //.MultiMatch(mp => mp //.Query(query) //.Fields(f => f.Field(f1 => f1.Attachment.Content).Field(f1 => f1.Author).Field(f1 => f1.Title).Field(f1 => f1.Location).Field(f1 => f1.CompanyName)))))) .Sort(so => so.Field(fi => SortFromUserInput(fi, sortField))) //.Scroll("1m") //.Fields(f => f.Fields(f1 => f1.Attachment.Content, f2 => f2.Title, f4=>f4.Author, f5=>f5.CompanyName, f6=>f6.DateOfMeeting, f7=>f7.UploadDate)))).Sort(so=>so.Field(fi=>SortFromUserInput(fi,""))) //.Scroll("1m") .Highlight(h => h.PreTags("<b style='color:orange'>") .PostTags("</b>") .Fields ( //f=>f.Field("*").FragmentSize(150).NumberOfFragments(3) f => f.Field(e => e.Attachment.Content).FragmentSize(150).NumberOfFragments(3).NoMatchSize(50) , f => f.Field(e => e.Title).FragmentSize(100).NumberOfFragments(2) , f => f.Field(e => e.Author).FragmentSize(50).NumberOfFragments(2) , f => f.Field(e => e.Location).FragmentSize(50).NumberOfFragments(2) , f => f.Field(e => e.DateOfMeeting) , f => f.Field(e => e.UploadDate) , f => f.Field(e => e.CompanyName) //.Field(e => e.Attachment.T) ) ) ); } // this.ElasticClient.Search<Document>(s => s //.Query(q => q // .Match(c => c // .Field(p => p.ABC) // .Query(keyz) // ) // || q.Match(c => c // .Field(p => p.XYZ) // .Query(keyz) // ) //) //); //var highlights = searchResults.Hits.Select(h => h.Highlights.Values.Select(v => string.Join(",", v.Highlights))); //foreach (var highlight in highlights) //{ // Console.WriteLine(highlight.FirstOrDefault()); //} //return highlights; //var results = this.ElasticClient.Scroll<Document>("2m", searchResults.ScrollId); //while (results.Documents.Any()) //{ // foreach (var doc in results.Fields) // { // //indexedList.Add(doc.Value<string>("propertyName")); // } // searchResults.Documents.ToList().AddRange(results.Documents.ToList()); // results = this.ElasticClient.Scroll<Document>("2m", results.ScrollId); //} return((ISearchResponse <T>)searchResults); }
private static Func <QueryContainerDescriptor <TIndexItem>, QueryContainer> WildcardTextSearch(string searchText, Collection <TextSearchField <TIndexItem> > textSearchFields = null) { textSearchFields ??= new Collection <TextSearchField <TIndexItem> > { new TextSearchField <TIndexItem> { Field = search => ElasticSearchExtensions.GetField <TIndexItem>("Name") } }; var queries = new Collection <Func <QueryContainerDescriptor <TIndexItem>, QueryContainer> >(); foreach (var field in textSearchFields) { Func <QueryContainerDescriptor <TIndexItem>, QueryContainer> stringQuerySelector; if (field.Strict) { stringQuerySelector = MatchExactValue(field); } else { queries.Add(MatchExactValue(field)); stringQuerySelector = q => q.MultiMatch(MultiMatchQuerySelector(field.Field)); } if (field.Path == null) { queries.Add(stringQuerySelector); } else { QueryContainer NestedQuery(QueryContainerDescriptor <TIndexItem> q) => q .Nested(n => n .Path(field.Path) .Query(stringQuerySelector) ); queries.Add(NestedQuery); } } return(descriptor => descriptor.Bool(b => b.Should(queries))); Func <MultiMatchQueryDescriptor <TIndexItem>, IMultiMatchQuery> MultiMatchQuerySelector(Expression <Func <TIndexItem, Field> > field) { return(m => m .Query(searchText) .Boost(0.7) .Fields(f => f .Field(ff => field) .Field("*.ngram") ) .Lenient() .MinimumShouldMatch(MinimumShouldMatch.Percentage(80)) .TieBreaker(0.1) .Type(TextQueryType.BestFields) .Operator(Operator.And)); } Func <QueryContainerDescriptor <TIndexItem>, QueryContainer> MatchExactValue(TextSearchField <TIndexItem> field) { return(q => q.QueryString(q1 => q1 .Query(searchText) .Boost(1.1) .Fields(field.Field) .Analyzer("keyword_analyzer") .DefaultOperator(Operator.And) .TieBreaker(0.1) .QuoteFieldSuffix("") .Rewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(5)) .Lenient() .Escape() )); } }
//public static ElasticClient Client_Get() => new ElasticClient(new ConnectionSettings(new StaticConnectionPool(DataBus.ES_5_0_Uris))); #endregion #region auxiliary methods /// <summary> /// Create a unicode-query function /// </summary> /// <typeparam name="T"></typeparam> /// <param name="keyword"></param> /// <param name="fields"></param> /// <returns></returns> private static Func <QueryContainerDescriptor <T>, QueryContainer> UQuery_Create <T>(string keyword, IList <ES_Field> fields) where T : class => q => fields.Select( f => f.ana == Analyzer.Term ? q.Term(t => t.Field(f.name).Value(keyword).Boost(f.boost)) : (q.MatchPhrase(m => m.Field(f.name).Query(keyword).Boost(f.boost).MinimumShouldMatch(MinimumShouldMatch.Percentage(90)).CutoffFrequency(0.001).Slop(2)) | q.Match(m => m.Field(f.name).Query(keyword).Slop(2).MinimumShouldMatch(MinimumShouldMatch.Percentage(90)))) ).Aggregate((a, b) => a | b);
public async Task MultiMatch() { var lookingFor = "jp morgan"; var searchResponse = await ElasticClient().SearchAsync <Branch>(s => s .Query(q => q.MultiMatch(mm => mm .Query(lookingFor) //show minimum should match .MinimumShouldMatch(MinimumShouldMatch.Percentage(100.0)) .Fields(f => f .Fields(ff => ff.LocationName, ff => ff.LocationContact))))); searchResponse.IsValid.ShouldBe(true); }