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

希望对您有所帮助。