我有一个Product-Merchant映射,如下所示
catalog_map = {
"catalog": {
"properties": {
"merchant_id": {
"type": "string",
},
"products": {
"type": "object",
},
"merchant_name" :{
"type" : "string"
}
}
}
}
“product”包含对象,例如product_id,product_name,product_price。映射产品和商家,以便:
for merchant in Merchant.objects.all() :
products = [{"product_name" : x.product.name, "product_price" : x.price, "product_id" : x.product.id , "product_category" : x.product.category.name} for x in MerchantProductMapping.objects.filter(merchant=merchant)]
tab = {
'merchant_id': merchant.id,
'merchant_name': merchant.name,
'product': products
}
res = es.index(index="my-index", doc_type='catalog', body=tab)
数据以所需的形式顺利索引。现在,当我从给定索引查询数据时,我按以下方式执行:
GET /esearch-index/catalog/_search
{
"query": {
"bool" :{
"must": [
{"match": {
"merchant_name": {
"query": "Sir John"
}
}}],
"should": [
{"match": {
"product_name": {
"query": "Vanilla"
}
}}
]
}}
此查询为我提供了商家名称为“Sir John”的索引中所有商品的结果。但是,我希望它能够返回由“约翰爵士”出售的“香草”产品的细节。
根据某人的建议,我在查询时使用了“_source”,但这没有用。
如何从商家的整个“目录”索引中挑出单个对象的信息?
答案 0 :(得分:2)
bool查询有必须子句后,其中的所有条件都是必需的。 子句中的条件不是必需的。他们只会提高结果。 (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html#query-dsl-bool-query)
因此,回到您的查询,它将检索与merchant_name“Sir John”匹配的所有目录。这是唯一必需(必须)条件。 “Vanilla”这个名称只会将名为“Vanilla”的结果提升到顶部,因为它不是必需的。
如果您要检索“Sir John”出售的“Vanilla”,请将两个条件放在must子句中并将您的查询更改为:
{
"query": {
"bool": {
"must": [
{
"match": {
"merchant_name": {
"query": "Sir John"
}
}
},
{
"match": {
"product_name": {
"query": "Vanilla"
}
}
}
]
}
}
}