Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting Elasticsearch按字母顺序排序,然后按数字排序_Sorting_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Sorting,elasticsearch" /> elasticsearch,Sorting,elasticsearch" />

Sorting Elasticsearch按字母顺序排序,然后按数字排序

Sorting Elasticsearch按字母顺序排序,然后按数字排序,sorting,elasticsearch,Sorting,elasticsearch,我在寻找一种优雅的方法来对结果进行排序,先是按字母表,然后按数字 我当前的解决方案是使用下一个排序脚本在数字之前插入“~”,按字典顺序,在“z”之后插入“~”: 但我想知道是否有一个更优雅、也许更高效的解决方案 输入: ZBA ABC ... ABC SDK ... 123 RIU ... 12B BTE ... 11J TRE ... BCA 642 ... 期望输出: ABC SDK ... BCA 642 ... ZBA ABC ... 11J TRE ... 12B BTE ... 1

我在寻找一种优雅的方法来对结果进行排序,先是按字母表,然后按数字

我当前的解决方案是使用下一个排序脚本在数字之前插入“~”,按字典顺序,在“z”之后插入“~”:

但我想知道是否有一个更优雅、也许更高效的解决方案

输入:

ZBA ABC ...
ABC SDK ...
123 RIU ...
12B BTE ...
11J TRE ...
BCA 642 ...
期望输出:

ABC SDK ...
BCA 642 ...
ZBA ABC ...
11J TRE ...
12B BTE ...
123 RIU ...

您可以在索引时使用一个利用。在索引时执行此操作比在搜索时为每个查询运行脚本排序更有效

它的工作原理与您的解决方案相同,即,如果我们检测到一个数字,我们会在值前面加上一个波浪号
~
,否则我们什么也不做,但我们会在索引时做,并在
name.sort
字段中索引结果值

PUT /tests
{
  "settings": {
    "analysis": {
      "char_filter": {
        "pre_num": {
          "type": "pattern_replace",
          "pattern": "(\\d)",
          "replacement": "~$1"
        }
      },
      "analyzer": {
        "number_tagger": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [],
          "char_filter": [
            "pre_num"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "name": {
          "type": "string",
          "fields": {
            "sort": {
              "type": "string",
              "analyzer": "number_tagger",
              "search_analyzer": "standard"
            }
          }
        }
      }
    }
  }
}
然后你可以索引你的数据

POST /tests/test/_bulk
{"index": {}}
{"name": "ZBA ABC"}
{"index": {}}
{"name": "ABC SDK"}
{"index": {}}
{"name": "123 RIU"}
{"index": {}}
{"name": "12B BTE"}
{"index": {}}
{"name": "11J TRE"}
{"index": {}}
{"name": "BCA 642"}
然后您的查询可以简单地如下所示:

POST /tests/_search
{
  "sort": {
    "name.sort": "asc"
  }
}
您将得到的答复是:

{
  "hits": {
    "hits": [
      {
        "_source": {
          "name": "ABC SDK"
        }
      },
      {
        "_source": {
          "name": "BCA 642"
        }
      },
      {
        "_source": {
          "name": "ZBA ABC"
        }
      },
      {
        "_source": {
          "name": "11J TRE"
        }
      },
      {
        "_source": {
          "name": "12B BTE"
        }
      },
      {
        "_source": {
          "name": "123 RIU"
        }
      }
    ]
  }
}

幸运吗?我喜欢在索引时进行更改,但没有比在数字前添加一个平铺更聪明的解决方案了?这无法说服我。波浪号只添加到一个仅用于排序的字段中。词典排序就是这样。原始输入完全没有改变。该解决方案与您刚才在索引时执行的解决方案相同,而不是在搜索时利用昂贵的脚本是的,我理解,但我想找到另一种不同的方法,而不是在数字I可以提供另一种解决方案来计算排序数之前使用波浪号(~)保存另一个字段,但这仍然需要添加另一个字段来进行排序,因为您希望改变词典排序的工作方式。
{
  "hits": {
    "hits": [
      {
        "_source": {
          "name": "ABC SDK"
        }
      },
      {
        "_source": {
          "name": "BCA 642"
        }
      },
      {
        "_source": {
          "name": "ZBA ABC"
        }
      },
      {
        "_source": {
          "name": "11J TRE"
        }
      },
      {
        "_source": {
          "name": "12B BTE"
        }
      },
      {
        "_source": {
          "name": "123 RIU"
        }
      }
    ]
  }
}