我对ElasticSearch比较新,我需要一些建议。 经过几次尝试,我没有找到解决方案,这就是我需要你的原因。
我想根据文档内容进行条件查询。
让我解释一下,我在ES中有这些文件:
{
"name": "Product n°1",
"type": "Mail",
"sub": "Letter"
},
{
"name": "Product n°2",
"type": "Video",
"sub": null
},
{
"name": "Product n°3",
"type": "Mail",
"sub": "Postcard"
}
用户可以按类型进行过滤,也可以使用复选框进行过滤(因此,用户可以同时搜索多个类型和子类)
被修改
客户可以通过复选框选择他们想要从ES获得的产品类型(例如:视频,图像,邮件),他们可以选择所有产品。
"文件" type有4种子类型:Letter,Postal Card,Paper,Printed,他们也可以选择要检索的子类型。
因此,我们承认客户选择了视频和邮件,并将Letter作为邮件的子类型。
我希望ES返回所选类型中的所有文档,当文档是" Mail"时,只返回信件。类型。
对不起我的错误,我对ES很新。
感谢你们所有人的帮助!
更新2
这是我对Andrei Stefan解决方案的疑问
{
"query": {
"filtered": {
"query": {
"match_all": []
},
"filter": {
"bool": {
"should": [
{
"terms": {
"type": [
"Video",
"Mail"
]
}
},
{
"bool": {
"must": [
{
"term": {
"type": Mail
}
},
{
"terms": {
"sub": [
"Letters"
]
}
}
]
}
}
]
}
}
}
}
}
ES返回Video和Mail类型的所有文档,当类型为Mail时,它不会应用fillter Letters。
答案 0 :(得分:1)
到安德烈斯特凡的一千辆坦克。更新2之间的区别是我不得不删除" Mail"从第一个"应该"查询。
{
"query": {
"filtered": {
"query": {
"match_all": []
},
"filter": {
"bool": {
"should": [
{
"terms": {
"type": [
"Video"
]
}
},
{
"bool": {
"must": [
{
"term": {
"type": Mail
}
},
{
"terms": {
"sub": [
"Letters"
]
}
}
]
}
}
]
}
}
}
}
}