当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch术语聚合顺序大小写不敏感

鲍飞星
2023-03-14

我试图在elasticsearch中对术语聚合的桶进行排序,不区分大小写。以下是字段映射:

'brandName'       => [
    'type'     => 'string',
    'analyzer' => 'english',
    'index'    => 'analyzed',
    'fields'   => [
        'raw' => [
            'type'  => 'string',
            'index' => 'not_analyzed'
        ]
    ]
]

请注意,此处的此数据结构适用于PHP。

聚合如下所示:

aggregations => [
    'brands' => [
        'terms' => [
            'field' => 'brandName.raw',
            'size'  => 0,
            'order' => ['_term' => 'asc']
        ]
    ]
]

这是可行的,但生成的桶是按字典顺序排列的。

我在这里找到了一些有趣的文档,它们解释了如何做到这一点,但这是在对点击进行排序的上下文中,而不是在聚合桶中。

我还是试过了。以下是我创建的分析器:

'analysis' => [
    'analyzer' => [
        'case_insensitive_sort' => [
            'tokenizer' => 'keyword',
            'filter' => [ 'lowercase' ]
        ]
    ]
]

这里是更新的字段映射,使用分析器有一个名为“sort”的新子字段。

'brandName'       => [
    'type'     => 'string',
    'analyzer' => 'english',
    'index'    => 'analyzed',
    'fields'   => [
        'raw' => [
            'type'  => 'string',
            'index' => 'not_analyzed'
        ],
        'sort' => [
            'type'  => 'string',
            'index' => 'not_analyzed',
            'analyzer' => 'case_insensitive_sort'
        ]
    ]
]

下面是我查询的更新聚合部分:

aggregations => [
    'brands' => [
        'terms' => [
            'field' => 'brandName.raw',
            'size'  => 0,
            'order' => ['brandName.sort' => 'asc']
        ]
    ]
]

这将生成以下错误:<代码>无效的术语聚合器订单路径[品牌名称.排序]。未知聚合[品牌名称]。

我接近了吗?可以进行这种聚合桶排序吗?

共有1个答案

朱天逸
2023-03-14

简短的回答是,这种对聚合的高级排序尚未得到支持,并且有一个悬而未决的问题正在解决这个问题(预定用于v2.0.0)。

这里还有另外两点值得一提:

>

  • brandName.sort子字段声明not_analyzed,同时设置分析器是矛盾的。

    您得到的错误是因为order部分只能引用子聚合名称,而不能引用字段名(即brandName.sort是字段名)

  •  类似资料:
    • 我试图在关键字类型字段上进行不区分大小写的聚合,但在使其工作时遇到了问题。 到目前为止,我尝试的是添加一个名为“小写”的自定义分析器,它使用“关键字”标记器和“小写”过滤器。然后,我在映射中添加了一个名为“use_lowercase”的字段,用于我想要使用的字段。我还想保留现有的“文本”和“关键字”字段组件,因为我可能想在字段中搜索术语。 以下是索引定义,包括自定义分析器: 现在,我添加了两条记录

    • 我们目前正在开发一个多语言文档CMS。因此,我们有翻译成不同语言的文件。 对于使用Elasticsearch进行搜索,我们目前使用每种语言(德语、英语、法语……)一个索引,其中同一文档的所有翻译共享相同的ID。 当用户搜索特定术语时,我们希望在所有语言中搜索,但只返回不同ID的列表。据我所知,只有使用以下术语聚合才能做到这一点: 这很好,但是作为弹性搜索文档https://www.elastic.

    • 问题内容: 我正在尝试使用以下查询对以下数据进行elasticsearch来执行术语聚合,输出将名称分解为标记(请参见下面的输出)。因此,我尝试将os_name映射为multi_field,但现在无法通过它查询。是否可以有没有令牌的索引?例如“ Fedora Core”? 查询: 数据: 输出: 映射: 问题答案: 实际上,您应该像这样更改映射 并且您的aggs应该更改为:

    • 我有一个存储字符串数组的字段。不同的文档包含不同的字符串集。 现在,我使用这个聚合查询来分析每个文件类型的使用情况。 结果与预期一致。但最近我在删除XML文件支持后更新了此字段。因此,文档的non具有文件类型XML。我可以从这个查询中确认这一点。 总命中计数为零。奇怪的是,当我再次执行上述聚合查询时,我仍然可以将XML视为一个术语。doc count为零。 如果这个XML术语在任何文档中都不存在,

    • 我有一个描述容器的文档结构,它的一些字段是: 我想运行一个搜索聚合,该聚合在两个权重字段上有两个级别的术语聚合,但按权重字段的降序排列,如下所示: 样本文件: 预期输出(未完成): 但是,我不能按嵌套聚合排序。(错误:术语桶只能在子聚合器路径上排序,该子聚合器路径由路径中的零个或多个单桶聚合和最终的单桶或指标聚合构建...) 例如,对于上述示例输出,如果我在术语聚合上引入大小(如果我的数据很大,我

    • 问题内容: 我有两种日志消息: 第一个消息是已发送消息的类型,第二个消息是确认消息已传递的消息。 它们之间的区别是后缀,我已将其与“ id”分开并可以对其进行查询。 这些消息将按以下格式解析并存储在elasticsearch中: 我想找出哪些消息已成功发送,哪些没有成功。我是Elasticsearch的初学者,所以我真的很努力。 我目前正在尝试术语聚合,但是我所能实现的就是以下代码: 向我显示已发