ElasticSearch - 将索引字段升级为多字段 - 新字段为空

时间:2015-12-11 16:03:03

标签: elasticsearch

注意到我在索引字符串字段上的排序不能正常工作,我发现它正在对分析的字符串进行排序,因此“包含单词”,如果我希望它能够正常工作,我必须对未分析字符串进行排序串。我的计划是使用我在这两篇文章中找到的信息将字符串字段更改为多字段:

https://www.elastic.co/blog/changing-mapping-with-zero-downtime(升级到多字段部分) https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html

使用Sense我已经创建了这个字段映射

PUT myindex/_mapping/type
{
   "properties": {
      "Title": {
         "type": "string",
         "fields": {
            "Raw": {
               "type": "string",
               "index": "not_analyzed"
            }
         }
      }
   }
}

然后我尝试使用新制作的字段对搜索结果进行排序。在阅读完文章之后,我已经考虑了所有可以想到的名称变体:

POST myindex/_search
{
    "_source" : ["Title","titlemap.Raw","titlemap.Title","titlemap.Title.Raw","Title.Title","Raw","Title.Raw"],
    "size": 6,
    "query": {
        "multi_match": {
            "query": "title",
            "fields": ["Title^5"
            ],
            "fuzziness": "auto",
            "type": "best_fields"
        }
    },
    "sort": {
        "Title.Raw": "asc"
    }
}

这就是我的回应:

{
    "_index": "myindex_2015_11_26_12_22_38",
    "_type": "type",
    "_id": "1205",
    "_score": null,
    "_source": {
       "Title": "The title of the item"
    },
    "sort": [
       null
    ]
 }

响应中仅显示“标题”字段的值,并且每个结果的排序标准均为空。

我做错了什么,还是有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

重新索引后索引名称不一样,因此安装了默认映射......这可能就是原因。

我建议使用index template,因此您不必关心何时创建索引,ES会为您完成。我们的想法是创建一个具有您需要的正确映射的模板,然后ES将在其认为必要时创建每个新索引,添加myindex别名并将适当的映射应用于它。

curl -XPUT localhost:9200/_template/myindex_template -d '{
  "template": "myindex_*",
  "settings": {
    "number_of_shards": 1
  },
  "aliases": {
     "myindex": {}
  },
  "mappings": {
    "type": {
      "properties": {
        "Title": {
          "type": "string",
          "fields": {
            "Raw": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        }
      }
    }
  }
}'

然后,无论何时启动重新索引过程,都会创建一个具有新名称的新索引,但是会使用正确的映射和正确的别名。