Elasticsearch NEST库,有线行为

时间:2015-02-04 02:22:57

标签: .net elasticsearch nest

使用NEST .NET库我可以跟随查询。

var result = client.Search<StudenntBrief>(s => s.Type("Students").Query(q => q.Term("Name","Robert")));

工作正常,得到7个结果。

不使用maigic字符串来表示字段,而是尝试使用表达式,如下所示。

var result = client.Search<StudenntBrief>(s => s.Type("Students").Query(q => q.Term(t => t.Name,"Robert")));

我发现零结果。

这是另一个例子。

作品。

var result = client.Search<StudenntBrief>(s => s.Type("Students").Query(q => q.MultiMatch(a => a.OnFields(new List<string{"Name"}).Query("Robert"))));

不起作用。

var result = client.Search<StudenntBrief>(s => s.Type("Students").Query(q => q.MultiMatch(a => a.OnFields(f=> f.Name).Query("Robert"))));

我想知道为什么使用表达式来表示字段的查询不起作用。

2 个答案:

答案 0 :(得分:2)

bsarkar的答案部分正确。

默认情况下,NEST camelCases字段名称。有几种方法可以自定义此行为。

您可以通过指定自己的属性名称inferrer来覆盖默认的camelCasing:How to disable camel casing Elasticsearch field names in NEST?。此方法适用于所有字段和所有类型。

另一种方法是通过使用{b}提到的ElasticyProperty属性或使用版本1.3中添加的更新的流畅属性映射API来明确指定字段名称:https://github.com/elasticsearch/elasticsearch-net/pull/1062

settings.MapPropertiesFor<MyClass>(props => props
    .Rename(p => p.Foo, "bar")
);

希望有所帮助。

答案 1 :(得分:0)

这是因为默认情况下,Nest会将字段名称变为小写。因此t.Name实际上序列化为“name”,我猜在映射Students中不存在(注意:字段名称在Elasticsearch中区分大小写),因此没有结果。而当你直接使用“名称”时,它是有效的。解决此问题的一种方法是使用属性Name修饰StudenntBrief类中的[ElasticProperty(Name = "Name")]字段。

更好的是,您可以使用属性StudenntBrief修饰类[ElasticType(Name = "Students")]。这样,您还可以避免在使用Nest构建搜索请求时明确指定Type