等价于嵌套查询的嵌套查询

问题描述 投票:2回答:2

我是点网核心的新手。我正在使用https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/nest.html作为弹性搜索客户端。

我对弹性搜索中的书面查询有以下查询:

{
    "query": {
        "bool":{
         "must":[
            {
               "term":{
                  "bookId.keyword":"c962ec04-6d25-4823-8e78-6d99d4072032"
               }
            },
            {
               "bool":{
                  "should":[
                     {
                        "match_phrase":{
                         "text":"Plants"
                        }
                     }
                  ]
               }
            }
         ]
      }
    }
}

虽然我的NEST代码是:

 var searchResponse = await _esClient.SearchAsync<Content>(s => s
                .Query(q => q
                    .Bool(b => b
                        .Must(m => m
                            .Term(terms => terms.Field(
                                    field => field.BookId.Suffix("keyword")
                                ).Value(bookId.ToString())
                            )
                        )
                        .Must(should =>
                            should.Match(mp => mp.Field(f => f.Text).Query(query))
                        )
                    )
                ));

但是我无法获得预期的结果。有人可以帮我吗?

c# elasticsearch .net-core nest
2个回答
2
投票

您的NEST查询与DSL查询不完全匹配。请修改您的查询以符合以下条件。

var searchResponse = await _esClient.SearchAsync<Content>(s => s
    .Query(q => q
        .Bool(b => b
            .Must(m => m
                .Term(terms => terms
                    .Field(field => field
                        .BookId.Suffix("keyword"))
                        .Value(bookId.ToString())
                ) && m.Bool(mb => mb
                    .Should(sh => sh
                        .MatchPhrase(mp => mp
                           .Field(f => f.Text).Query(query))))
                    )
                )
            ));

0
投票

几乎知道了。 Must()接受查询params[],而不是多次调用

var searchResponse = await _esClient.Search<Content>(s => s
   .Query(q => q
       .Bool(b => b
           .Must(m => m
               .Term(terms => terms.Field(
                       field => field.BookId.Suffix("keyword")
                   ).Value(bookId.ToString())
               ), m => m
               .Bool(mb => mb
                   .Should(sh => sh
                       .MatchPhrase(mp => mp
                           .Field(f => f.Text)
                           .Query(query)
                       )
                   )
               )
           )
       )
   )
);

Mahesh's answer是使用操作符重载编写此查询的更简洁的方法。

© www.soinside.com 2019 - 2024. All rights reserved.