在基本的 hello world 应用程序中使用 Nest 的 Elastic Search 结果不一致

Inconsistent Elastic Search results using Nest in basic hello world application

我创建这个应用程序是为了测试 ES & Nest 的基本功能,所有这些都是从 Nest 的教程站点复制的。

如果我设置一个断点并单步执行代码,它可以正常工作,但如果我让它 运行 而没有单步执行 returns 0 个文档并爆炸。 ES 是否需要一些时间来索引文档或其他什么?

谢谢。 这是 ES 2.1.1

using System;
using System.Linq;
using Nest;

namespace NestTest
{
public class Person
{
    public string id { get; set; }
    public string firstname { get; set; }
    public string lastname { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var node = new Uri("http://localhost:9200");

        var settings = new ConnectionSettings(
            node,
            defaultIndex: "my-application"
        );

        var client = new ElasticClient(settings);

        client.DeleteIndex("my-application");

        var person = new Person
        {
            id = "1",
            firstname = "martijn",
            lastname = "laarman"
        };

        client.Index(person);

        var searchResults = client.Search<Person>(s => s
           .From(0)
           .Size(10)
           .Query(q => q
               .Term(p => p.firstname, "martijn")
           )
           );

        // this is 0 most of the time
        Console.WriteLine("Document count = {0}", searchResults.Documents.Count());

        var martijn = GetMartijn(client);
        ShowMartijn(martijn);

    }

    private static void ShowMartijn(Person m)
    {
        Console.WriteLine(string.Format("{0} {1}", m.firstname, m.lastname));
    }

    private static Person GetMartijn(ElasticClient client)
    {
        var searchResults = client.Search<Person>(s => s
            .From(0)
            .Size(10)
            .Query(q => q
                .Term(p => p.firstname, "martijn")
            )
            );
        return searchResults.Documents.First();
    }
}
}

它 returns 零文档,因为 Elasticsearch 需要一些时间才能搜索索引文档。开箱即为1秒。这是默认的刷新间隔。您的代码中没有这样的延迟,因此当您单步执行代码与让它 运行 免费时,观察结果会有所不同。为确保索引文档可搜索,请在调用 Search() 命令之前强制刷新:

client.Refresh();

您的代码很可能由于行中的错误假设而崩溃

return searchResults.Documents.First();

这假设 Documents 不为空。为了使代码更可靠,可以在使用First()之前检查DocumentsCount属性的值。但这只是一个 Hello World 程序:)