我想执行一个elasticsearch查询,它结合了两个子查询(and operator),每个子查询在不同的字段(or operator)中搜索。
例如,如果我传递“name”参数,它只在name字段(firstname+lastname)中搜索,如果我传递“contact”参数,它在contact字段(contactemail+contacttelephone)中搜索。
下面的代码返回:
如果name为null但提供了contact,则返回所有结果(应仅返回正确的部分)
如果contact为null但提供了name,则返回所有结果(应仅返回左侧部分)
联合结果(或运算符),如果提供了名称和联系人值(应返回left intersect right)
searchQuery = searchQuery
.MinScore(minScore)
.Query(qu => qu
.Bool(b => b
.Must(m => m
.MultiMatch(mm=> mm
.Fields(fs=> fs
.Field(f => f.Firstname)
.Field(f => f.Lastname)
)
.Query(name)
.Operator(Operator.Or)
)
)
.Must(m => m
.MultiMatch(mm => mm
.Fields(fs => fs
.Field(f => f.ContactEmail)
.Field(f => f.ContactTelephone)
)
.Query(contact)
.Operator(Operator.Or)
)
)
)
);
我正在使用 Must
因为我想要相关的分数。
我认为有两个问题:应用and而不是or,如果条件为空则忽略子查询。你知道吗?
1条答案
按热度按时间7bsow1i61#
must子句中的两个查询必须是同一查询的一部分
.Must()
打电话。鉴于以下poco
查询应该如下所示
产生以下结果
如果其中一个
name
或者contact
是null
,则该查询将被忽略。例如,设置name
至null
```string name = null;
var response = client.Search(s => s
.MinScore(minScore)
.Query(qu => qu
.Bool(b => b
.Must(m => m
.MultiMatch(mm => mm
.Fields(fs => fs
.Field(f => f.Firstname)
.Field(f => f.Lastname)
)
.Query(name)
.Operator(Operator.Or)
), m => m
.MultiMatch(mm => mm
.Fields(fs => fs
.Field(f => f.ContactEmail)
.Field(f => f.ContactTelephone)
)
.Query(contact)
.Operator(Operator.Or)
)
)
)
)
);
{
"min_score": 2.0,
"query": {
"bool": {
"must": [
{
"multi_match": {
"fields": [
"contactEmail",
"contactTelephone"
],
"operator": "or",
"query": "contact"
}
}
]
}
}
}
var response = client.Search(s => s
.MinScore(minScore)
.Query(qu => qu
.Bool(b => b
.Must(m =>
{
if (name == null)
return m;
);