Exemple #1
0
        /// <summary>按多个完全匹配条件搜索</summary>
        public virtual async Task <MatchResult[]> MatchManyAsync(MatchRequest[] requests)
        {
            var _provider = new SearchProvider <Metadata>();
            MultiSearchDescriptor multiSearchDescriptor = new MultiSearchDescriptor();

            for (int i = 0; i < requests.Length; i++)
            {
                var request     = requests[i];
                var filterQuery = _provider.BuildFilterQuery(request.Filter);
                var sort        = _provider.BuildSort(request.Sort);

                var fields = _provider.BuildFields(request.Fields);

                var from = 0;
                var size = request.Top;

                var searchDescriptor = _esAccess.BuildSearchDescriptor(filterQuery, sort, fields, null, from, size);
                multiSearchDescriptor.Search <Metadata>("search" + i, s => searchDescriptor);
            }

            List <MatchResult> result = new List <MatchResult>();
            var searchResponse        = await _esAccess.MultiSearch(multiSearchDescriptor);

            foreach (var responseItem in searchResponse.AllResponses)
            {
                var metadata = responseItem as ISearchResponse <Metadata>;
                if (metadata != null)
                {
                    result.Add(metadata.ToMetadataCollection <MatchResult>());
                }
                ;
            }
            return(await Task.FromResult(result.ToArray()));
        }
        public static IEnumerable<QueryResponse<JsonObject>> Do(IElasticClient client)
        {
            var d = new MultiSearchDescriptor();

            d.Search<JsonObject>(s => s.Index("entities")
                .Type("locations")
                .ConcreteTypeSelector((o, hit) => typeof (JsonObject))
                .FacetQuery("one", q => q.QueryString(a => a.Query("parentId:59791")))
                .FacetQuery("two", q => q.QueryString(a => a.Query("parentId:7309"))));

            d.Search<JsonObject>(s => s.Index("entities")
                .Type("locations")
                .ConcreteTypeSelector((o, hit) => typeof (JsonObject))
                .FacetQuery("facetName", q => q.QueryString(a => a.Query("parentId:7309"))));

            d.Search<JsonObject>(s => s.Index("entities")
                .Type("locations")
                .ConcreteTypeSelector((o, hit) => typeof (JsonObject))
                .FacetQuery("facetName", q => q.QueryString(a => a.Query("parentId:12711"))));

            d.Search<JsonObject>(s => s.Index("entities")
                .Type("locations")
                .ConcreteTypeSelector((o, hit) => typeof (JsonObject))
                .FacetQuery("facetName", q => q.QueryString(a => a.Query("parentId:60068"))));

            var b = client.MultiSearch(d);

            return b.GetResponses<JsonObject>();
        }
        public Dictionary <string, List <string> > GetExistsForQueries(Dictionary <string, string> queries, List <string> ids)
        {
            if (ids == null)
            {
                throw new Exception("Ids must not be null!");
            }
            var queryContDesc = new QueryContainerDescriptor <DocumentElastic>();
            var msDesc        = new MultiSearchDescriptor();

            foreach (var queryKvp in queries)
            {
                var queryContainers = new List <QueryContainer>();
                queryContainers.Add(queryContDesc.Ids(i => i.Values(ids)));
                queryContainers.Add(queryContDesc.QueryString(q => q.Query(queryKvp.Value)));

                var sdesc = new SearchDescriptor <DocumentElastic>();
                sdesc.Query(q => q.Bool(b => b.Must(queryContainers.ToArray())));
                sdesc.Size(ids.Count);

                msDesc.Search <DocumentElastic>(queryKvp.Key, s => sdesc);
            }
            var resp = Client.MultiSearch(ms => msDesc);

            ResponseValidator(resp);
            return(queries.Keys.ToDictionary(q => q, q => resp.GetResponse <DocumentElastic>(q).Hits.Select(h => h.Id).ToList()));
        }
Exemple #4
0
 private IMultiSearchRequest GetMultiSearch(MultiSearchDescriptor ms, List <string> names, string index)
 {
     foreach (var n in names)
     {
         ms.Search <familyname>(n, s => s.Index(index).Type(nameof(familyname)).Size(2).Query(q => q.Bool(b => b.Filter(f => f.Term(t => t.Field("member").Value(n))))));
     }
     return(ms);
 }
