/// <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())); }
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); }
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; }
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); }
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); }
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); }
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); }
public MultiSearchConverter(MultiSearchDescriptor descriptor) { _descriptor = descriptor; }
protected override MultiSearchDescriptor BuildQuery(MultiSearchDescriptor descriptor, string index) { return(descriptor.Search <Person>("search1", s => s.MatchAll())); }
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)); }