Đâ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()
@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
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. –