被解析的字符串字段也是多值字段,但是很少会按照你想要的方式进行排序。如果你想分析一个字符串,如fine old art,这包含3项。我们很可能想要按第一项的字母排序,然后按第二项的字母排序,诸如此类,但是Elasticsearch在排序过程中没有这样的信息。

你可以使用min 和max 排序模式(默认是min ),但是这会导致排序以art 或是old,任何一个都不是所希望的。

为了以字符串字段进行排序,这个字段应仅包含一项:整个not_analyzed 字符串。但是我们仍需要analyzed 字段,这样才能以全文进行查询

但是保存相同的字符串两次在_source 字段是浪费空间的。我们真正想要做的是传递一个单字段但是却用两种方式索引他。所有的_core_field 类型(strings,numbers,Booleans,dates)接收一个fields 参数

该参数允许你转化一个简单的映射如:

  1. "tweet": {
  2. "type": "string",
  3. "analyzer": "english"
  4. }

为一个多字段映射如:

  1. "tweet": { //1
  2. "type": "string",
  3. "analyzer": "english",
  4. "fields": {
  5. "raw": { //2
  6. "type": "string",
  7. "index": "not_analyzed"
  8. }
  9. }
  10. }
  1. tweet 主字段与之前的一样:是一个analyzed全文字段。
  2. 新的tweet.raw 子字段是not_analyzed。

现在,至少只要我们重新索引了我们的数据,使用tweet 字段用于搜索,tweet.raw字段用于排序:

  1. GET /_search
  2. {
  3. "query": {
  4. "match": {
  5. "tweet": "elasticsearch"
  6. }
  7. },
  8. "sort": "tweet.raw"
  9. }

WARNING

以全文analyzed 字段排序会消耗大量的内存。获取更多信息请看 聚合与分析