首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >弹性搜索中的意外(不区分大小写)字符串排序

弹性搜索中的意外(不区分大小写)字符串排序
EN

Stack Overflow用户
提问于 2014-02-28 15:59:37
回答 3查看 8.2K关注 0票数 5

我有一个控制台平台列表,我正在Elasticsearch中对其进行排序。

以下是"name“字段的映射:

代码语言:javascript
代码运行次数:0
运行
复制
{
    "name": {
        "type": "multi_field",
        "fields": {
            "name": {
                "type": "string",
                "index": "analyzed"
            },
            "sort_name": {
                "type": "string",
                "index": "not_analyzed"
            }
        }
    }
}

当我执行以下查询时

代码语言:javascript
代码运行次数:0
运行
复制
{
  "query": {
    "match_all": {}
  },
    "sort": [
        {
          "name.sort_name": { "order": "asc" }
        }
    ],
    "fields": ["name"]
}

我得到了以下结果:

代码语言:javascript
代码运行次数:0
运行
复制
{
    "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前进之后)--为什么名称中的/会对排序产生影响?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-28 16:41:07

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

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

代码语言:javascript
代码运行次数:0
运行
复制
{
    "analysis": {
        "analyzer": {
            "sortable": {
                "tokenizer": "keyword",
                "filter": [
                    "lowercase"
                ]
            }
        }
    }
}

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

票数 17
EN

Stack Overflow用户

发布于 2021-07-20 11:43:26

使用规范化器with关键字来处理排序

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-normalizers.html#analysis-normalizers

代码语言:javascript
代码运行次数:0
运行
复制
PUT index_name
{
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "char_filter": ["quote"],
          "filter": ["lowercase", "asciifolding"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword",
        "normalizer": "my_normalizer"
      }
    }
  }
}

可以像这样修改搜索查询

代码语言:javascript
代码运行次数:0
运行
复制
{
  "query": {
    "match_all": {}
  },
    "sort": [
        {
          "name.sort_name": { "order": "asc" }
        }
    ],
    "fields": "name.keyword"
}
票数 1
EN

Stack Overflow用户

发布于 2022-01-05 07:29:09

根据https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-normalizers.html (ElasticSearch 7.16) .

Elasticsearch附带一个小写内建规范器。

因此,您可以定义一个附加字段(在下面的示例“lowersortable”中):

代码语言:javascript
代码运行次数:0
运行
复制
PUT /myindex/_mapping
{
  "properties": {
    "myproperty": {
      "type": "text",
      "fields": {
        "lowersortable": {
          "type": "keyword",
          "normalizer": "lowercase"
        }
      }
    }
  }
}

..。并使用此字段myproperty.lowersortable在搜索查询中进行排序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22099906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档