在基本hello world应用程序中使用Nest的弹性搜索结果不一致

时间:2015-12-27 22:10:09

标签: elasticsearch nest

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

如果我设置一个断点并逐步执行代码它可以正常工作但是如果我让它在没有步进的情况下运行它会返回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();
    }
}
}

1 个答案:

答案 0 :(得分:2)

它返回零文档,因为Elasticsearch需要一些时间才能搜索索引文档。开箱即用,它是1秒。这是默认的刷新间隔。您的代码没有这样的延迟,因此当您单步执行代码与让它自由运行时观察的差异。要确保索引文档是可搜索的,请在调用Search()命令之前强制刷新,如下所示:

client.Refresh();

你的代码很可能因为行

中的错误假设而爆炸
return searchResults.Documents.First();

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