Elasticsearch NEST 库,有线行为
Elasticsearch NEST library, wired behavior
使用 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"))));
我想知道为什么使用表达式表示字段的查询不起作用。
发生这种情况是因为 Nest 默认将字段名称序列化为小写。因此 t.Name
实际上序列化为 "name",我猜它在映射 Students
中不存在(注意:字段名称在 Elasticsearch 中区分大小写)因此没有结果。而当您直接使用 "Name" 时,它会起作用。解决此问题的一种方法是使用属性 [ElasticProperty(Name = "Name")]
.
修饰 StudenntBrief
class 中的 Name
字段
更好的是,您可以用属性 [ElasticType(Name = "Students")]
修饰 class StudenntBrief
。这样,您还可以避免在使用 Nest 构建搜索请求时明确指定 Type
。
bsarkar 的回答部分正确。
NEST 默认采用驼峰命名法。有几种方法可以自定义此行为。
您可以通过指定您自己的 属性 名称推断器来覆盖默认的驼峰式大小写:How to disable camel casing Elasticsearch field names in NEST?。这种方法将适用于所有字段和所有类型。
另一种方法是通过使用 bsarkar 提到的 ElasticyProperty
属性或使用 1.3 版中添加的较新的流畅 属性 映射 API 来明确指定字段名称: https://github.com/elasticsearch/elasticsearch-net/pull/1062
settings.MapPropertiesFor<MyClass>(props => props
.Rename(p => p.Foo, "bar")
);
希望对您有所帮助。
使用 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"))));
我想知道为什么使用表达式表示字段的查询不起作用。
发生这种情况是因为 Nest 默认将字段名称序列化为小写。因此 t.Name
实际上序列化为 "name",我猜它在映射 Students
中不存在(注意:字段名称在 Elasticsearch 中区分大小写)因此没有结果。而当您直接使用 "Name" 时,它会起作用。解决此问题的一种方法是使用属性 [ElasticProperty(Name = "Name")]
.
StudenntBrief
class 中的 Name
字段
更好的是,您可以用属性 [ElasticType(Name = "Students")]
修饰 class StudenntBrief
。这样,您还可以避免在使用 Nest 构建搜索请求时明确指定 Type
。
bsarkar 的回答部分正确。
NEST 默认采用驼峰命名法。有几种方法可以自定义此行为。
您可以通过指定您自己的 属性 名称推断器来覆盖默认的驼峰式大小写:How to disable camel casing Elasticsearch field names in NEST?。这种方法将适用于所有字段和所有类型。
另一种方法是通过使用 bsarkar 提到的 ElasticyProperty
属性或使用 1.3 版中添加的较新的流畅 属性 映射 API 来明确指定字段名称: https://github.com/elasticsearch/elasticsearch-net/pull/1062
settings.MapPropertiesFor<MyClass>(props => props
.Rename(p => p.Foo, "bar")
);
希望对您有所帮助。