【问题标题】:Elasticsearch NEST library, wired behaviorElasticsearch NEST 库,有线行为
【发布时间】:2015-04-03 10:46:19
【问题描述】:

使用 NEST .NET 库我写了以下查询。

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

效果很好,得到了 7 个结果。

我没有使用魔法字符串来表示字段,而是尝试使用如下表达式。

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

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

【问题讨论】:

    标签: .net elasticsearch nest


    【解决方案1】:

    bsarkar 的回答部分正确。

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

    您可以通过指定您自己的属性名称 inferrer 来覆盖默认的 camelCasing: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")
    );
    

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是否有流畅的 API 来执行此操作。我想将域类与底层搜索技术分开。
      • 如果您想要强类型的字段名称,那么我想没有其他出路了。为什么你不能有一个像IStudentBrief 这样包含相同字段的接口并公开它?然后你可以让StudentBrief 类实现IStudentBrief 并用Nest 属性装饰这个类。那应该可以解决您的问题。
      • 如果这回答了您的问题,请将其标记为答案。
      猜你喜欢
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多