具有过滤器的MustMatch ElasticSearch查询,具有Must,Must_Not和Should条件

问题描述 投票:0回答:1

我正在研究POC,以使用ElasticSearch.Net和Nest客户端在C#中包括带有ElasticSearch(v7.3)的搜索。我正在尝试在Nest Query DSL中构建Json查询以获取一些数据。

这是Json查询:

{
    "query": {
    "bool": {
        "must": [
        {
          "multi_match": {
            "query": "human",
            "analyzer": "standard",
            "type": "most_fields",
            "fields": [
              "hasParts.levelProperties.pageTranscript^100",
              "contentTitle^90",
              "documentTitle^80",
              "pageTranscript^70"
            ]
          }
        }
      ],
      "filter": {
        "bool": {
          "must": [
            { "term" : { "documentLevel" : 1 } }
          ],
          "must_not": [
            { "term" : { "moduleNumber" : 4 } } 
          ],
          "should" : [
                {
                    "bool" :{
                        "must" : [
                            { "term" : { "coverDateStartSpecified" : true } },
                            { "term" : { "coverDateEndSpecified" : true } },
                            { 
                                "bool" : {
                                    "should" : [
                                        { "range" : { "coverDateStartYear" : { "gte" : 1946, "lte" : 1975 } } },
                                        { "range" : { "coverDateEndYear" : { "gte" : 1946, "lte" : 1975 } } }
                                    ]
                                }
                            }
                        ]
                    }
                },
                {
                    "bool" :{
                        "must" : [
                            { "range" : { "coverDateYear" : { "gte" : 1946, "lte" : 1975 } } },
                            { 
                                "bool" : {
                                    "should" : [
                                        { "term" : { "coverDateStartSpecified" : false } },
                                        { "term" : { "coverDateEndSpecified" : false } }
                                    ]
                                }
                            }
                        ]
                    }   
                }
            ]
        }
      }
    }
  }
}

这是一个非常复杂的查询,但这对于我正在研究的项目来说是正常的。

我已尝试转换查询:

 var responsedata = _connectionToEs.EsClient().Search<CrSearchContract>(s => s
                                .Size(100).Scroll(1).Query(q => q
                                    .Bool(b => b
                                        .Must(m => m
                                            .MultiMatch(mm => mm
                                                .Query("human")
                                                .Analyzer("standard")
                                                .Type(TextQueryType.MostFields)
                                                .Fields(f => f.Field(ff => ff.DocumentTitle, 80)
                                                    .Field(ff => ff.contentTitle, 90)
                                                    .Field(ff => ff.PageTranscript, 70)
                                                    .Field(ff => ff.PublicationTitle, 60)
                                                    .Field(ff => ff.HasParts[0].LevelProperties.PageTranscript, 100)
                                                )
                                            )
                                        )
                                        .Filter(fil=>fil
                                            .Bool(bl=>bl
                                                .Must(fbm=>fbm.Term(ff=>ff.Field(p=>p.DocumentLevel).Value(1)))
                                                .MustNot(fbmn=>fbmn.Term(ff=>ff.Field(p=>p.ModuleNumber).Value(4)))
                                                .Should(fbs=>fbs
                                                    .Bool(fbsb=>fbsb
                                                        .Must(fbsbm=>fbsbm
                                                            .Term(ff => ff.Field(p => p.CoverDateStartSpecified).Value(true))
                                                        )
                                                    )
                                                )                                                
                                            )
                                        )
                                    )
                                ));

我面临的问题是将JSON查询的Filter对象转换为Query DSL。每个Must,Must_Not和Should条件中都有多个Term查询,当我尝试在查询中添加时会给出错误QueryContainer doesn't contain a definition for 'Term' and no....。我究竟做错了什么?

感谢您的帮助!

c# elasticsearch nest querydsl elasticsearch.net
1个回答
0
投票

您可以这样操作

.Must(
    fbm => fbm.Term(ff => ff.Field(p => p.DocumentLevel).Value(1)), 
    fbm => fbm.Term(ff => ff.Field(p => p.DocumentLevel).Value(2)))

但是在NEST中还有其他两种编写布尔查询的方式。值得检查docs

希望有所帮助。

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