基于第一个字符的弹性搜索字母排序

Dib*_*ish 5 nosql elasticsearch

我有一系列名字.

team dhoni
dhoni1
dibeesh 200
bb vineesh
devan
Run Code Online (Sandbox Code Playgroud)

我想按字母顺序按升序排序(A - Z),如下面的顺序

bb vineesh
devan
dhoni1
dibeesh 200
team dhoni
Run Code Online (Sandbox Code Playgroud)

制图

 "first_name": {
      "type": "string",
      "store": "true"
},
Run Code Online (Sandbox Code Playgroud)

我试过了

{
  "sort": [
    {
      "first_name": {
        "order": "asc"

      }
    }
  ], 
 "query": {
    "match_all": {
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时,我按以下顺序获取名称.

dibeesh 200
bb vineesh
devan
team dhoni
dhoni1
Run Code Online (Sandbox Code Playgroud)

弹性搜索以名字作为首选.

我怎么能阻止这个?

Tyl*_*ler 8

我有一个类似的问题,另一个答案对我来说不太明白。我参考了这个文档,并且能够通过这样的映射来解决

"name": { 
    "type":     "string",
    "analyzer": "english",
    "fields": {
        "raw": { 
            "type":  "string",
            "index": "not_analyzed"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样查询和排序

{
    "query": {
        "match": {
            "name": "dhoni"
        }
    },
    "sort": {
        "name.raw": {
            "order": "asc"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


pro*_*mer 7

我认为问题是,你的字符串是在写入elasticsearch时分析的.它使用标准分析器,使用带有标准令牌过滤器,小写令牌过滤器和停止令牌过滤器的标准令牌器构建标准型分析器.

这意味着什么,假设您正在使用字段"名称",默认映射(标准分析器).

当你索引时,

team dhoni, --> team, dhoni

dhoni1 --> dhoni1

dibeesh 200 --> dibeesh, 200
Run Code Online (Sandbox Code Playgroud)

等等,

因此,通过排序显然dibeesh200将首先出现.(因为它将按200而不是dibesh排序)

所以,如果你的字符串没有被分析(大写和小写字母的行为不同)或你可以使用简单的分析器(这样你只能按字母排序,无论大写或更低),或者你可以使用多字段来有分析和非分析版本.

这是一种方法,

POST x2/x3/_mapping
{
    "x3":{
        "properties": {
            "name" :{
                "type" :"string",
                "fields" :{
                    "raw" :{
                        "type": "string",
                        "index_analyzer": "simple"
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是查询,

POST x2/x3/_search
{
    "sort": [
       {
          "name.raw": {
             "order": "asc"
          }
       }
    ]
} 
Run Code Online (Sandbox Code Playgroud)

这按预期工作.希望这可以帮助!!