gpt4 book ai didi

c# - 具有包含Must,Must_Not和Should条件的过滤器的MultiMatch ElasticSearch查询

转载 作者:行者123 更新时间:2023-12-02 23:13:17 28 4
gpt4 key购买 nike

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

这是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中还有其他两种编写 bool(boolean) 查询的方式。值得检查 docs

更新

您可以使用以下方法处理范围查询
.Range(r => r.Field(f => f.CoverDateStartYear).GreaterThanOrEquals(1946).LessThanOrEquals(1975))

希望能有所帮助。

关于c# - 具有包含Must,Must_Not和Should条件的过滤器的MultiMatch ElasticSearch查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58118711/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com