2013-02-13 32 views
5

ElasticSearch परिणामों को संसाधित करने के लिए LINQ का उपयोग करने के लिए सबसे प्रभावी तरीका क्या है?लोचदार खोज परिणामों को संसाधित करने के लिए LINQ का उपयोग करें

मैं JSON.Net के JObject Class पर आया था।

क्या JSON एक फैशन में संरचित लोचदार खोज से लौटा है जो खुद को जॉबजेक्ट क्लास के माध्यम से उचित LINQ क्वेरीज़ में उधार देता है?

+7

@BrandonMoretz [यह पूछें और उत्तर अपने प्रश्न ठीक है ] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/)। एसओ में अच्छे जवाब पाने में क्या नुकसान है? – MikeSmithDev

+2

हालांकि मैंने अपने समाधान को साझा करने के लिए इसका उत्तर दिया है, लेकिन मुझे दूसरों को देखने में खुशी होगी। –

उत्तर

6

यह LINQ का उपयोग करने के लिए LINQ का उपयोग करने के लिए एक पूर्ण समाधान है, जो elasticsearch इंजन से JSON क्वेरी-परिणामों को संसाधित करने के लिए है।


कनेक्शन लाइब्रेरी - PlainElastic.NET

सबसे पहले, मैं एक ही उद्देश्य के लिए PlainElastic.NET उपयोग कर रहा हूँ: मेरे elasticsearch सर्वर से कनेक्ट करने के लिए। यह पुस्तकालय बहुत दुबला है और संक्षेप में मिलता है, पोस्ट, और PUT कार्यों। यह client कनेक्शन ऑब्जेक्ट के साथ नीचे खेल में आता है। result.ToString() elasticsearch सर्वर से JSON प्रतिक्रिया प्रदान करता है। बस अपने बिन में डीएलएल थप्पड़ मारो और एक संदर्भ जोड़ें।

JSON प्रोसेसर - JSON.NET

मैं LINQ प्रश्नों की सुविधा के लिए NewtonSoft JSON.NET का एक बड़ा सुविधा का उपयोग कर रहा हूँ। पुस्तकालय में कक्षा JObject है जो LINQ के विरुद्ध निष्पादित करने के लिए एक घोंसलाशील, क्वेरी करने योग्य संरचना प्रदान करता है। नीचे दी गई रेखा देखें जहां मैं HitCount पकड़ता हूं यह देखने के लिए कि एक व्यक्तिगत मूल्य को पकड़ना कितना अच्छा है, और, ज़ाहिर है, LINQ क्वेरी को जांचें कि इसके खिलाफ पूछताछ कैसे करें। याद रखें, यह केवल एक डेटा-संरचना है जो JSON स्ट्रिंग को पार्स करने का परिणाम है। बस अपने बिन में डीएलएल थप्पड़ मारो और एक संदर्भ जोड़ें।

के खिलाफ लचीला खोजें

'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")) 

पूछताछ

अब LINQ

साथ परिणाम का संसाधन, LINQ का उपयोग GridViews के लिए बाध्य, DataLists, पुनरावर्तक के लिए एक सुंदर गुमनाम वस्तु प्रदान करने के लिए, आदि मैं जानबूझकर कर रहा हूँ एक गैर-तुच्छ LINQ क्वेरी का एक उदाहरण प्रदान करना। इस उदाहरण नेस्ट हो जाता है डेटा ( 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 
) 

अब, आप एक पुनरावर्तक के लिए बाध्य कर सकते हैं, DataList, या GridView

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

हालांकि यह काम करता है, यह उपयोगकर्ता द्वारा जेनरेट की गई क्वेरी पर निर्भर है। यदि आप परिणामों को फ़िल्टर करने के लिए linq का उपयोग करते हैं, तो यह सब क्लाइंट-साइड होता है जो कि लोचदार खोज के पूरे बिंदु को याद करता है। मेरा मानना ​​है कि ओपी वास्तव में लिंक अभिव्यक्ति से es क्वेरी उत्पन्न करने के लिए कुछ चाहता था। वहाँ nuget संकुल हैं जो इस सिद्धता को हल करते हैं (उदाहरण के लिए ElasticLinq) – Basic