我有一系列名字。
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
弹性搜索以姓氏为首选名字。
我该如何防止这种情况?
答案 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)
答案 4 :(得分:0)
ASCII值的差异会导致大写和小写开头的差异。因此,一种解决方案(技巧)只是将要排序的相同数据保存在其他字段名称中,然后使用该字段进行排序。
这不是完美的方法,但是在对下拉菜单的数据进行排序时。这会有所帮助。