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()
@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
Anche se ho risposto io stesso per condividere la mia soluzione, sarei felice di vederne altri. –