【问题标题】:How to append two SearchDescriptors in NEST如何在 NEST 中附加两个 SearchDescriptor
【发布时间】:2022-05-17 02:42:23
【问题描述】:

我正在从客户端获取输入以使用 NEST 构建弹性搜索查询。我从基础开始,如下所示:

var search = esClient.Search<MyData>(s => s
    .From(pageNum * pageSize)
    .Take(pageSize)
    .QueryRaw(@"{""match_all"": {} }")

然后我解析请求并查看是否传入了可选的排序参数。如果是,我创建一个新的SearchDescriptor&lt;MyData&gt;() 来执行请求的排序,我想将它添加到我原来的search 标准.显然.Search()实际上会执行一个HTTP调用,所以它不可能像今天这样发生,但是我怎样才能将一系列SearchDescriptor调用粘在一起,然后在最后执行搜索呢?

【问题讨论】:

  • 您能否描述一下您希望纳入搜索的参数类型? ES 和 Nest 允许您在调用中添加大量自定义内容,需要更多信息来了解您希望实现的内容。
  • @DanielHoffmann-Mitscherling 好吧,用户将传入一个查询字符串供我们放入QueryRaw,但也将(可选)传入一个单独的字符串,表示要排序的字段,和一个单独的字符串,表示排序顺序(asc/desc)。最后,分面类型和分面内容。

标签: c# elasticsearch nest


【解决方案1】:

您可以按如下方式逐步构建SearchDescriptor。我使用聚合而不是构面(现在已弃用),但我希望你能明白。

var sd = new SearchDescriptor<MyData>();

sd = sd.QueryRaw(<raw query string>);

if (<should sort>)
{
    string fieldToBeSortedOn; // input from user
    bool sortInAscendingOrder; // input from user
    if (sortInAscendingOrder)
    {
        sd = sd.Sort(f => f
            .Ascending()
            .OnField(fieldToBeSortedOn));
    }
    else
    {
        sd = sd.Sort(f => f
            .Descending()
            .OnField(fieldToBeSortedOn));
    }
}

if (<should compute aggregations>)
{
    sd = sd.Aggregations(a => a
        .Terms(
            "term_aggs", 
            t => t
                .Field(<name of field to compute terms aggregation on>)));
}

var search = esClient.Search<MyData>(s => sd);

【讨论】:

    猜你喜欢
    • 2022-09-24
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2020-01-06
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多