如何使用.net elasticsearch客户端查询logstash索引?

时间:2016-06-20 13:28:11

标签: elasticsearch logstash nest

我正在尝试使用NEST搜索使用logstash创建的弹性搜索indexex(基本上是logstash - *)。

我已使用以下代码设置NEST:

 Node = new Uri("http://localhost:9200");
 Settings = new ConnectionSettings(Node);
 Settings.DefaultIndex("logstash-*");
 Client = new ElasticClient(Settings);

这就是我尝试获得结果的方式:

var result = Client.Search<Logstash>(s => s
            .Query(p => p.Term("Message", "*")));

我得到0次点击: http://screencast.com/t/d2FB9I4imE

以下是我想要查找的条目示例:

{
  "_index": "logstash-2016.06.20",
  "_type": "logs",
  "_id": "AVVtswJxpdkh1tFPP9S5",
  "_score": null,
  "_source": {
    "timestamp": "2016-06-20 14:04:55.6650",
    "logger": "xyz",
    "level": "debug",
    "message": "Processed command service method SearchService.SearchBy in 65 ms",
    "exception": "",
    "url": "",
    "ip": "",
    "username": "",
    "user_id": "",
    "role": "",
    "authentication_provider": "",
    "application_id": "",
    "application_name": "",
    "application": "ZBD",
    "@version": "1",
    "@timestamp": "2016-06-20T12:04:55.666Z",
    "host": "0:0:0:0:0:0:0:1"
  },
  "fields": {
    "@timestamp": [
      1466424295666
    ]
  },
  "sort": [
    1466424295666
  ]
}

我正在使用5.0.0-alpha3版本,NEST客户端是alpha2版本atm。

1 个答案:

答案 0 :(得分:2)

这是因为

...
"_type": "logs",
...

当您进行与您类似的查询时,它会点击logstash而不是logs类型,因为NEST会从通用参数中推断出类型名称。您有两种方法可以解决此问题。

  1. 告诉NEST每次制作时都会将Logstash类型映射到logs类型 通过在客户端设置此映射来请求elasticsearch 设置:

    var settings = new ConnectionSettings()
        .MapDefaultTypeNames(m => m.Add(typeof(Logstash), "logs");
    
    var client = new ElasticClient(settings);
    
  2. 通过在请求中显式设置类型来覆盖默认行为 参数:

    var result = Client.Search<Logstash>(s => s
        .Type("logs")
        .Query(p => p.Term("message", "*")));
    

    另请注意,您可以在术语描述符中使用message而不是Message 因为索引中没有这样的字段。第二,这就是我 术语查询中不支持通配符。你可能想用 而是query string

  3. 希望它有所帮助。