2014-10-17 69 views
5

我有一个基本的Elasticsearch查询,看起来像这样Elasticsearch.net客户端无法做基本的搜索

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); 

而且我没有得到任何结果回来。如果我只有一个新的搜索主体{},那么我会得到点击,但不会被过滤。

我在做什么错?

+0

这是奇怪的工作对我来说 – keety 2014-10-18 00:36:31

+0

我觉得鸟巢可能lowercasing名称。您可以序列化并记录搜索以进行调试。 – 2014-10-18 00:37:01

+0

如何一步一步通过代码并试图找出问题的来源? – Aybe 2014-10-18 07:36:04

回答

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,默认行为是对camelCase属性名称(NEST是独立的):

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

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

您可以控制通过高层次的客户对这个行为:

var connectionSettings = new ConnectionSettings() 
    .SetDefaultPropertyNameInferrer(p=>p); 
var client = new ElasticClient(connectionSettings); 
+1

感谢您的回答。如果不是用户自己实现的话,我仍然认为套管应该独立。 – 2014-10-30 14:34:54

+1

我同意,NEST是我写的东西,主要是为了我自己的使用,而我在2010年将elasticsearch集成到了我的应用程序中。该协议在此之后就已经出炉了,尽管NEST已经完全被内部重写,导致其1.0版本现在发生了改变给现有用户造成很多问题。当分解出低级别的客户端时,我们故意选择了它,但不要让这样的魔法烘焙。 – 2014-10-30 14:42:22