我正在研究一个 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))
希望有帮助。