我正在研究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....
。我究竟做错了什么?
感谢您的帮助!
您可以这样操作
.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。
希望有所帮助。