当前位置: 首页 > 面试题库 >

Elasticsearch中的字符串意外排序(不区分大小写)

段干英杰
2023-03-14
问题内容

我有要在Elasticsearch中排序的控制台平台的列表。

这是“名称”字段的映射:

{
    "name": {
        "type": "multi_field",
        "fields": {
            "name": {
                "type": "string",
                "index": "analyzed"
            },
            "sort_name": {
                "type": "string",
                "index": "not_analyzed"
            }
        }
    }
}

当我执行以下查询时

{
  "query": {
    "match_all": {}
  },
    "sort": [
        {
          "name.sort_name": { "order": "asc" }
        }
    ],
    "fields": ["name"]
}

我得到以下结果:

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 3,
        "successful": 3,
        "failed": 0
    },
    "hits": {
        "total": 17,
        "max_score": null,
        "hits": [
            {
                "_index": "platforms",
                "_type": "platform",
                "_id": "1393602489",
                "_score": null,
                "fields": {
                    "name": "GameCube"
                },
                "sort": [
                    "GameCube"
                ]
            },
            {
                "_index": "platforms",
                "_type": "platform",
                "_id": "1393602490",
                "_score": null,
                "fields": {
                    "name": "Gameboy Advance"
                },
                "sort": [
                    "Gameboy Advance"
                ]
            },


    {
            "_index": "platforms",
            "_type": "platform",
            "_id": "1393602498",
            "_score": null,
            "fields": {
                "name": "Nintendo 3DS"
            },
            "sort": [
                "Nintendo 3DS"
            ]
        },

        ...remove for brevity ...

        {
            "_index": "platforms",
            "_type": "platform",
            "_id": "1393602493",
            "_score": null,
            "fields": {
                "name": "Xbox 360"
            },
            "sort": [
                "Xbox 360"
            ]
        },
        {
            "_index": "platforms",
            "_type": "platform",
            "_id": "1393602502",
            "_score": null,
            "fields": {
                "name": "Xbox One"
            },
            "sort": [
                "Xbox One"
            ]
        },
        {
            "_index": "platforms",
            "_type": "platform",
            "_id": "1393602497",
            "_score": null,
            "fields": {
                "name": "iPhone/iPod"
            },
            "sort": [
                "iPhone/iPod"
            ]
        }
    ]
}

除了iPhone/iPod结果在末尾(而不是在GameBoy Advance之后)之外,所有内容均按预期进行排序-为什么/名称中的会对排序产生影响?

谢谢


问题答案:

好的,我发现原因与邮件无关/。ES将按大写字母和小写字母排序。

settings在索引创建的中添加了自定义分析器:

{
    "analysis": {
        "analyzer": {
            "sortable": {
                "tokenizer": "keyword",
                "filter": [
                    "lowercase"
                ]
            }
        }
    }
}

然后在字段映射中,我添加'analyzer': 'sortable'sort_name多字段。



 类似资料:
  • 需要制作一个密码程序,用户在开始时设置密码,在程序停止前可以输入密码3次。该程序不能区分大小写。 程序按预期打印,但不区分大小写

  • 问题内容: 如何区分大小写不区分给定字段的MongoDB集合?默认情况下,我在az之前获得AZ。 问题答案: 更新: 截至目前,mongodb具有不区分大小写的索引: 贝壳: 更新: 此答案已过期,3.4将具有不区分大小写的索引。请查看JIRA以获取更多信息https://jira.mongodb.org/browse/SERVER-90 不幸的是,MongoDB尚无区分大小写的索引:https

  • 问题内容: 如何以不区分大小写的方式比较字符串? 例如,“ Go”和“ go”应视为相等。 问题答案: https://golang.org/pkg/strings/#EqualFold是您要寻找的功能。它的用法如下(来自链接文档的示例):

  • 问题内容: 如何以 不区分大小写的 方式在文件中搜索单词? 例如 如果我正在文件中搜索,如果文件包含更新,则搜索应将其选中并将其视为匹配项。 问题答案: 可以在忽略大小写的情况下检查两个字符串是否相等。它甚至可以与Unicode一起使用。有关更多信息,请参见http://golang.org/pkg/strings/#EqualFold。 http://play.golang.org/p/KDdI

  • 问题内容: 我需要不区分大小写地突出显示JavaScript字符串中的给定关键字。 例如: 应该回来 我需要用于任何关键字的代码,因此使用像硬编码的正则表达式这样的解决方案还不够。 最简单的方法是什么? (这是标题中详述的更一般问题的实例,但我认为最好用一个具体,有用的示例来解决。) 问题答案: 你 可以 ,如果你准备搜索字符串使用正则表达式。在PHP中,例如有一个函数preg_quote,它用转

  • 我已经用其他语言编写了相当多的程序,但是我对PowerShell还相当陌生。我知道比较运算符的大小写敏感版本,但我对一些结果感到紧张.. 我假设PowerShell在进行字符串比较时使用了ASCII(Unicode)值,所以我预计 结果是错误的——但事实并非如此 这就有了一些直观的感觉(lower一定要小于upper-right?)但是从ASCII的角度来看没有意义。对于罗马字母字符来说,这种情况