5

我有一个看起来像这样的基本 Elasticsearch 查询

POST /fruit/_search
{"query":{"term":{"Name":"banana"}}}

我得到了结果,当我有意识地运行时没有问题。

所以我尝试在 elasticsearch.net 中做到这一点

var requestBody = new { query = new { term = new { Name = "banana" } } };
                var result = client.Search<string>("fruit", requestBody);

我没有得到任何结果。如果我只有一个带有 new {} 的搜索正文,那么我会得到点击,但不会被过滤。

我究竟做错了什么?

4

1 回答 1

8

如果您直接使用低级客户端(elasticsearch.net),它将不会进行任何规范化并逐字序列化对象:

var query = new { query = new { term = new { Name = "banana" } } };
var json = new ElasticsearchClient().Serializer.Serialize(query).Utf8String();

这将导致以下json:

{
  "query": {
    "term": {
      "Name": "banana"
    }
  }
}

如果您使用 NEST,则默认行为是驼峰式属性名称(NEST 是自以为是的):

{
  "query": {
    "term": {
      "name": "banana"
    }
  }
}

如果您通过高级客户端 ( client.Raw) 使用低级客户端,它将使用与高级客户端完全相同的序列化设置。

您可以通过以下方式在高级客户端上控制此行为:

var connectionSettings = new ConnectionSettings()
    .SetDefaultPropertyNameInferrer(p=>p);
var client = new ElasticClient(connectionSettings);
于 2014-10-19T11:33:53.043 回答