我有这个有点复杂的ElasticSearch查询有5个条件,我需要每个条件1个文档,另外1个文件不能返回两个条件。
所以我尝试了两种不同的方法
首次多人搜索
GET /products/_msearch
{}
{"query": {"function_score":{"query":{"bool":{"must":{ "match":
{"category":"1"}},"must_not":[{"ids":{"values":
["7DhlWxCY4oQyo8884AIS4Y","3fy0uSuMROSoCQueGA2uO4"]}}]}},
"random_score":{"seed":1376718000}}},"from":0,"size":1}
{}
{"query": {"function_score":{"query":{"bool":{"must":{ "match":
{"category":"2"}},"must_not":[{"ids":{"values":
["7DhlWxCY4oQyo8884AIS4Y","3fy0uSuMROSoCQueGA2uO4"]}}]}},
"random_score":{"seed":1376718000}}},"from":0,"size":1}
所以我需要从1类和2类中分别查询1个产品,但我需要过滤我已购买的所有产品,此外产品可以同时属于1类和2类,但我不想从两个查询中接收相同的产品。
但我写的这个查询实际上可以从两个类别中返回相同的产品。
我采取的第二种方法是尝试像这样的普通搜索
GET /products/product/_search
{
"query": {
"bool": {
"must":{
"bool": {
"must":[
{ "match":{"category":"1"} } ,
{ "match":{"category":"2"} }
]
}
},
"must_not": [{
"ids": {
"values": [
"7DhlWxCY4oQyo8884AIS4Y",
"3fy0uSuMROSoCQueGA2uO4"
]
}
}]
}
}
}
但是,这当然只返回两个类别的产品。
所以任何想法如何完成我的案例
根据Val
的评论,我提出了这个问题
GET /products/product/_search
{
"aggs" : {
"categories" : {
"terms" : { "field" : "category" },
"aggs": {
"top": {
"top_hits": {
"size" : 1
}
}
}
}
}
}
但这只会返回所有内容,所以我想我做错了什么,但我刚开始与ES合作,我不知道是什么
答案 0 :(得分:0)
试试这个:
{
"size": 0,
"aggregations": {
"myAgg": {
"filters": {
"filters": {
"cat1": {
"term": {
"category": "1"
}
},
"cat2": {
"term": {
"category": "2"
}
}
}
},
"aggregations": {
"top": {
"top_hits": {
"size": 1
}
}
}
}
}
}
你将获得两个桶,每个类别一个,每个桶只有一个。
如果您想扩展搜索每个类别并按特定字段排除,请尝试以下操作:
{
"size": 0,
"aggregations": {
"myAgg": {
"terms": {
"field": "category"
},
"aggregations": {
"bool_agg": {
"filter": {
"bool": {
"must_not": {
"terms": {
"ids": [
"7DhlWxCY4oQyo8884AIS4Y",
"3fy0uSuMROSoCQueGA2uO4"
]
}
}
}
},
"aggregations": {
"top": {
"top_hits": {
"size": 1
}
}
}
}
}
}
}
}
现在,您将获得每个类别的信息,其中包含相关搜索的一个热门信息。