多重匹配弹性搜索查询,过滤器具有必须、Must_Not和应该条件



我正在研究一个 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_Not和应该条件中都有多个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 中编写布尔查询的方法。值得检查文档。

更新

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

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

希望有帮助。

相关内容

  • 没有找到相关文章

最新更新