“MapperParsingException [找不到字段[名称]的分析器[第二]]”

时间:2016-04-21 09:13:14

标签: java elasticsearch jest

我使用以下设置在Elasticsearch中创建了一个索引:

{
  "my_index" : {
    "aliases" : { },
    "mappings" : { },
    "settings" : {
      "index" : {
        "creation_date" : "1461229073677",
        "uuid" : "7-TECarfRs6XO8yZE7SeWA",
        "number_of_replicas" : "1",
        "number_of_shards" : "5",
        "version" : {
          "created" : "1040599"
        },
        "settings" : {
          "analysis" : {
            "analyzer" : {
              "second" : {
                "type" : "custom",
                "filter" : [ "lowercase", "synonym" ],
                "tokenizer" : "standard"
              }
            },
            "filter" : {
              "synonym" : {
                "type" : "synonym",
                "synonyms" : [ "i pad => ipad", "smart phone => smartphone" ]
              }
            }
          }
        }
      }
    },
    "warmers" : { }
  }
}

现在我要做的是使用以下代码设置映射:

PutMapping putMapping = new PutMapping.Builder(
        "my_index",
        "my_index_type",
        "{ \"properties\" : { \"Name\" : {\"type\" : \"string\", \"analyzer\" : \"second\"} } }"
).build();


JestResult result = client.execute(createIndex);
result =    client.execute(putMapping);

修改

我用来创建索引的代码是:

CreateIndex createIndex =  new CreateIndex.Builder(indexName)
.settings( 
        ImmutableSettings.builder()
                .loadFromClasspath(
                        "settings.json"
                ).build().getAsMap()
).build();
JestResult result = client.execute(createIndex);

并且settings.json看起来像这样:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "second": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "synonym"
          ]
        }
      },
      "filter": {
        "synonym" : {
            "type" : "synonym",
            "synonyms" : [
                "i pad => ipad",
                "smart phone => smartphone",
                "i phone => iphone"
                ]             
                    }
                }
        }

  }
}

但是我一直收到以下错误:

"MapperParsingException[Analyzer [second] not found for field [message]]"

如果删除“分析器”,我可以设置映射。所以我似乎有两次“设置”部分,但无论我如何构建“settings.json”文件,我都会继续这两个部分。我查看了JEST页面中指定的示例,但没有帮助我。 https://github.com/searchbox-io/Jest/blob/master/jest/README.md

任何想法的人?

1 个答案:

答案 0 :(得分:2)

您正在使用的设置未正确定义,即您有两个重叠的settings部分,索引设置应如下所示:

{
  "my_index": {
    "aliases": {},
    "mappings": {},
    "settings": {
      "index": {
        "number_of_replicas": "1",
        "number_of_shards": "5"
      },
      "analysis": {
        "analyzer": {
          "second": {
            "type": "custom",
            "filter": [
              "lowercase",
              "synonym"
            ],
            "tokenizer": "standard"
          }
        },
        "filter": {
          "synonym": {
            "type": "synonym",
            "synonyms": [
              "i pad => ipad",
              "smart phone => smartphone"
            ]
          }
        }
      }
    },
    "warmers": {}
  }
}

<强>更新

您的settings.json文件只需包含以下内容:

{
  "analysis": {
    "analyzer": {
      "second": {
        "type": "custom",
        "filter": [
          "lowercase",
          "synonym"
        ],
        "tokenizer": "standard"
      }
    },
    "filter": {
      "synonym": {
        "type": "synonym",
        "synonyms": [
          "i pad => ipad",
          "smart phone => smartphone"
        ]
      }
    }
  }
}