是否可以在elasticsearch中使用unicode排序规则以自定义分组方式进行排序?

问题描述 投票:0回答:0

我正在处理电话簿,如果用户不提供姓名但只填写电子邮件,我将在电话簿中显示电子邮件值(如在 mac 联系人中)。优先级如下

姓名(如果不存在)-> 电子邮件(如果不存在)-> 公司名称(如果不存在)-> 电话

电话本排序要求按照以下顺序,其中

  1. 字母应该首先出现(可以是姓名,电子邮件,公司名称(忽略标点符号))
  2. 以数字开头的电子邮件
  3. 货币符号
  4. 以数字开头的姓名和公司名称
  5. 电话号码

例如电话本应该按照以下顺序列出联系人

  • 亚伦
  • @家居家具
  • 凯伦
  • 老挝@gmail.com
  • 拉洪
  • 扎罗


  • 1000 美元
  • 934英镑

  • 1Touch家具
  • 21世纪
  • 6比安卡军团

  • +1 (232) 323-844
  • +6 (983) 341-093
  • 91 9600946491

我目前在 elasticsearch 中使用以下映射,在单个字段中使用排序顺序规则(规则),仅用于排序目的(sortKey)与 icu_collation_keyword type

{
  "mappings": {
    "properties": {
      "sortKey": {   
        "type": "text",
        "fields": {
          "sort": {  
            "type": "icu_collation_keyword",
            "index": false,
            "rules" :   "[reorder Latn digit currency symbol space punct others]",
            "alternate" : "shifted"
          }
        }
      }
    }
  }
}

我在 name.sort 字段中查询时得到以下排序顺序

  • 亚伦
  • @家居家具
  • 凯伦
  • 老挝@gmail.com
  • 拉洪
  • 扎罗


  • 1000 美元
  • 934英镑

  • +1 (232) 323-844
  • +6 (983) 341-093

我明白为什么排序是上面的顺序了,因为规则重新排序 -> Latn, digit, currency, symbol, space, punct, others.我可以通过归类算法理解每个字符都根据我们定义的归类规则给出排序键。

除了我们上面使用的规则设置选项,我知道我们可以编写一个规则链作为排序的替代方法,有人能告诉我是否可以调整 unicode 排序算法以匹配上述用例。

注意:为每个分组保留多个elasticsearch字段(仅用于排序目的)并根据限制获取的记录数,我们可以链接多个游标机制的查询。但我不认为这是一种正确的方法,看看是否可以只用一个领域来实现。

非常感谢您花时间阅读本文。非常感谢任何帮助。

sorting elasticsearch collation icu
© www.soinside.com 2019 - 2024. All rights reserved.