Exemple #5
0
 public void Build(MultiSearchDescriptor descriptor)
 {
     descriptor.Search <Sentence>(_key, m => m
                                  .Sort(sort => sort.Ascending(f => f.Moniker))
                                  .Size(1000)
                                  .Query(query => query
                                         .Bool(bo => bo.Must(
                                                   mu => mu.TermRange(r => r.Field(fi => fi.Moniker).GreaterThan(_moniker)),
                                                   mu => mu.Term(te => te.Field(fi => fi.ChannelId).Value(_channelId))
                                                   ))
                                         )
                                  );
 }
        public MultiSearchResponse MultiSearch(MultiSearchDescriptor multiSearchDescriptor)
        {
            multiSearchDescriptor.ThrowIfNull("multiSearchDescriptor");
            var sb = new StringBuilder();

            foreach (var operation in multiSearchDescriptor._Operations.Values)
            {
                var indeces = operation._Indices.HasAny() ? string.Join(",", operation._Indices) : null;
                if (operation._AllIndices)
                    indeces = "_all";

                var index = indeces ??
                            multiSearchDescriptor._FixedIndex ??
                            new IndexNameResolver(this.Settings).GetIndexForType(operation._ClrType);

                var types = operation._Types.HasAny() ? string.Join(",", operation._Types) : null;

                var typeName = types
                               ?? multiSearchDescriptor._FixedType
                               ?? new TypeNameResolver().GetTypeNameForType(operation._ClrType);
                if (operation._AllTypes)
                    typeName = null; //force empty typename so we'll query all types.

                var op = new { index = index, type = typeName, search_type = this.GetSearchType(operation), preference = operation._Preference, routing = operation._Routing };
                var opJson = JsonConvert.SerializeObject(op, Formatting.None, IndexSerializationSettings);

                var action = "{0}\n".F(opJson);
                sb.Append(action);
                var searchJson = JsonConvert.SerializeObject(operation, Formatting.None, IndexSerializationSettings);
                sb.Append(searchJson + "\n");

            }
            var json = sb.ToString();
            var path = "_msearch";
            if (!multiSearchDescriptor._FixedIndex.IsNullOrEmpty())
            {
                if (!multiSearchDescriptor._FixedType.IsNullOrEmpty())
                    path = multiSearchDescriptor._FixedType + "/" + path;
                path = multiSearchDescriptor._FixedIndex + "/" + path;
            }
            var status = this.Connection.PostSync(path, json);

            var multiSearchConverter = new MultiSearchConverter(multiSearchDescriptor);
            var multiSearchResponse = this.ToParsedResponse<MultiSearchResponse>(status,
                extraConverters: new List<JsonConverter>
                {
                    multiSearchConverter
                });

            return multiSearchResponse;
        }
Exemple #7
0
        public async Task <IMultiSearchResponse> MultiSearch(MultiSearchDescriptor multiSearchDescriptor)
        {
            var result2 = Client.MultiSearch(ms => multiSearchDescriptor);

            IMultiSearchResponse result = null;

            result = await Client.MultiSearchAsync(ms => multiSearchDescriptor);

            if (!result.IsValid)
            {
                result.OriginalException.Throw("InvalidEsRequest", result.ServerError.ToString());
            }
            return(result);
        }
Exemple #8
0
        private static IMultiSearchRequest GetMultiSearch_FamilyName(MultiSearchDescriptor ms, List <string> names, FamilyNameSearchParam fi)
        {
            var flag = string.IsNullOrWhiteSpace(fi.areacode);

            foreach (var n in names)
            {
                ms.Search <familyname>(n, s => s.Index(fi.ESIndex).Type(fi.ESType)
                                       .Size(2)
                                       .Sort(st => st.Descending(d => d.cweight))
                                       .Source(src => src.Includes(inc => inc.Fields("cname", "ccode", "cmarea", "carea")))
                                       .Query(q => flag ? q.Term(t => t.Field(fi.ptype.ToString()).Value(n))
                         : (q.Term(t => t.Field(fi.ptype.ToString()).Value(n)) & q.Term(t => t.Field(fi.areacode.Length == 2 ? "cmarea" : "carea").Value(fi.areacode))))
                                       );
            }
            return(ms);
        }
