使用 LINQ 处理 ElasticSearch 结果最有效的方法是什么?
我遇到了 JSON.Net 的JObject Class。
从 ElasticSearch 返回的 JSON 的结构是否适合通过 JObject 类进行适当的 LINQ 查询?
使用 LINQ 处理 ElasticSearch 结果最有效的方法是什么?
我遇到了 JSON.Net 的JObject Class。
从 ElasticSearch 返回的 JSON 的结构是否适合通过 JObject 类进行适当的 LINQ 查询?
这是关于如何利用 LINQ 处理来自 elasticsearch 引擎的 JSON 查询结果的完整解决方案。
连接库 - PlainElastic.NET
首先,我将 PlainElastic.NET 用于一个目的:连接到我的弹性搜索服务器。这个库非常精简,包含简洁的 GET、POST 和 PUT 函数。这在下面与client
连接对象一起发挥作用。result.ToString()
提供来自 elasticsearch 服务器的 JSON 响应。只需将 DLL 放入您的 bin 并添加引用即可。
JSON 处理器 - JSON.NET
我正在使用 NewtonSoft JSON.NET 的一项强大功能来促进 LINQ 查询。该库有一个类JObject
,它提供了一个可嵌套的、可查询的结构来执行 LINQ。请参阅下面我抓取的行HitCount
,看看抓取单个值有多好,当然,请查看 LINQ 查询以了解如何查询它。请记住,这只是一个数据结构,它是解析 JSON 字符串的结果。只需将 DLL 放入您的 bin 并添加引用即可。
'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 提供一个漂亮的匿名对象,用于绑定到 Gridview、DataList、Repeater 等。我特意提供了一个重要的 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
)
现在,您可以绑定到 Repeater、DataList 或 Gridview
MyRepeater.DataSource = SearchResults
MyRepeater.DataBind()