我正在尝试编写一个查询来执行以下操作:
例如:CAR索引具有以下映射:
ford
color
model
acura
color
model
toyota
color
model
toyota_type
我想编写一个可以搜索所有文档的查询 color =“blue”,和toyota_type =“a”|| “c”仅限于类型=“toyota”
棘手的部分是如果我写这样的查询,它只显示TOYOTA类型的结果,但不匹配其他类型的文档:
Looking for:
("color is blue" AND type is not toyota) OR
("color is blue" AND type IS toyota AND toyota_type = 'a' or 'c')
In other words, search ALL documents;
(1) IF type == toyota (toyota_type == 'a' or 'c' ) AND color == "blue"
(2) IF type != toyota color == "blue"
{
"bool": {
"must": [{
"term": {
"color": "blue"
}
}, {
"bool": {
"should": {
"terms": {
"toyota_type": ["a","c"]
}
}
}
}]
}
}
edit: try this and also didn't work. This returns toyota_type != ('a' or 'c')
{
"query":{
"bool": {
"must": [{
"term": {
"color":
}
}, {
"bool": {
"must_not": [{
"term": {
"color": "red"
}
}]
}
}],
"should":{
"terms":{
"toyota_type": ['a','c']
}
}
}
}
}
答案 0 :(得分:1)
您在顶级bool查询中使用must,这是对elasticsearch的AND查询。因此,查询可以转换为查找所有结果,其中"颜色为蓝色" AND" toyota_type是' a'或者' c'"。但是,据我所知,你需要的是对此的查询:"颜色为蓝色" OR" toyota_type是' a'或者' c'"。如果这是要求,您应该进行此查询。
{
"bool": {
"should": [
{
"term": {
"color": "blue"
}
},
{
"terms": {
"toyota_type": ["a","c"]
}
}
]
}
}
对于新的编辑案例,查询如下:
{
"query": {
"bool": {
"must": [
{
"term": {
"color": {
"value": "blue"
}
}
},
{
"bool": {
"should": [
{
"bool": {
"must_not": [
{
"term": {
"type": {
"value": "toyota"
}
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"type": {
"value": "toyota"
}
}
},
{
"terms": {
"toyota_type": [
"a",
"c"
]
}
}
]
}
}
]
}
}
]
}
}
}