【问题标题】:looping through elasticsearch queryresult using Mpdreamz/NEST使用 Mpdreamz/NEST 循环通过 elasticsearch queryresult
【发布时间】:2012-08-23 06:20:18
【问题描述】:

我使用 Mpdreamz/NEST 作为 .net 客户端来搜索 elasticsearch。

我正在使用result.Hits.Total 获取搜索结果的结果计数。但我想知道如何从结果中显示字段的值。

【问题讨论】:

标签: c# elasticsearch nest


【解决方案1】:

var result = client.Search(....)

将返回一个QueryResult<dynamic> 和一个Documents 类型为IEnumerable<dynamic> 的属性您可以像这样循环:

foreach(var d in result.Documents)
{
    Console.WriteLine(d.title);
}

这里的大小写很重要d.Title 将导致 RuntimeBinderException。除非您的 elasticsearch 字段实际上完全匹配 'Title`

你也可以映射到POCO的

public class MyResult
{
    public string Title { get; set; }
}

...

var result = client.Search<MyResult>(....)

现在Documents 是一个IEnumerable<MyResult>,它将为您提供编译时间保证属性存在。

除非您正在处理用户输入,否则您不必访问.Fields["field"]

result.Total 也优于 result.Hits.Total

【讨论】:

    【解决方案2】:

    查看 NEST 源代码,您似乎可以执行以下操作:

    foreach (var item in result.Documents.ToList())
    {
        string msg = "Name: " + item.Name + " | Value: " + item.Text;
        alert(msg);
    }
    

    【讨论】:

    • 感谢您的快速回复.. 我试过了,但我想从结果中显示单个字段的值,比如“标题”。 var result = client.Search(s => s .Index("algotest")... .MatchAll() );这是我的搜索查询。
    • 异常:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法在 System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0, T1,Tret](CallSite site, T0 arg0, T1 arg1) 使用字符串 Title = res.Fields["title"]; 时出现此异常
    • 看来res对象是null那么。您能否提供更多应用程序代码?
    • 在第二个循环中也出现了同样的异常:(我的显示标题的代码附在要点中,请检查。搜索结果返回的总命中数为 32,然后 res 如何变为空!!!@ 987654321@
    • 是的,它有效 :) 非常感谢 Yannick 的大力帮助
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2022-09-24
    • 2016-11-08
    相关资源
    最近更新 更多