必须匹配两个不同的术语

时间:2018-02-22 11:07:04

标签: elasticsearch

我希望过滤两组数据匹配的结果 当我指定"应该"但不是"必须" 这是我的查询按预期工作只有一个"匹配"但如果我添加一秒钟我没有点击,那么索引中的肯定记录有productSpecification.value of Brand和3年

"query": {
"bool": {
  "should": [
    {
      "multi_match": {
        "query": "control*",
        "fields": [
          "name^15",
          "description^5",
          "productCode"
        ]
      }
    }
  ]
}

}

"post_filter": {
"nested": {
  "path": "productSpecification",
  "query": {
    "bool":{
        "must": [
            {
                "match": {
                    "productSpecification.value":"3 years"
                }
            },
            {
                "match": {
                    "productSpecification.value":"Brand"
                }
            }
        ]           
    }        
  }
  }
}

}

现在尝试不同的JSON组合试图让它返回一些值,只是把我的头撞在桌子上

{
"myindex": {
    "mappings": {
        "product": {
            "properties": {
                "description": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "dispatchTimeInDays": {
                    "type": "integer"
                },
                "height": {
                    "type": "integer"
                },
                "html": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "leadTimeInDays": {
                    "type": "integer"
                },
                "length": {
                    "type": "integer"
                },
                "limitedStock": {
                    "type": "boolean"
                },
                "name": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "notes": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "price": {
                    "type": "double"
                },
                "productBrandId": {
                    "type": "integer"
                },
                "productCategory": {
                    "properties": {
                        "code": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "fullPath": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "name": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "parentProductCategoryId": {
                            "type": "integer"
                        },
                        "productCategoryId": {
                            "type": "integer"
                        }
                    }
                },
                "productCategoryId": {
                    "type": "integer"
                },
                "productCode": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "productId": {
                    "type": "integer"
                },
                "productImage": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "productSpecification": {
                    "type": "nested",
                    "properties": {
                        "description": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "name": {
                            "type": "keyword"
                        },
                        "productId": {
                            "type": "long"
                        },
                        "productSpecificationId": {
                            "type": "long"
                        },
                        "specificationId": {
                            "type": "long"
                        },
                        "value": {
                            "type": "keyword"
                        }
                    }
                },
                "productTypeId": {
                    "type": "integer"
                },
                "reviewRating": {
                    "type": "double"
                },
                "reviewRatingCount": {
                    "type": "integer"
                },
                "sellingPriceGroupId": {
                    "type": "integer"
                },
                "stockAvailable": {
                    "type": "integer"
                },
                "taxRateId": {
                    "type": "integer"
                },
                "url": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "weightKg": {
                    "type": "double"
                },
                "width": {
                    "type": "integer"
                }
            }
        }
    }
}

}

以下是我希望通过此查询返回的产品示例,它的productSpecification.value为" 3年"和"品牌"

的productSpecification.value
{
"_index": "myindex",
"_type": "product",
"_id": "uQEDbGEBfHre1rYmtsWB",
"_score": 141.5985,
"_source": {
    "productId": 14587,
    "name": "Brand Wave Multi Channel Remote Control",
    "productCode": "111",
    "productCategoryId": 17,
    "length": 3,
    "height": 0,
    "productTypeId": 1,
    "url": "brand-wave-multi-channel-remote-control",
    "productBrandId": 3,
    "width": 0,
    "dispatchTimeInDays": 3,
    "leadTimeInDays": 3,
    "stockAvailable": 0,
    "weightKg": 0.001,
    "reviewRatingCount": 0,
    "limitedStock": false,
    "price": 63,
    "productImage": "Wave-Remote-Control.jpg",
    "productCategory": {
        "productCategoryId": 17,
        "name": "Accessories",
        "fullPath": "Accessories",
        "code": "00011"
    },
    "productSpecification": [{
            "productSpecificationId": 852888,
            "productId": 14587,
            "specificationId": 232,
            "name": "Brand",
            "description": "This is the product manufacturer",
            "value": "Brand"
        },
        {
            "productSpecificationId": 852889,
            "productId": 14587,
            "specificationId": 92,
            "name": "Type",
            "value": "Remote control"
        },
        {
            "productSpecificationId": 852891,
            "productId": 14587,
            "specificationId": 10,
            "name": "Guarantee",
            "value": "3 years"
        },
        {
            "productSpecificationId": 852892,
            "productId": 14587,
            "specificationId": 599,
            "name": "Power Voltage",
            "value": "1.5 V"
        },
        {
            "productSpecificationId": 852893,
            "productId": 14587,
            "specificationId": 29,
            "name": "Dimensions",
            "value": "157mm x 38mm x 19mm"
        },
        {
            "productSpecificationId": 852894,
            "productId": 14587,
            "specificationId": 602,
            "name": "Operation Range",
            "value": "Up to 40m"
        },
        {
            "productSpecificationId": 852895,
            "productId": 14587,
            "specificationId": 601,
            "name": "Power Supply",
            "value": "3V DC; 2 x AAA batteries"
        }
    ]
}

}

