我们说我们的电子商务商店数据索引,我们希望得到2家商店中存在的产品列表的差异。
有关索引内容的信息:存储在每个文档中的示例数据如下所示:
{
"product_name": "sample 1",
"store_slug": "store 1",
"sales_count": 42,
"date": "2018-04-04"
}
下面的查询可以让我分别在2家商店中找到所有产品,
Data for store 1
curl -XGET 'localhost:9200/store/_search?pretty' -H 'Content-Type: application/json' -d'
{
"_source": ["product_name"],
"query": {
"constant_score" : {
"filter" : {
"bool" : {
"must" : [
{ "term" : { "store_slug" : "store_1"}}]}}}}}'
Data for store 2
curl -XGET 'localhost:9200/store/_search?pretty' -H 'Content-Type: application/json' -d'
{
"_source": ["product_name"],
"query": {
"constant_score" : {
"filter" : {
"bool" : {
"must" : [
{ "term" : { "store_slug" : "store_2"}}]}}}}}'
弹性搜索查询是否可以获得两种结果的差异(不使用某些脚本/其他语言)?
E.g。以上操作:让我们说"存储1"正在销售产品["产品1","产品2"]和"商店2"正在销售产品["产品1","产品3"],因此预期产品的差异输出"商店1"和"存储2"是"产品2"。
答案 0 :(得分:0)
为什么不在一个查询中执行此操作?
商店1但商店2中没有的商品:
curl -XGET 'localhost:9200/store/_search?pretty' -H 'Content-Type: application/json' -d '{
"_source": [
"product_name"
],
"query": {
"constant_score": {
"filter": {
"bool": {
"filter": [
{
"term": {
"store_slug": "store_1"
}
}
],
"must_not": [
{
"term": {
"store_slug": "store_2"
}
}
]
}
}
}
}
}'
你也可以轻松地做相反的事情。
更新
阅读更新后,我认为解决此问题的最佳方法是使用terms
聚合,首先是产品,然后是商店,只选择只有一个商店存储桶的产品(使用管道)聚集)
curl -XGET 'localhost:9200/store/_search?pretty' -H 'Content-Type: application/json' -d '{
{
"size": 0,
"aggs": {
"products": {
"terms": {
"field": "product_name"
},
"aggs": {
"stores": {
"terms": {
"field": "store_slug"
}
},
"min_bucket_selector": {
"bucket_selector": {
"buckets_path": {
"count": "stores._bucket_count"
},
"script": {
"source": "params.count == 1"
}
}
}
}
}
}
}'