Elasticsearch:如何在字段上添加语言分析器?

时间:2018-09-05 13:46:58

标签: elasticsearch mapping kibana

我有一个法语单词索引。我想对索引属性应用分析器。假设我有一个title属性,并且我想将其视为“法语属性”。我试过了(在kibana中):

PUT thing/_mappings/thing
{
  "properties": {
    "title": {
      "type": "text",
      "analyzer": "french",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    }
  }
}

但是它导致:

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Mapper for [title] conflicts with existing mapping in other types:\n[mapper [title] has different [analyzer]]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "Mapper for [title] conflicts with existing mapping in other types:\n[mapper [title] has different [analyzer]]"
  },
  "status": 400
}

我不明白为什么会出现此错误。如果我显示映射(GET thing/_mappings),则它不包含现有的分析器(除非我误解了):

 // ...
    "title": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    }
  }

如何将我的title财产视为法国财产?(来源:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html

1 个答案:

答案 0 :(得分:3)

不允许您更改title字段的分析器,如果在创建该字段时未指定,则默认为standard

您需要删除索引,更改映射以适合您的需求,然后重新索引数据。

另一种解决方案是使用适当的分析器在title字段中添加另一个子字段:

PUT thing/_mappings/thing
{
  "properties": {
    "title": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        },
        "french": {                 <--- add this
          "type": "text",
          "analyzer": "french"
        }
      }
    }
  }
}

运行此命令后,您无需重新上传所有1GB数据,只需致电

POST thing/_update_by_query

以选择新的子字段。

第二种方法的唯一缺点是,如果不需要title分析器的standard字段,最终将得到比所需更多的分析数据。由你决定。