c# - 如何在Elasticsearch上使用NEST进行的查询中访问脚本字段?

标签 c# .net elasticsearch nest elasticsearch-painless

我有一个具有坐标字段的POCO,并且使用NEST进行的映射和地理距离搜索均按预期工作。但是,我要使用NEST做的是还返回距GeoDistance查询中指定点的距离,作为搜索结果的一部分。到目前为止,我的研究表明有两种方法可以做到这一点:

  • request a sort on the location
  • 创建一个脚本字段作为查询的一部分,该查询字段可运行距离计算内联

  • 我决定使用选项2,这是一些代码的样子:
    public class User
    {
        public int ID { get; set; }
        [GeoPoint]
        public Coordinate Location { get; set; }
    }
    

    和查询本身:
    var results = elasticClient.Search<User>(s => s
        .Index("user")
        .Query(q => q
            .GeoDistance(gd => gd
               .Field(f => f.Location)
               .Distance(Distance.Miles(distance))
               .Location(GeoLocation.TryCreate(data.Latitude, data.Longitude))
            ) && q
            .Exists(e => e
               .Field("location")
            )
        )       
        .ScriptFields(sf => sf
            .ScriptField("distance", sf2 => sf2
                .Inline(String.Format("doc['location'].arcDistance({0},{1})", data.Latitude, data.Longitude))    
                .Lang("painless")
            )
        )                
    );
    

    虽然直接对elasticsearch运行此查询似乎很好,但是当我这样做时,我遇到了几个问题:
  • 我无法访问在POCO对象中定义的“距离”脚本字段,除非将其添加到定义
  • 如果我为User POCO创建一个子类,ElasticSearch不会反序列化父类中定义的字段(这意味着我仅获得Distance脚本字段,而不是ID或Location字段,并且Documents数组对象全部为Null)
  • 我正在尝试将用于映射的实际POCO与搜索结果对象之间保持隔离,但是我不知道如何标记属性/字段,以便NEST不会映射它,但是会反序列化脚本字段的结果放入属性


  • 我的问题是:在NEST中访问脚本字段的推荐方法是什么?我是否必须完全放弃自动映射?或者,即使我不想特别对结果进行排序,我还是应该选择排序选项?

    最佳答案

    我最终通过以下方式接近了想要的目标:

  • 明确告诉我的查询包括_source存储的字段-似乎不会返回if you use any script fields you need to do this或_source /文档。
  • [ElasticsearchType(Name = "User")]属性添加到我的搜索结果子类

  • 通过结果中的Hits枚举时的
  • ,访问我的脚本字段:
    ((JArray)item.Fields["distance"]).Value<double>(0) / 1609.344 
    

  • 如果有人有更清洁的方法,请告诉我!

    关于c# - 如何在Elasticsearch上使用NEST进行的查询中访问脚本字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45613363/

    相关文章:

    elasticsearch - 如何将时间添加到 Elasticsearch 快照名称?

    C# 正则表达式 - 有或无

    c# - AppDomain 创建 : Resolving "Could not load file or assembly" error

    c# - 当文本包含方括号时出现问题(可能还有其他特殊字符)

    .net - 解决循环依赖

    c# - 从 InstallAware 或 InstallShield 调用 dll 函数

    elasticsearch - Elasticsearch 的 NEST 查询不起作用

    elasticsearch - 索引到Elasticsearch具有奇怪的行为并产生意外结果

    c# - 为什么这个 ThreadPool.QueueUserWorkItem 代码没有让我的测试失败?

    c# - 选择一个不在 LINQ 中的 Group By 子句中的字段