【问题标题】:Elastic seach group by and get first recordElasticsearch 分组并获得第一条记录
【发布时间】:2020-03-30 08:37:34
【问题描述】:

我是弹性搜索的新手, 我想在弹性搜索中创建一个查询,它的工作方式类似于 SQL 组。 这是我的 SQL 查询

SELECT top 100  *
FROM (
SELECT ROW_NUMBER()
OVER(PARTITION BY columnA
ORDER BY columnB) AS StRank, *
FROM table where columnA in ('a','b','c') ) n
WHERE StRank IN (1) 
GO

我想要一个按列 A 和按列 B 排序的单行组

【问题讨论】:

    标签: sql elasticsearch group-by elasticsearch-5


    【解决方案1】:

    您可以使用collapse

    允许根据字段值折叠搜索结果。这 折叠是通过仅选择每个排序最靠前的文档来完成的 折叠键

    {
      "query": {
        "bool": {
          "filter": {- -> filter doesn't calculate score(if score needed use must)
            "terms": {
              "columnA": ["a","b","c"]
            }
          }
        }
      },
      "collapse": {      --> top 1 Group by column A
        "field": "columnA"
      },
      "sort": [          --> sort 
        {
          "columnB": {
            "order": "desc"
          }
        }
      ]
    }
    

    【讨论】:

    • "collapse" 仅适用于关键字和数字,但我的 columnA 是一个字符串。我将如何处理? @jaspreet-chahal
    • 在索引映射中,您可以创建关键字类型的子字段。如果未显式创建映射,则字段将已经存在 ex "columA":{ "type" : "text" ,fields:{"keyword":{"type":"keyword"}}}。尝试使用“columnA.keyword”,如果不存在则创建一个elastic.co/guide/en/elasticsearch/reference/current/…
    • 文本类型的字段存储为标记。前 A 列:“A B”。存储为两个单独的令牌 A 和 B 。它适用于匹配等,但需要整个文本的查询不能在这些 ex 上工作。术语,折叠等。类型关键字将文本存储为“A B”。使用子字段允许以不同方式存储相同的字段
    • 有没有办法使用折叠子句获取“每个桶”的折叠文档总数?
    • @SamChats 您需要为此使用术语聚合。查询部分不会为您提供分析信息。对于不需要对折叠结果进行分析的搜索用例,折叠通常是首选。
    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多