具有必须、Must_Not 和应该条件的过滤器的 MultiMatch ElasticSearch 查询

MultiMatch ElasticSearch Query with Filter having Must, Must_Not and Should Conditions

我正在开发一个 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 查询的过滤器对象转换为查询 DSL。每个 Must、Must_Not 和 Should 条件中有多个 Term 查询,当我尝试在查询中添加时会出现错误 QueryContainer doesn't contain a definition for 'Term' and no....。我究竟做错了什么?

在此先感谢您的帮助!!

你可以这样做

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

但是在 NEST 中还有其他几种编写 bool 查询的方法。值得检查 docs.

更新

您可以通过以下方式处理范围查询

.Range(r => r.Field(f => f.CoverDateStartYear).GreaterThanOrEquals(1946).LessThanOrEquals(1975))

希望对您有所帮助。