首页 > 解决方案 > 使用 Elasticsearch 按 ID 搜索不返回

问题描述

我有一个控制器,其中包含一种使用 NEST 根据其 ID 检索数据的方法。在 Kibana 的 CLI 上,我获取它显示的 ID 并将其粘贴到 swagger Web 应用程序中,以查看它是否会填充,但它不会(返回 204)。

Swagger (asp.net 核心 web api)

在此处输入图像描述

在我的 GET 方法中,我首先尝试使用 SearchAsync 但它不起作用,所以我切换到 GetAsync 但仍然无法正常工作。如果在我的模型类中创建了所有属性以匹配_sourceCLI 屏幕截图中的第 22 行,不确定为什么这不起作用。有没有人有任何理由为什么它没有返回我需要它做的事情并且只显示 204?

        [HttpGet("{id}")]
        public async Task<EsSource> Get(String id)
        {
            /* var response = await _elasticClient.SearchAsync<EsSource>(s => s
                  .Index("elastic-search-app-logs*")
                  .Query(q => q.Match(m => m.Field(f => f.TimeStamp).Query(id))));*/

            var response = await _elasticClient.GetAsync<EsSource>(new DocumentPath<EsSource>(
               new Id(id)), x => x.Index("elastic-search-app-logs*"));

            return response?.Source;
        }

我的模特课

namespace ESPractice.Models
{
    public class EsSource
    {
        public String TimeStamp { get; set; }
        public String Level { get; set; }
        public String MessageTemplate { get; set; }
        public String Message { get; set; }
    }

    public class EsExceptions 
    {
        public String Depth { get; set; }
        public String ClassName { get; set; }
        public String Message { get; set; }
        public String Source { get; set; }
        public String StackTraceString { get; set; }
        public String RemoteStackTraceString { get; set; }
        public String RemoteStackIndex { get; set; }
        public String HResult { get; set; }
        public String HelpURL { get; set; }
    }

    public class EsFields
    {
        public String SourceContext { get; set; }
        public String ActionId { get; set; }
        public String ActionName { get; set; }
        public String RequestId { get; set; }
        public String RequestPath { get; set; }
        public String ConnectionId { get; set; }
        public String MachineName { get; set; }
        public String Environment { get; set; }
    }

}

标签: c#elasticsearchasp.net-web-apikibananest

解决方案


您可以简单地拨打电话await _client.GetAsync<EsSource>(id, x => x.Index("elastic-search-app-logs*"));

您还可以启用调试,这样您将收到有关发送到 elasticsearch 的内容以及此处描述的响应的详细信息。

如果你想调试一个调用,你可以做(​​确保它没有为生产启用)

var response = client.Search<Project>(s => s
    .RequestConfiguration(r => r
        .DisableDirectStreaming() 
    )
    .Query(q => q
        .MatchAll()
    )
);

检查response.DebugInformation更多细节。


推荐阅读