【问题标题】:Is it possible to pass a list of queries to ElasicSearch using Nest?是否可以使用 Nest 将查询列表传递给 ElasticSearch?
【发布时间】:2021-12-05 14:12:56
【问题描述】:

我需要将复杂的查询传递给 Elasticsearch。在这个查询中会有很多范围条件,主要是日期范围。

示例如下:

query = "module : ('mod45') AND code : ('667', '456') AND startTime:[2020-10-18T13:42:17 TO 2021-10-18T13:42:17] AND endTime:[2021-02-18T13:42:17 TO 2021-09-18T13:42:17]"

modulecodestartTimeendTime 是列名)

我有以下 Elasticsearch 功能:

public async Task<IEnumerable<T>> GetQueryStringData<T>(string index, string query) where T : class
{
    var client = GetClient();

    var response = await client.SearchAsync<T>(s => s
        .Index(index)
        .Query(x => x.QueryString(a => a.Query(query))).Size(DefaultResultsSize));

    return response?.Documents;
}

是否可以更改此功能,使其可以在没有“AND”连接器的情况下接收查询条件列表?

类似这样的:

var queryList = new List<string>();

queryList.Add("module : ('mod45')");
queryList.Add("code : ('667', '456')");
queryList.Add("startTime:[2020-10-18T13:42:17 TO 2021-10-18T13:42:17]");
queryList.Add("endTime:[2021-02-18T13:42:17 TO 2021-09-18T13:42:17]");

编辑:假设我将有 100 个这样的查询,所以 lambda 在这里不起作用

【问题讨论】:

    标签: c# elasticsearch query-string nest


    【解决方案1】:

    您可以尝试使用 NEST 的 Fluent API,它使用 lambda 表达式来构造查询。

    var moduleList = new List<string>();
    moduleList.Add("mod45");
    var codeList = new List<string>();
    codeList.Add("667");
    codeList.Add("456");
    
    var response = await client.SearchAsync<T>(s => s
            .Index(index)
            .Query(q => q
                    .Bool(b => b
                                    .Must(
                                        m => m
                                            .Terms(t => t.Field("module").Terms(moduleList)),
                                        m => m
                                            .Terms(t => t.Field("code").Terms(codeList)),
                                        m => m.Bool(bs => bs
                                                .Must(ms => ms.TermRange(r => r.Field(f => f.startTime)
                                                      .GreaterThanOrEquals(new DateTime(2020, 10, 18))
                                                      .LessThanOrEquals(new DateTime(2021, 10, 18)))
                                                )
                                            ),
                                        m => m.Bool(bs => bs
                                                .Must(ms => ms.TermRange(r => r.Field(f => f.endTime)
                                                      .GreaterThanOrEquals(new DateTime(2021, 02, 18))
                                                      .LessThanOrEquals(new DateTime(2021, 09, 18)))
                                                )
                                            )
                                    )
                                )
                            )    
           .DefaultOperator(Operator.And)
           .Size(DefaultResultsSize)); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-23
      • 2016-10-10
      • 2011-01-22
      • 2021-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2017-06-25
      相关资源
      最近更新 更多