【问题标题】:How to convert my DSL aggregation query to NEST aggregation elastic client query?如何将我的 DSL 聚合查询转换为 NEST 聚合弹性客户端查询?
【发布时间】:2022-08-09 12:02:15
【问题描述】:

这是我从前端编写的 DSL 查询;但是,由于我们需要更新 arch,我们必须从 \'c#\' 端进行查询。

{
  \"query\": {
    \"query_string\": {
      \"fields\": [
        \"siteId\"
      ],
      \"query\": \"SE0*\"
    }
  },
  \"aggs\": {
    \"total\": {
      \"cardinality\": {
        \"field\": \"linkId.keyword\"
      }
    },
    \"los_counts\": {
      \"terms\": {
        \"field\": \"linkId.keyword\",
        \"size\": \"10000\"
      },
      \"aggs\": {
        \"los\": {
          \"filters\": {
            \"filters\": {
              \"los_true\": {
                \"match\": {
                  \"losFlag\": \"Y\"
                }
              },
              \"los_false\": {
                \"bool\": {
                  \"must_not\": {
                    \"match\": {
                      \"losFlag\": \"Y\"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  \"collapse\": {
    \"field\": \"linkId.keyword\"
  }
}

对于前面提到的 DSL 客户端的有效负载查询,我测试了以下 NEST 弹性客户端 \'c#\' 查询。

    await _elasticClient.SearchAsync<T>(s => s
                                 .Index(indexName)
                                 .Take(10000)
                                 .Query(q => (q
                                          .MultiMatch(m => m
                                          .Fields([\"siteId\"])
                                          .Query(\"SE0\")
                                           )))
                                 .Aggregations(ag => ag
                                    .Cardinality(\"total\", ca => ca.Field(\"linkId.keyword\"))
                                    .Terms(\"los_counts\",tr=>tr.Field(\"linkId.keyword\")
                                    .Aggregations(agg=>agg.Filters(\"los\",fi=>fi.)) 
                                    /*  */
                                    )
                                    )
    
                                 .Collapse(col => col.Field(\"linkId.keyword\"))
                                 ).ConfigureAwait(false);

我在评论区被抓到,无法再次访问“过滤器”内的“过滤器”。那么,我们如何在这里转换呢?

    标签: c# asp.net-core generics nest


    【解决方案1】:

    试试这个Filters Aggregation

    .Aggregations(agg => agg.Filters("projects_by_state",
                         agg => agg.NamedFilters(filters => filters                                                                                  
                                               .Filter("los_true", f => f.Match(p =>p.Field("losFlag").Query("Y")))                                                                                  
                                               .Filter("los_false", f =>f.Bool(p=>p.MustNot(b=>b.Match(p => p.Field("losFlag").Query("Y")))))
                                                                             )
                                                                        )
                                                  )
    

    【讨论】:

    • 收到错误“System.ArgumentException: ''total' 是保留的聚合关键字之一,我们使用基于启发式的响应解析器,使用这些保留的关键字可能会偏离其启发式。我们正在研究 Elasticsearch 本身的解决方案,以使响应可解析。现在这些都是保留的,所以我将它作为“total.keyword”发送,然后得到“No Data found”异常
    • 您可以添加完整查询以及要复制的示例数据吗
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多