【问题标题】:How to apply multiple conditions when querying the ElasticSearch server using NEST library?使用 NEST 库查询 ElasticSearch 服务器时如何应用多个条件?
【发布时间】:2021-06-20 18:50:12
【问题描述】:

我有一个ElasticSearch 服务器,我想使用C# NEST library 进行查询。

这是我要生成的命令

GET /records/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "available": true
          }
        },
        {
          "match": {
            "out_scope": false
          }
        }
      ]
    }
  }
}

这是我所做的,我似乎找不到指定字段名称和要搜索的值的正确方法。

var products = await client.SearchAsync<Product>(x => 
                    x.Query(q => 
                        q.Bool(b => 
                            b.Should(bs1 => 
                                bs1.Match(bsm => 
                                    bsm.Field(fff => fff.IsAvailable)
                                       .Term(isAvailable.Value) // This does not work!
                                       ),
                                bs2 =>
                                bs2.Match(bsm =>
                                    bsm.Field(fff => fff.IsAvailable)
                                       .Term(isAvailable.Value) // This does not work!
                                       )
                                )
                            );

如何正确指定字段名称和要匹配的值?

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    假设一个模型像

    public class Product
    {
        [Keyword(Name = "available")]
        public bool? IsAvailable { get; set; }
        
        [Keyword(Name = "out_scope")]
        public bool? OutScope { get; set; }
    }
    

    那就是

        var searchResponse = await client.SearchAsync<Product>(x => x
            .Query(q =>
                q.Bool(b =>
                    b.Should(bs1 =>
                        bs1.Match(bsm =>
                            bsm.Field(fff => fff.IsAvailable)
                               .Query(isAvailable.Value ? "true" : "false")
                               ),
                        bs2 =>
                        bs2.Match(bsm =>
                            bsm.Field(fff => fff.OutScope)
                               .Query(isAvailable.Value ? "true" : "false")
                            )
                        )
                    )
                )
            );
    

    需要考虑的一些事项:

    1. match query 的查询输入是 .Query 字段/方法。所示的 JSON DSL 示例使用简写形式来表达查询; NEST 始终生成长格式。
    2. 匹配查询的查询输入最终被强制转换为 Elasticsearch 中的字符串。客户端将其公开为字符串参数。
    3. term query 看起来可能是用于此示例的更好查询;术语查询不会像匹配查询那样进行分析。词条查询等词条级查询适用于结构化搜索。
    4. NEST 在查询中重载运算符,以使编写 bool 查询更加简洁。上面也可以写成
    var searchResponse = client.Search<Product>(x => x
        .Query(q => q
            .Match(bsm => bsm
                .Field(fff => fff.IsAvailable)
                    .Query(isAvailable.Value ? "true" : "false")
                ) || q
            .Match(bsm => bsm
                .Field(fff => fff.OutScope)
                .Query(isAvailable.Value ? "true" : "false")
            )
        )
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多