在Elasticsearch中为每个条件获取一个文档

时间:2017-07-26 12:35:11

标签: elasticsearch

我有这个有点复杂的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合作,我不知道是什么

1 个答案:

答案 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
              }
            }
          }
        }
      }
    }
  }
}

现在,您将获得每个类别的信息,其中包含相关搜索的一个热门信息。

相关问题