2013-04-26 2 views
12

Sto giocando con ElasticSearch in combinazione con NEST nel mio progetto C#. Il mio caso d'uso include diversi indici con diversi tipi di documenti che interrogherò separatamente finora. Ora voglio implementare una funzione di ricerca globale che interroga tutti gli indici, i tipi di documenti esistenti e segna il risultato correttamente.NEST: Come eseguire una query su più indici e gestire sottoclassi diverse (tipi di documenti)?

Quindi la mia domanda: come posso realizzare utilizzando NEST?

Attualmente sto usando la funzione SetDefaultIndex ma come posso definire più indici?

Forse per una migliore comprensione, questo è il Voglio interrogazione rendo conto con NEST:

{ 
    "query": { 
    "indices": { 
     "indices": [ 
     "INDEX_A", 
     "INDEX_B" 
     ], 
     "query": { 
     "term": { 
      "FIELD": "VALUE" 
     } 
     }, 
     "no_match_query": { 
     "term": { 
      "FIELD": "VALUE" 
     } 
     } 
    } 
    } 
} 

TIA

risposta

15

Si può dire esplicitamente NEST di utilizzare più indici:

client.Search<MyObject>(s=>s 
    .Indices(new [] {"Index_A", "Index_B"}) 
    ... 
) 

Se si desidera cercare tra tutti gli indici

client.Search<MyObject>(s=>s 
    .AllIndices() 
    ... 
) 
.210

Oppure, se si desidera cercare un indice (quello non è l'indice di default)

client.Search<MyObject>(s=>s. 
    .Index("Index_A") 
    ... 
) 

Ricordati dal elasticsearch 19.8 è possibile anche specificare caratteri jolly su nomi di indice

client.Search<MyObject>(s=>s 
    .Index("Index_*") 
    ... 
) 

quanto riguarda il tuo indices_query

client.Search<MyObject>(s=>s 
    .AllIndices() 
    .Query(q=>q 
     .Indices(i=>i 
      .Indices(new [] { "INDEX_A", "INDEX_B"}) 
      .Query(iq=>iq.Term("FIELD","VALUE")) 
      .NoMatchQuery(iq=>iq.Term("FIELD", "VALUE")) 
     ) 
    ) 
); 

UPDATE

Questi test mostrano fuori come si può fare 'covarianza lavoro s per voi:

https://github.com/Mpdreamz/NEST/blob/master/src/Nest.Tests.Integration/Search/SubClassSupport/SubClassSupportTests.cs

Nel tuo caso se tutti i tipi non sono sottoclassi di una base condivisa è comunque possibile utilizzare 'C# oggetto'

cioè:

.Search<object>(s=>s 
     .Types(typeof(Product),typeof(Category),typeof(Manufacturer)) 
     .Query(...) 
); 

Ciò cercare /yourdefaultindex/products,categories,manufacturers/_search e la configurazione di default ConcreteTypeSelector che capisce che tipo ogni restituito docume nt è.

Utilizzando ConcreteTypeSelector(Func<dynamic, Hit<dynamic>, Type>) è possibile restituire manualmente un tipo basato su un valore di json (su dinamico) o sui metadati di successo.

+0

Ciao Martijn, grazie per la tua risposta! Il modo di interrogare rispetto a diversi indici l'ho già capito. Il problema principale che sto affrontando è che ho ** diversi tipi di documento con diversa struttura ** memorizzati in indici come Books, Cars, ecc. Intendo il tuo esempio: client. Ricerca MyObject sarebbe nel mio caso qualcosa di più generico perché voglio recuperare libri, automobili, ecc con una query. Ho provato con il tipo generico ma senza successo. – Neil

+0

L'unico modo con cui ho ottenuto i documenti era usando client.Search (query).Ho anche aggiunto MapTypeIndices alle impostazioni di connessione (...). Potresti fornire un esempio per realizzare qualcosa come 'var results = Client.Search (s => s .Indici (nuovo [] {"Indice-libro", "Indice-auto"}) . Dimensione (200) .MatchAll() ); ' O raccomandi un altro approccio? Apprezza molto il tuo sforzo! – Neil

+0

Aggiornamento: Attualmente sto usando la classe base di Libri, Automobili ecc. ma non è una soluzione pulita. 'client.Search ' – Neil