2016-12-13 5 views
0

Angenommen, ich möchte bestimmte Ergebnisse auf bestimmten Teil meiner Seite anzeigen. Gibt es eine Möglichkeit, meine Suchergebnisse basierend auf meiner Abfrage aus Elastic zu gruppieren.gruppe suchresultate in elasticsearch

z.

1.

GET /my_index/_search 
{ 
"query": { 
    "bool": { 
     "must": [ 
      {"match": {"field1": "value1"}}, 
      {"match": {"field7": "value7"}} 
      ] 
     } 
    } 
} 

2.

GET /my_index/_search 
{ 
"query": { 
    "bool": { 
     "must": [ 
      {"match": {"field2": "value2"}} 
      ] 
     } 
    } 
} 

ist es möglich, diese zwei in einem Aufruf elastisch und nur Gruppe die Ergebnisse zu kombinieren?

Antwort

2

Sie können mit mehreren Suchanfragen in einer Anfrage senden Multi Search API

Das in NEST ausgesetzt ist

var pool = new SingleNodeConnectionPool(new Uri($"http://localhost:9200")); 
var defaultIndex = "my_index"; 
var connectionSettings = new ConnectionSettings(pool) 
     .DefaultIndex(defaultIndex) 

var client = new ElasticClient(connectionSettings); 

var multiSearchResponse = client.MultiSearch(ms => ms 
    .Index(defaultIndex) 
    .Search<Document>("search1", s => s 
     .AllTypes() 
     .Query(q => q 
      .Match(m => m 
       .Field(f => f.Field1) 
       .Query("value1") 
      ) && q 
      .Match(m => m 
       .Field(f => f.Field7) 
       .Query("value7") 
      ) 
     ) 
    ) 
    .Search<Document>("search2", s => s 
     .AllTypes() 
     .Query(q => q 
      .Bool(b => b 
       .Must(mu => mu 
        .Match(m => m 
         .Field(f => f.Field2) 
         .Query("value2") 
        ) 
       ) 
      ) 
     ) 
    ) 
); 

// get the search responses for one of the searches by name 
var search1Responses = multiSearchResponse.GetResponse<Document>("search1"); 

Daraus ergibt sich die folgende Suche

POST http://localhost:9200/my_index/_msearch 
{"index":"my_index"} 
{"query":{"bool":{"must":[{"match":{"field1":{"query":"value1"}}},{"match":{"field7":{"query":"value7"}}}]}}} 
{"index":"my_index"} 
{"query":{"bool":{"must":[{"match":{"field2":{"query":"value2"}}}]}}} 
+0

ich gerade versucht, 'MultiSearchAsync (IMultiSearchRequest Anfrage) 'und meine' GetResponse 'scheint nicht das Ergebnis zu bekommen. 'var result = response.GetResponse (" search1 ")' funktioniert aber 'var result = response.GetResponse (" search1 ")' nicht. Irgendein Konzept, das ich vermisse? –

+0

Der generische 'T'-Parametertyp, der an 'GetResponse ()' übergeben wird, sollte ein Typ sein, von dem das Dokument deserialisiert werden kann. –

+0

T ist der gleiche Typ, der mit Index indiziert wurde –