经过多次修改,我的查询现在就像

{
"size": 100,


"aggs": {
    "specifications": {
      "nested": {
        "path": "productSpecification"
      },
      "aggs": {
        "groups": {
          "terms": {
            "field": "productSpecification.name"
          },
          "aggs": {
            "attribute": {
              "terms": {
                "field": "productSpecification.value"
              }
            }
          }
        }
      }
    },
    "price_range": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "to": 50
          },
          {
            "from": 50,
            "to": 100
          },
          {
            "from": 100,
            "to": 150
          },
          {
            "from": 150,
            "to": 200
          },
          {
            "from": 200,
            "to": 250
          },
          {
            "from": 250
          }
        ]
      }
    }
  },
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "control*",
            "fields": [
              "name^15",
              "description^5",
              "productCode"
            ]
          }
        }
      ]
    }
  },
  "post_filter": {
    "query":{
    "nested": {
      "path": "productSpecification",
      "query": {
        "bool":{
            "should": [{
                "bool": {
                    "must":[{
                        "term": {
                            "productSpecification.name.keyword": "Brand"
                        }
                    },
                    {
                        "term": {
                            "productSpecification.value": "Brand"
                        }
                    }
                    ]
                }
            },
            {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "productSpecification.name.keyword": "Guarantee"
                            }
                        },
                        {
                            "term": {
                                "productSpecification.value": "3 years"
                            }
                        }
                    ]
                }
            }
        ]
      }
      }
    }
  }
  }
  }

2 个答案:

答案 0 :(得分:0)

productSpecification.value是关键字数据类型。您应该使用术语查询而不是匹配来查询它。然后你就不能使用必须,因为如果一个doc拥有品牌作为价值也不能有3年的价值。在您的情况下,您将使用should,因为是OR逻辑运算符

    {
  "query": {
    "nested": {
      "path": "productSpecification",
      "query": {
        "bool": {
          "should": [
            {
              "bool": {
                "must": [
                  {
                    "term": {
                      "productSpecification.name.keyword": "Brand"
                    }
                  },
                  {
                    "term": {
                      "productSpecification.value": "Brand"
                    }
                  }
                ]
              }
            },
            {
              "bool": {
                "must": [
                  {
                    "term": {
                      "productSpecification.name.keyword": "Guarantee"
                    }
                  },
                  {
                    "term": {
                      "productSpecification.value": "3 years"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

答案 1 :(得分:0)

经过大量的实验/阅读后,终于有了这个工作 发布在这里,以防其他有类似问题的人使用

{

"post_filter": {
    "bool": {
        "filter": [{
                "nested": {
                    "path": "productSpecification",
                    "query": {
                        "bool": {
                            "filter": [{
                                    "term": {
                                        "productSpecification.name": "Brand"
                                    }
                                },
                                {
                                    "terms": {
                                        "productSpecification.value": [
                                            "Brand1"
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                }
            },
            {
                "nested": {
                    "path": "productSpecification",
                    "query": {
                        "bool": {
                            "filter": [{
                                    "term": {
                                        "productSpecification.name": "Guarantee"
                                    }
                                },
                                {
                                    "terms": {
                                        "productSpecification.value": [
                                            "3 years"
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        ]
    }
}

}