使用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"))));
我想知道为什么使用表达式来表示字段的查询不起作用。
答案 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
。