gpt4 book ai didi

java - Elasticsearch排序字段包含特殊字符数字和字母

转载 作者:行者123 更新时间:2023-12-01 16:56:01 24 4
gpt4 key购买 nike

我创建了一个不区分大小写的分析器

PUT /dhruv3
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"analyzer_keyword": {
"tokenizer": "keyword",
"filter": [ "lowercase", "asciifolding" ]
}
}
}
}
},
"mappings": {
"test": {
"properties": {
"about": {
"type": "string",
"analyzer": "analyzer_keyword"
},
"firsName": {
"type": "string"
}
}
}
}
}

并将其用于映射。关于字段应该包含 aplha 数字和特殊字符。然后我用 about 字段插入一些值作为

1234, `pal, pal, ~pal

。除了搜索之外,我还需要对结果进行排序。搜索效果很好但是当我尝试将它们排序为

GET dhruv/test/_search
{
"sort": [
{
"about": {
"order": "asc"
}
}
]
}

我在 about 字段中得到的结果为

1234,`pal,pal,~pal

。但我希望它们首先是特殊字符,然后是数字,最后是字母。

我做了一些功课,发现这是因为它们的 ASCII 值。所以我搜索了互联网并尝试了asciifolding。但没有成功。我知道某些地方有一些解决方案,但我无法弄清楚。请指导我

最佳答案

您是对的,您所看到的排序行为是由于特殊字符的 ASCII 值大于数字的 ASCII 值。准确地说,查看ASCII table ,我们有以下值:

  • 1 的 ASCII 值是 49
  • ` 的 ASCII 值是 96
  • p 的 ASCII 值是 112
  • ~ 的 ASCII 值是 126

asciifolding token filter只是将 ASCII 表中的字符和数字(即前 127 个字符)转换为相应的 ASCII 字符(如果存在)(例如 éèëê 转换为 e)。由于上面的所有字符都在 ASCII 表中,因此这不是您要查找的内容。

如果您希望特殊字符在搜索中首先出现,有多种方法。

实现此目的的一种方法是简单地对它们的 ASCII 值取反,以便它们始终位于 ASCII 0 字符之前,然后使用脚本排序:

{
"sort": [
{
"_script": {
"script": "return doc['about'].value.chars[0].isLetterOrDigit() ? 1 : -1",
"type": "number",
"order": "asc"
}
}
]
}

关于java - Elasticsearch排序字段包含特殊字符数字和字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32853208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com