Exemple #9
0
        public MultiSearchResponse ExecuteQueries(params SearchDescriptor <T>[] searchDescriptor)
        {
            var multiDescriptor = new MultiSearchDescriptor();

            foreach (var desc in searchDescriptor)
            {
                multiDescriptor.Search <T>(q => desc);
            }
            var allResponses = _client.MultiSearch(multiDescriptor);

            if (allResponses != null)
            {
                Log.Debug(allResponses.DebugInformation);
                foreach (var response in allResponses.GetResponses <T>())
                {
                    Log.Debug("Result Count: " + response.Total);
                    foreach (var hit in response.Hits)
                    {
                        Log.Debug(hit.Source.ToString());
                    }
                }
            }
            return(allResponses);
        }
Exemple #10
0
 public MultiSearchConverter(IConnectionSettingsValues settings, MultiSearchDescriptor descriptor)
 {
     this._settings = settings;
     _descriptor    = descriptor;
 }
 private JsonConverter CreateMultiSearchConverter(MultiSearchDescriptor descriptor)
 {
     var multiSearchConverter = new MultiSearchConverter(_connectionSettings, descriptor);
     return multiSearchConverter;
 }
 protected abstract MultiSearchDescriptor BuildQuery(MultiSearchDescriptor descriptor, string index);
 protected MultiSearchDescriptor BuildQueryCore(MultiSearchDescriptor descriptor, string index)
 {
     descriptor = BuildQuery(descriptor, index);
     return(descriptor);
 }
Exemple #14
0
 public MultiSearchConverter(MultiSearchDescriptor descriptor)
 {
     _descriptor = descriptor;
 }
Exemple #15
0
 protected override MultiSearchDescriptor BuildQuery(MultiSearchDescriptor descriptor, string index)
 {
     return(descriptor.Search <Person>("search1", s => s.MatchAll()));
 }
Exemple #16
0
        public async Task <string> SDK()
        {
            // 使用SDK方式无法获取到5千条数据,出现bug
            // Unable to get 5000 pieces of data using SDK, bug
            var now = DateTime.Now;
            var multiSearchRequest = new MultiSearchDescriptor();

            multiSearchRequest.MaxConcurrentSearches(5000);
            for (int i = 0; i < 5000; i++)
            {
                // 前一时间
                multiSearchRequest = multiSearchRequest.Search <GatewayDevicePoint_ES>(s => s
                                                                                       .From(0)
                                                                                       .Size(1)
                                                                                       //.Timeout("6000")
                                                                                       .Sort(st => st
                                                                                             .Descending(new Field(nameof(GatewayDevicePoint_ES.TimeTicks)))
                                                                                             )
                                                                                       .Query(q => q
                                                                                              .Bool(b => b
                                                                                                    .Must(mu => mu
                                                                                                          .MatchPhrasePrefix(m => m
                                                                                                                             .Field(new Field(nameof(GatewayDevicePoint_ES.PointId)))
                                                                                                                             .Query("007e1f1f9932408da100aa0306401a4e_214")
                                                                                                                             )
                                                                                                          )
                                                                                                    .Filter(f => f
                                                                                                            .LongRange(r => r
                                                                                                                       .Field(new Field(nameof(GatewayDevicePoint_ES.TimeTicks)))
                                                                                                                       .LessThanOrEquals(now.AddSeconds(-1 * i).ToUniversalTime().Ticks)
                                                                                                                       ), f => f
                                                                                                            .Bool(fb => fb
                                                                                                                  .MustNot(mn => mn
                                                                                                                           .Term(t => t
                                                                                                                                 .Field(new Field(nameof(GatewayDevicePoint_ES.TimeTicks)))
                                                                                                                                 .Value(0)
                                                                                                                                 )
                                                                                                                           )
                                                                                                                  )
                                                                                                            )
                                                                                                    )
                                                                                              )
                                                                                       );
            }
            var result = string.Empty;

            try
            {
                var response = _elasticClient.MultiSearch(multiSearchRequest);
                if (!response.IsValid)
                {
                    result = response.DebugInformation;
                }
                else
                {
                    result = "The amount of data is too small to reproduce the bug. Please increase the amount of inserted data in the static constructor" + Environment.NewLine + "数据量太少,无法重现bug,请在静态构造函数中扩大插入数据量";
                }
            }
            catch (Exception ex)
            {
                result = ex.ToString();
            }
            return(await Task.FromResult(result));
        }