我有一个ES类型课程,包含2个可选字段培训师和 trainingCompany ,以便在每个文档中我们都有培训师或 trainingCompany 不是两者。
我尝试过此查询来过滤培训师和/或培训公司的课程:
"query": {
"bool": {
"must_not": [
{
"terms": {
"trainingCompany.slug": [
"company-slug"
]
}
},
{
"terms": {
"trainer.slug": [
"trainer-slug"
]
}
}
]
}
}
但是,我得到了所有文件作为回报。 我认为我需要一个存在来检查每个字段是否存在,但仍然无法弄明白。
如果需要,这是一个示例课程:
{
"title": "title",
"description": "description",
"slug": "slug",
"duration": 10,
"language": "EN",
"price": 1500,
"trainingCompany": {
"name": "The Bridge",
"slug": "The-Bridge",
}
}
{
"title": "title",
"description": "description",
"slug": "slug",
"duration": 1,
"language": "FR",
"price": 500,
"trainer": {
"firstname": "Jemli",
"lastname": "Fathi",
"slug": "Jemli-Fathi",
"photo": "url"
}
}
答案 0 :(得分:2)
根据您的映射,您应该使用keyword
子字段,如下所示:
"query": {
"bool": {
"must_not": [
{
"terms": {
"trainingCompany.slug.keyword": [
"company-slug"
]
}
},
{
"terms": {
"trainer.slug.keyword": [
"trainer-slug"
]
}
}
]
}
}