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

时间:2014-08-08 03:29:27

标签: elasticsearch nosql

我有一系列名字。

team dhoni
dhoni1
dibeesh 200
bb vineesh
devan

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

bb vineesh
devan
dhoni1
dibeesh 200
team dhoni

映射

 "first_name": {
      "type": "string",
      "store": "true"
},

我试过了

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

      }
    }
  ], 
 "query": {
    "match_all": {
    }
  }
}

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

dibeesh 200
bb vineesh
devan
team dhoni
dhoni1

弹性搜索以姓氏为首选名字。

我该如何防止这种情况?

5 个答案:

答案 0 :(得分:6)

我认为问题在于,在写入elasticsearch时会分析您的字符串。它使用Standard Analyzer,标准类型的分析器使用标准令牌过滤器,小写令牌过滤器和停止令牌过滤器构建。

这是什么意思, 假设您正在使用字段" name",使用默认映射(标准分析器)。

索引时

team dhoni, --> team, dhoni

dhoni1 --> dhoni1

dibeesh 200 --> dibeesh, 200

等等,

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

所以,如果你的字符串没有被分析(大写和小写的行为不同),或者你可以使用简单的分析器(这样你就可以只用字母排序而不是大写或更低),或者可能您可以使用multifield来分析和非分析版本。

这是一种方法,

POST x2/x3/_mapping
{
    "x3":{
        "properties": {
            "name" :{
                "type" :"string",
                "fields" :{
                    "raw" :{
                        "type": "string",
                        "index_analyzer": "simple"
                    }
                }
            }
        }
    }
}

这是查询,

POST x2/x3/_search
{
    "sort": [
       {
          "name.raw": {
             "order": "asc"
          }
       }
    ]
} 

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

答案 1 :(得分:4)

我有一个类似的问题,另一个答案并没有得到它。我改为this documentation,并且能够通过这样的映射来解决

"name": { 
    "type":     "string",
    "analyzer": "english",
    "fields": {
        "raw": { 
            "type":  "string",
            "index": "not_analyzed"
        }
    }
}

然后像这样查询和排序

{
    "query": {
        "match": {
            "name": "dhoni"
        }
    },
    "sort": {
        "name.raw": {
            "order": "asc"
        }
    }
}

答案 2 :(得分:2)

我正在使用ElasticSearch 6.3(目前是最新版本)

以及根据文档。对于文本排序,您需要将类型设置为keyword

"title":{ 
    "type":     "text",
    "fields": {
        "raw": { 
            "type":  "keyword"
        }
    }
}

答案 3 :(得分:0)

keyword分析器帮助了我:

first_name: {
     type: "text",
     analyzer: "keyword"
}

Docs

答案 4 :(得分:0)

ASCII值的差异会导致大写和小写开头的差异。因此,一种解决方案(技巧)只是将要排序的相同数据保存在其他字段名称中,然后使用该字段进行排序。

这不是完美的方法,但是在对下拉菜单的数据进行排序时。这会有所帮助。