ElasticSearch结合了条款和匹配查询

时间:2018-08-06 08:16:23

标签: c# elasticsearch nest

我已经通过控制台解决了我需要的elasticsearch查询,并且它按预期工作:

                    "query": {
                    "bool": {
                        "must": [
                        { "terms": { "color": ["red", "blue"]
                            }
                        },
                        { "match": { "availability":   "in stock" }} 
                        ]
                    }
               }

我现在需要使用嵌套客户端执行此操作。我目前已经尝试过:

                nestClient.Search<Item>(
                s => s.From(query.Page).Size(query.PageSize)
                    .Query(
                        q => q.Bool(
                            b => b.Must(
                                ss => ss.Terms(t => t.Field(f => f.Color).Terms<string>(query.Color)),
                                ss => ss.Match(m => m.Field(f => f.Availability == "in stock"))))).TypedKeys(null));

但是当在提琴手中查看输出的JSON时,它似乎正在忽略查询并使用:

{"from":0,"size":24}

如果我删除了嵌套查询的match部分,则使用条件查询正确输出了JSON DSL。

可以一口气完成我想要的吗?

1 个答案:

答案 0 :(得分:2)

match query的查询值需要传递给.Query(...)方法

var query = new {
    Page = 0,
    PageSize = 10,
    Color = new [] { "red", "yellow" }
};

nestClient.Search<Item>(s => s
    .From(query.Page)
    .Size(query.PageSize)
    .Query(q => q
        .Bool(b => b
            .Must(
                ss => ss.Terms(t => t.Field(f => f.Color).Terms<string>(query.Color)),
                ss => ss.Match(m => m.Field(f => f.Availability).Query("in stock"))
            )
        )
    )
    .TypedKeys(null)
);

可以使用operator overloading on the base query type进一步缩短此时间,以更简洁地构建bool查询

nestClient.Search<Item>(s => s
    .From(query.Page)
    .Size(query.PageSize)
    .Query(q => q
        .Terms(t => t.Field(f => f.Color).Terms<string>(query.Color)) && q
        .Match(m => m.Field(f => f.Availability).Query("in stock"))
    )
    .TypedKeys(null)
);

两者都会产生以下查询

{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "color": [
              "red",
              "yellow"
            ]
          }
        },
        {
          "match": {
            "availability": {
              "query": "in stock"
            }
          }
        }
      ]
    }
  }
}

另外,对于像terms这样的term-level queries查询,查询的答案通常为是或否,例如这个词是否完全匹配,该数字是否在此数字范围内,等等。使用这样的谓词,您通常不需要为这些查询执行相关性计分阶段,而可以通过在{ {1}}上下文,例如filter查询的filter子句。将其与运算符重载一起

bool

产生

nestClient.Search<Item>(s => s
    .From(query.Page)
    .Size(query.PageSize)
    .Query(q => q
        .Terms(t => t.Field(f => f.Color).Terms<string>(query.Color)) && +q
        .Match(m => m.Field(f => f.Availability).Query("in stock"))
    )
    .TypedKeys(null)
);