在elasticsearch中创建索引时,自定义分析器的mapper_parsing_exception?

时间:2016-03-01 19:35:02

标签: elasticsearch elasticsearch-2.0

我使用以下内容通过test请求创建名为PUT的索引:

PUT http://localhost:9250/test
{
    "settings": {
        "analysis": {
            "char_filter": {
                "&_to_and": {
                    "type": "mapping",
                    "mappings": ["& => and"]
                }
            },
            "filter": {
                "my_stopwords": {
                    "type":       "stop",
                    "stopwords": ["the", "a"]
                }
            },
            "analyzer": {
                "my_analyzer": {
                    "type":         "custom",
                    "char_filter":  ["html_strip", "&_to_and"],
                    "tokenizer":    "standard",
                    "filter":       ["lowercase", "my_stopwords"]
                },
                "folding": {
                    "token_filters": ["lowercase", "asciifolding"],
                    "tokenizer": "standard",
                    "type": "custom"
                }
            }
        }
    },
    "mappings": {
        "tweet": {
            "dynamic": "strict",
            "properties": {
                "author": {
                    "type": "string",
                    "index": "my_analyzer",
                    "store": true
                },
                "text": {
                    "type": "string",
                    "index": "folding",
                    "store": true
                },
                "timestamp": {
                    "type": "date",
                    "format": "yyyy-MM-dd'T'HH:mm:ssZ",
                    "store": true
                }
            }
        }
    }
}

但是这会返回以下错误:

{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "wrong value for index [my_analyzer] for field [author]"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping [tweet]: wrong value for index [my_analyzer] for field [author]",
    "caused_by": {
      "type": "mapper_parsing_exception",
      "reason": "wrong value for index [my_analyzer] for field [author]"
    }
  },
  "status": 400
}

我发送的json似乎是有效的。这个错误的原因是什么?

我正在使用ES 2.2.0。

1 个答案:

答案 0 :(得分:3)

由于错误消息描述自定义分析器(例如my_analyzer)在映射中不是index选项的有效值。根据{{​​3}},它可以采用的唯一值是

  

     

不要将此字段值添加到索引中。使用此设置,该字段   将无法查询。

     

<强> not_analyzed

     

将字段值作为单个术语添加到索引不变。这是   除字符串外,支持此选项的所有字段的默认值   领域。 not_analyzed字段通常与术语级查询一起使用   用于结构化搜索。

     

<强>分析

     

此选项仅适用于字符串字段   默认。首先分析字符串字段值以转换   然后,将字符串转换成术语(例如,单个单词的列表)   索引。在搜索时,查询字符串通过(通常)   相同的分析器生成与格式相同的格式的术语   指数。正是这个过程实现了全文搜索。

如果您想为字段设置自定义分析器,请使用documentation选项

示例:

{
    "settings": {
        "analysis": {
            "char_filter": {
                "&_to_and": {
                    "type": "mapping",
                    "mappings": ["& => and"]
                }
            },
            "filter": {
                "my_stopwords": {
                    "type":       "stop",
                    "stopwords": ["the", "a"]
                }
            },
            "analyzer": {
                "my_analyzer": {
                    "type":         "custom",
                    "char_filter":  ["html_strip", "&_to_and"],
                    "tokenizer":    "standard",
                    "filter":       ["lowercase", "my_stopwords"]
                },
                "folding": {
                    "token_filters": ["lowercase", "asciifolding"],
                    "tokenizer": "standard",
                    "type": "custom"
                }
            }
        }
    },
    "mappings": {
        "tweet": {
            "dynamic": "strict",
            "properties": {
                "author": {
                    "type": "string",
                    "analyzer": "my_analyzer",
                    "store": true
                },
                "text": {
                    "type": "string",
                    "analyzer": "folding",
                    "store": true
                },
                "timestamp": {
                    "type": "date",
                    "format": "yyyy-MM-dd'T'HH:mm:ssZ",
                    "store": true
                }
            }
        }
    }
}