Spring Data Elasticsearch设置注解没有生效

Spring Data Elasticsearch setting annotation did not take effect

我正在尝试使用 spring 数据弹性搜索,并有一个 class 定义如下:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "master", type = "master", shards = 1, replicas = 0)
@Setting(settingPath = "/settings/setting.json")
public class Master {

@Id
private String id;

@MultiField(mainField = @Field(type = FieldType.String, store = true),
        otherFields = {
                @InnerField(suffix = "autocomplete", type = FieldType.String, indexAnalyzer = "autocomplete", searchAnalyzer = "standard")
        }
)
private String firstName;

private String lastName;

}

设置文件在/src/main/settings/setting.json下面,看起来像这样

{
  "index": {
    "analysis": {
      "filter": {
        "autocomplete_filter": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 20
        }
      },
      "analyzer": {
        "autocomplete": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        }
      }
    }
  }
}

我运行我的测试class首先删除索引,然后像这样重新创建索引

    elasticsearchTemplate.deleteIndex(Master.class);
    elasticsearchTemplate.createIndex(Master.class);
    elasticsearchTemplate.putMapping(Master.class);
    elasticsearchTemplate.refresh(Master.class);

但是当我尝试将某些内容保存到索引中时,出现了 MapperParsingException 的错误消息:

2017-10-04 18:56:31.806 ERROR 2942 --- [           main] .d.e.r.s.AbstractElasticsearchRepository : failed to load elasticsearch nodes : org.elasticsearch.index.mapper.MapperParsingException: analyzer [autocomplete] not found for field [autocomplete]

花了 4 个小时试图解决这个问题,查看了调试模式日志,什么也没有。

我试图通过删除一个逗号来破坏 JSON 格式,它破坏了 JSON 被解释。

我使用 RestAPI 查询主索引,但设置似乎不包含自动完成分析器或任何分析器。

奇怪的是,我的文档竟然出现了这个错误,还能保存和查询。但我确实想要这个分析仪。

顺便说一句,如果相关的话,这是 parent-child 关系中的 parent class。

终于明白了!

我必须使用相同的索引(父域和子域)在所有域中设置相同的设置,然后删除索引,重新启动服务器,它成功了!