Elasticsearch.net 客户端无法进行基本搜索

Posted

技术标签:

【中文标题】Elasticsearch.net 客户端无法进行基本搜索【英文标题】:Elasticsearch.net client can't do basic search 【发布时间】:2014-10-17 22:09:20 【问题描述】:

我有一个看起来像这样的基本 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);

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

我做错了什么?

【问题讨论】:

这对我来说很奇怪 我认为 Nest 可能会小写名称。您可以序列化并记录搜索以进行调试。 如何逐步检查代码并尝试找出问题的根源? 【参考方案1】:

如果您直接使用低级客户端(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);

【讨论】:

感谢您的回答。我仍然认为如果不是用户自己实现外壳,就应该不理会它。 我同意,NEST 是我在 2010 年将 Elasticsearch 集成到我的应用程序中时编写的,主要是为了我自己的使用。从那时起,尽管 NEST 已经在内部完全重写,但该约定已经形成现在更改它的 1.0 版本会给现有用户带来许多问题。在拆分低级客户端时,我们确实故意选择了它不包含任何这样的魔法。

以上是关于Elasticsearch.net 客户端无法进行基本搜索的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch.Net.UnexpectedElasticsearchClientException:在从 ES 获取数据期间

NEST/Elasticsearch.Net 发送原始JSON请求(Post数据)

通过elasticsearch.net中的字符串数组查询字符串数组

如何从 elasticsearch.net / NEST 获取 geo_point 字段的距离

elk日志使用

Minimongo 无法在客户端进行集合排序