2013-02-13 39 views
5

Phương pháp hiệu quả nhất để sử dụng LINQ để xử lý Kết quả Tìm kiếm Đàn hồi là gì?Sử dụng LINQ để Xử lý Kết quả Tìm kiếm Đàn hồi

Tôi đã xem qua số JObject Class của JSON.Net.

JSON có được trả về từ cấu trúc Tìm kiếm Đàn hồi theo kiểu thời trang cho chính nó truy vấn LINQ phù hợp thông qua Lớp JObject không?

+7

@BrandonMoretz [Đó là OK để hỏi và trả lời câu hỏi riêng của bạn ] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). Điều gì gây hại khi nhận được câu trả lời hay trong SO? – MikeSmithDev

+2

Mặc dù tôi đã trả lời bản thân mình để chia sẻ giải pháp của mình, tôi rất vui khi thấy những người khác. –

Trả lời

6

Đây là giải pháp hoàn chỉnh về cách sử dụng LINQ để xử lý các kết quả truy vấn JSON từ công cụ elasticsearch.


Thư viện kết nối - PlainElastic.NET

Trước hết, tôi đang sử dụng PlainElastic.NET cho một mục đích duy nhất: để kết nối với máy chủ elasticsearch tôi. Thư viện này rất gọn gàng và chứa các hàm GET, POST và PUT ngắn gọn. Điều này đi vào chơi bên dưới với đối tượng kết nối client. result.ToString() cung cấp phản hồi JSON từ máy chủ elasticsearch. Chỉ cần tát DLL vào thùng rác của bạn và thêm một tham chiếu.

JSON Processor - JSON.NET

Tôi đang sử dụng một tính năng tuyệt vời của NewtonSoft JSON.NET để tạo điều kiện LINQ truy vấn. Thư viện có lớp JObject cung cấp cấu trúc có thể truy vấn, có thể truy vấn để thực thi LINQ. Xem dòng dưới đây, nơi tôi lấy HitCount để xem nó đẹp như thế nào để lấy một giá trị riêng lẻ, và, tất nhiên, hãy kiểm tra truy vấn LINQ để xem cách truy vấn với nó. Hãy nhớ rằng, đây chỉ đơn giản là một cấu trúc dữ liệu là kết quả của việc phân tích chuỗi JSON. Chỉ cần tát DLL vào thùng rác của bạn và thêm một tham chiếu.

Thực hiện các truy vấn chống lại đàn hồi Tìm kiếm

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

Chế biến các kết quả với LINQ

Bây giờ, sử dụng LINQ để cung cấp một đối tượng ẩn danh đẹp cho ràng buộc để gridviews, DataLists, lặp, vv Tôi cố ý cung cấp ví dụ về truy vấn LINQ không tầm thường. Ví dụ này được lồng vào dữ liệu (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 
) 

Bây giờ, bạn có thể liên kết với một Repeater, DataList, hoặc GridView

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

Trong khi tác phẩm này hoạt động, nó dựa trên truy vấn do người dùng tạo. Nếu bạn sử dụng LINQ để lọc kết quả, tất cả sẽ xảy ra phía máy khách mà loại bỏ toàn bộ điểm có elasticsearch. Tôi tin rằng OP muốn một cái gì đó để thực sự tạo ra các truy vấn es từ biểu thức liên kết. Có gói nuget mà giải quyết này provlem (ví dụ như ElasticLinq) – Basic

Các vấn đề liên quan