2013-02-13 10 views
5

Qual è il metodo più efficiente per utilizzare LINQ per elaborare i risultati ElasticSearch?Utilizzare LINQ per elaborare risultati di ricerca elastici

Mi sono imbattuto in JObject Class di JSON.Net.

JSON restituito da ElasticSearch strutturato in modo tale da prestarsi alle query LINQ corrette tramite la classe JObject?

+7

@BrandonMoretz [E 'giusto chiedere e risposta le proprie domande ] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). Qual è il danno nell'ottenere buone risposte in SO? – MikeSmithDev

+2

Anche se ho risposto io stesso per condividere la mia soluzione, sarei felice di vederne altri. –

risposta

6

Questa è una soluzione completa su come utilizzare LINQ per elaborare i risultati della query JSON dal motore elasticsearch.


Biblioteca Connection - PlainElastic.NET

Prima di tutto, io sto usando PlainElastic.NET per un unico scopo: per la connessione al server elasticsearch. Questa libreria è molto snella e contiene funzioni GET, POST e PUT concise. Questo entra in gioco di seguito con l'oggetto di connessione client. result.ToString() fornisce la risposta JSON dal server elasticsearch. Basta schiacciare la DLL nel cestino e aggiungere un riferimento.

JSON Processor - JSON.NET

Sto usando una grande caratteristica di NewtonSoft JSON.NET per facilitare la query LINQ. La libreria ha una classe JObject che fornisce una struttura annidabile e interrogabile per eseguire LINQ contro. Vedi la riga qui sotto dove prendo HitCount per vedere quanto è bello prendere un singolo valore e, naturalmente, controlla la query LINQ per vedere come eseguire una query su di esso. Ricorda, questa è semplicemente una struttura dati che è il risultato dell'analisi di una stringa JSON. Basta schiacciare la DLL nel cestino e aggiungere un riferimento.

Esecuzione Query contro Elastic Ricerca

'Execute the Search 
Dim client = New ElasticConnection("localhost", 9200) 
Dim result = client.Post("myindex/mytype/_search", elastic_query) 'elastic_query = well-formatted elasticsearch query (json string)' 
Dim J As JObject = JObject.Parse(result.ToString()) 

'How many results were located? 
Dim HitCount = CInt(J("hits")("total")) 

'What was the maximum score? Maybe you want to know this for normalizing scores to 0-100. 
' - We make sure we have hits first 
' - Also, make sure scoring is turned on. It might be turned off if an alternate sort method is used in your query 
If HitCount > 0 AndAlso J("hits")("max_score").Type <> JTokenType.Null Then MaxScore = CDbl(J("hits")("max_score")) 

elaborazione dei risultati con LINQ

Ora, utilizzare LINQ per fornire un bellissimo oggetto anonimo per il legame con GridView, DataLists, ripetitori, ecc sono intenzionalmente fornendo un esempio di una query LINQ non banale. In questo esempio viene nidificato dati (Stores, Categories)

Dim SearchResults = _ 
    (From X In J("hits")("hits") 
    Select 
     score = CDec(If(X("_score").Type = JTokenType.Null, 0, X("_score"))), 
     boost = CDbl(X("_source")("_boost")), 
     InstitutionID = CInt(X("_source")("InstitutionID")), 
     Name = CStr(X("_source")("Name")), 
     Stores = (From S In X("_source")("Stores") Select CInt(S("StoreID"))).ToList(), 
     Categories = (From Z In X("_source")("Categories") Select CatID = CInt(Z("CatID")), CatName = CStr(Z("CatName")), InstitutionID = CInt(X("_source")("InstitutionID"))).ToList() 
Order By score Descending, boost Descending 
) 

Ora, è possibile associare ad un ripetitore, DataList, o GridView

MyRepeater.DataSource = SearchResults 
MyRepeater.DataBind() 
+0

Mentre funziona, si basa su una query generata dall'utente. Se si usa linq per filtrare i risultati, tutto accade sul lato client, il che significa che manca l'intero punto di avere elasticsearch. Credo che l'OP volesse qualcosa per generare effettivamente la query es dall'espressione link. Ci sono pacchetti di nuget che risolvono questo problema (es. ElasticLinq) – Basic

Problemi correlati