コード例 #1
0
        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;
        }
コード例 #2
0
        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));
            }
        }
コード例 #3
0
ファイル: Reader.cs プロジェクト: gaoshoufenmu/Mixture
        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)));
        }
コード例 #4
0
        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"" ]
			          }
			        }
			      ]
			    }
			  }
			}"            );
        }
コード例 #5
0
ファイル: ESReader.cs プロジェクト: gaoshoufenmu/NoSqlDemo
        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);
        }
コード例 #6
0
        /// <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);
        }
コード例 #7
0
        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()
                                          ));
            }
        }
コード例 #8
0
ファイル: ES_Client.cs プロジェクト: Violet-Liu/Learn
        //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);
コード例 #9
0
        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);
        }