C# Elasticsearch.NET中的复合查询

C# Elasticsearch.NET中的复合查询,c#,nest,C#,Nest,假设我有一个索引,其中有一堆顺序对象 类顺序 { int CustomerId{get;set;} DateTime OrderDate{get;set;} //其他领域 } 对于特定的客户ID,我可以通过以下查询找到客户的最后一个订单: IElasticClient客户端; 异步任务GetLastOrder(int customerId) { var searchResponse=await client.SearchAsync(s=>s .Query(q=>q .术语(f=>f .Fiel

假设我有一个索引,其中有一堆
顺序
对象

类顺序
{
int CustomerId{get;set;}
DateTime OrderDate{get;set;}
//其他领域
}
对于特定的客户ID,我可以通过以下查询找到客户的最后一个订单:

IElasticClient客户端;
异步任务GetLastOrder(int customerId)
{
var searchResponse=await client.SearchAsync(s=>s
.Query(q=>q
.术语(f=>f
.Field(e=>e.CustomerId)
.术语(客户ID))&&q
.DateRange(r=>r
.Field(e=>e.OrderDate)
.LessThan(DateMath.Now)))
.Sort(o=>o
.降序(e=>e.OrderDate))
.尺寸(1);
返回searchResponse.ApiCall.Success
?searchResponse.Documents.First()
:null;
}
但是,为了支持数据加载器模式,我想查询由多个客户发出的最后一个订单,该订单由一组客户ID提供。我是这样开始的:

异步任务GetLastOrders(IEnumerable CustomerID) { var searchResponse=await client.SearchAsync(s=>s .Query(q=>q .术语(f=>f .Field(e=>e.CustomerId) .条款(客户ID))&&q .DateRange(r=>r .Field(e=>e.OrderDate) .LessThan(DateMath.Now))) .Sort(o=>o .降序(e=>e.OrderDate)) .尺寸(1); 返回searchResponse.ApiCall.Success ?searchResponse.Documents.ToDictionary(i=>i.CustomerId) :新字典(); } 不幸的是,这不起作用,因为它只返回整个查询的第一条记录,这将只返回一个
订单
。如何修改此查询以返回每个客户ID的一个
订单

可用于返回字段的最高记录

await _client.SearchAsync<Order>(s => s
                                        .Query(q => q
                                        .Terms(f => f
                                        .Field(e => e.CustomerId)
                                        .Terms(cuIds)) && q
                                        .DateRange(r => r
                                                         .Field(e => e.OrderDate)
                                                         .LessThan(DateMath.Now)))
                                        .Sort(o => o
                                              .Descending(e => e.OrderDate))
                                        .Collapse(c => c.Field(e => e.CustomerId))
                                        .Size(10)
                                        );

您正在尝试将ElasticSearch用作数据库吗?在这条路上有一个痛苦的世界。我建议使用数据库进行数据库搜索,使用ElasticSearch进行搜索。@StephenCleary不太适合。我的实际问题与订单无关,但由于IT策略,我无法粘贴实际代码。这是一个合适的模拟。我想在确认之前测试一下。的确如此!非常感谢!很高兴能帮上忙
{
  "collapse": {
    "field": "customerId"
  },
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "customerId": [
              1,
              2
            ]
          }
        },
        {
          "range": {
            "orderDate": {
              "lt": "now"
            }
          }
        }
      ]
    }
  },
  "size": 10,
  "sort": [
    {
      "orderDate": {
        "order": "desc"
      }
    }
  ]
}