来自ElasticSearch的唯一搜索结果

时间:2019-07-04 12:34:18

标签: elasticsearch

我是ElasticSearch的新手,无法完全弄清楚我想要的东西是否可行。

我可以这样查询:

GET entity/_search
{
  "query": {
    "bool": { 
      "must": [
        { "match": { "searchField":   "searchValue" }}
      ]
    }
  },
      "aggs" : {
    "uniq_Id" : {
      "terms" : { "field" : "Id", "size":500 }
      }
  }
}

,它将返回热门搜索结果和术语聚合桶。但是理想情况下,对于聚合结果中定义的每个唯一ID,我希望返回的搜索结果只是一个(也许是最上面的一个,无关紧要)。

1 个答案:

答案 0 :(得分:1)

您可以结合使用Terms AggregationTop Hits Aggregation来获得所需的结果。

现在,一旦执行此操作,请在Top Hits Aggregation

中将大小指定为1

根据您的查询,我创建了示例映射,文档,聚合查询以及供您参考的响应。

映射:

PUT mysampleindex
{
  "mappings": {
    "mydocs": {
      "properties": {
        "searchField":{
          "type": "text"
        },
        "Id": {
          "type": "keyword"
        }
      }
    }
  }
}

样本文档:

POST mysampleindex/mydocs/1
{
  "searchField": "elasticsearch",
  "Id": "1000"
}

POST mysampleindex/mydocs/2
{
  "searchField": "elasticsearch is awesome",
  "Id": "1000"
}

POST mysampleindex/mydocs/3
{
  "searchField": "elasticsearch is awesome",
  "Id": "1001"
}

POST mysampleindex/mydocs/4
{
  "searchField": "elasticsearch is pretty cool",
  "Id": "1001"
}

POST mysampleindex/mydocs/5
{
  "searchField": "elasticsearch is pretty cool",
  "Id": "1002"
}

查询:

POST mysampleindex/_search
{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "searchField": "elasticsearch"
          }
        }
      ]
    }
  },
  "aggs": {
    "myUniqueIds": {
      "terms": {
        "field": "Id",
        "size": 10
      },
      "aggs": {
        "myDocs": {
          "top_hits": {                     <---- Top Hits Aggregation
            "size": 1                       <---- Note this
          }
        }
      }
    }
  }
}

示例响应:

{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 5,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "myUniqueIds": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "1000",
          "doc_count": 2,
          "myDocs": {
            "hits": {
              "total": 2,
              "max_score": 0.2876821,
              "hits": [
                {
                  "_index": "mysampleindex",
                  "_type": "mydocs",
                  "_id": "1",
                  "_score": 0.2876821,
                  "_source": {
                    "searchField": "elasticsearch",
                    "Id": "1000"
                  }
                }
              ]
            }
          }
        },
        {
          "key": "1001",
          "doc_count": 2,
          "myDocs": {
            "hits": {
              "total": 2,
              "max_score": 0.25316024,
              "hits": [
                {
                  "_index": "mysampleindex",
                  "_type": "mydocs",
                  "_id": "3",
                  "_score": 0.25316024,
                  "_source": {
                    "searchField": "elasticsearch is awesome",
                    "Id": "1001"
                  }
                }
              ]
            }
          }
        },
        {
          "key": "1002",
          "doc_count": 1,
          "myDocs": {
            "hits": {
              "total": 1,
              "max_score": 0.2876821,
              "hits": [
                {
                  "_index": "mysampleindex",
                  "_type": "mydocs",
                  "_id": "5",
                  "_score": 0.2876821,
                  "_source": {
                    "searchField": "elasticsearch is pretty cool",
                    "Id": "1002"
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}

请注意,上面我没有返回任何布尔结果,您要查找的搜索结果以“热门匹配”的形式出现。

希望这会有所帮助!