elasticsearch Elasticseach数字字符串的自定义分析器

sqserrrh  于 2023-08-03  发布在  ElasticSearch
关注(0)|答案(1)|浏览(76)

我有这样的问题:我有一个数字字符串字段,用点分隔,如“1.1.2”,“11.2.1”等。我有一个要求,按这个字段排序,当我尝试按那个字段排序时,它进行字符串排序。所以我应该写一个分析器,在这个例子中,当'desc'按这个字段排序时,“11.2.1”排在第一位。我这样做我的Map和设置:

PUT your_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_sort_analyzer": {
          "tokenizer": "dot_tokenizer",
          "filter": [
            "numeric_sort_filter"
          ]
        }
      },
      "tokenizer": {
        "dot_tokenizer": {
          "type": "pattern",
          "pattern": "\\."
        }
      },
      "filter": {
        "numeric_sort_filter": {
          "type": "pattern_replace",
          "pattern": "(\\d+)",
          "replacement": "$1",
          "lowercase": true
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "your_field": {
        "type": "text",
        "analyzer": "custom_sort_analyzer",
        "fielddata": true
      }
    }
  }
}

字符串
但同样,当我做这种排序时,得到的不是正确的行为:

{
  "query": "my_query",
  "sort": [
    {
      "my_field": {
           "order": "asc"
      }
    }
  ]
}

gzjq41n4

gzjq41n41#

这些值看起来像是版本号,如果是这种情况,有一个更简单的选择,使用version field type,它完全按照您喜欢的方式工作。

PUT test
{
  "mappings": {
    "properties": {
      "version": {
        "type": "version"
      }
    }
  }
}

PUT test/_doc/1
{ "version": "1.1.2"}
PUT test/_doc/2
{ "version": "11.2.1"}

字符串
则以下查询首先返回11.2.1

POST test/_search?sort=version:desc

相关问题