gpt4 book ai didi

elasticsearch - 即使 Elasticsearch 中缺少某些字段也可以搜索文档

转载 作者:行者123 更新时间:2023-12-03 00:54:21 28 4
gpt4 key购买 nike

我想根据centerIdcourseIdbatchId搜索学生。例如我有如下学生数据。

{
"s1":{
"name":alex,
"centerId":"N001",
"courseId":"ncjava",
"batchId":"nb1"},

"s2":{
"name":John,
"centerId":"N001",
"courseId":"nc02",
"batchId":"ncb2"},

"s3":{
"name":David,
"centerId":"N001",
"courseId":"ncjava",
}
}

现在我想搜索 centerIdcourseIdbatchId匹配的学生,甚至想要具有 centerIdcourseId匹配但缺少 batchId的学生。我写下面的查询
{
"query": {
"bool": {"must": [
{
"match": {
"centerId":"N001"
}},
{ "match": {
"courseId": "ncjava"
}}
],
"should":[
{
"match": {
"batchId": "nb1"
}
}
]
}
}

}

该查询返回与 centerIdcourseId匹配的所有学生。但这也会让我返回具有不同“batchId”的学生。我只希望 batchId匹配或不存在时才是学生。

最佳答案

您可以添加查询词“ bool(boolean) ”,以使逻辑“或”符合您的需要。 batchId = X OR batchId is missing可以用should表达式表示(而batchId is missing可以用must_notexists表示),如下所示:

{
"query": {
"bool": {
"must": [
{
"match": {
"centerId": "N001"
}
},
{
"match": {
"courseId": "ncjava"
}
},
{
"bool": {
"minimum_should_match": 1,
"should": [
{
"match": {
"batchId": "nb1"
}
},
{
"bool": {
"must_not": {
"exists": {
"field": "batchId"
}
}
}
}
]
}
}
]
}
}
}

您可以将 must视为“and”,将 should视为“or”(尽管比boolean or更灵活),而 must_not则视为 bool(boolean) “not”。因此,以上查询的含义类似于 centerId == N001 AND courseId == ncjava AND (batchId == nb1 OR NOT exists batchId)

在这种特定的上下文中,实际上不需要 minimum_should_match(默认行为已经是您想要的),但是由于该行为在不同的上下文中有所不同,因此我希望明确地包含它,以防在查询中以意外方式编辑 future (尽管上下文已更改,但 should的行为将保持不变)。 minimum_should_match为1意味着 should子句中的至少1个必须匹配。

这是这些组件中每个组件的文档:

bool query
exists query
minimum_should_match

关于elasticsearch - 即使 Elasticsearch 中缺少某些字段也可以搜索文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46708196/

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