spring-data-elasticsearch-注册自定义分析器

bre*_*leq 6 elasticsearch spring-data spring-data-elasticsearch

我正在尝试在我的应用程序中使用ElasticSearch进行全文搜索,这时我正在尝试使用自动完成分析器

{
    "settings": {
        "number_of_shards": 1,
        "analysis": {
            "filter": {
                "autocomplete_filter": {
                    "type": "edge_ngram",
                    "min_gram": 1,
                    "max_gram": 20
                }
            },
            "analyzer": {
                "autocomplete": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "autocomplete_filter"
                    ]
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我的应用程序是使用Spring构建的时,我决定使用Spring-data-elasticsearch并以这种方式映射我的实体:

@Document(indexName = "estabelecimento")
@Setting(settingPath = "/elasticsearch/autocomplete-analyser.json")
public class ESEstabelecimento {

    private Long id;
    @Field(type = FieldType.String, indexAnalyzer = "autocomplete")
    private String nome;
    private String razaoSocial;
    private String tipoEstabelecimento;
    @Field(type = FieldType.Object)
    private ESCidade cidade;
}
Run Code Online (Sandbox Code Playgroud)

但是,elasticsearch不会加载自定义分析器:

[DEBUG] org.elasticsearch.action.admin.indices.mapping.put-[Magus]无法将映射放在索引[[estabelecimento]]上,键入[esestabelecimento] org.elasticsearch.index.mapper.MapperParsingException:分析器[自动完成]在org.elasticsearch.index.mapper.core的org.elasticsearch.index.mapper.core.TypeParsers.parseField(TypeParsers.java:220)〜[elasticsearch-1.5.2.jar:na]的字段[nome]中找不到.StringFieldMapper $ TypeParser.parse(StringFieldMapper.java:153)〜[elasticsearch-1.5.2.jar:na] at org.elasticsearch.index.mapper.object.ObjectMapper $ TypeParser.parseProperties(ObjectMapper.java:290)〜[ elasticsearch-1.5.2.jar:na],位于org.elasticsearch.index.mapper.object.ObjectMapper $ TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:214)〜[elasticsearch-1.5.2.jar:na],位于org.elasticsearch。 index.mapper。object.RootObjectMapper $ TypeParser.parse(RootObjectMapper.java:136)〜[elasticsearch-1.5.2.jar:na] at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:211)〜[elasticsearch-1.5 org.elasticsearch.index.mapper.DocumentMapperParser.parseCompressed(DocumentMapperParser.java:192)的[.2.jar:na]〜org.elasticsearch.index.mapper.MapperService.parse的[elasticsearch-1.5.2.jar:na] (MapperService.java:434)〜[elasticsearch-1.5.2.jar:na] at org.elasticsearch.cluster.metadata.MetaDataMappingService $ 4.execute(MetaDataMappingService.java:505)〜[elasticsearch-1.5.2.jar:na ],网址为org.elasticsearch.common.util.concurrent上的[elasticsearch-1.5.2.jar:na],位于org.elasticsearch.cluster.service.InternalClusterService $ UpdateTask.run(InternalClusterService.java:365)〜[elasticsearch-1.5.2.jar:na]。PrioritizedEsThreadPoolExecutor $ TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:188)[elasticsearch-1.5.2.jar:na]位于org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor $ TieBreakingPrioritized。 .2.jar:na],位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[na:1.8.0_77],位于java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_77] at java.lang.Thread.run(Thread.java:745)[na:1.8.0_77] [错误] org.springframework.data.elasticsearch.repository.support.AbstractElasticsearchRepository-无法加载elasticsearch节点:org.elasticsearch.index.mapper.MapperParsingException:字段[nome]找不到分析器[自动完成]runAndClean(PrioritizedEsThreadPoolExecutor.java:188)[elasticsearch-1.5.2.jar:na] at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor $ TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:1.5.2。) :na]在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[na:1.8.0_77]在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)[na:1.8 .0_77] at java.lang.Thread.run(Thread.java:745)[na:1.8.0_77] [ERROR] org.springframework.data.elasticsearch.repository.support.AbstractElasticsearchRepository-无法加载elasticsearch节点:org。 elasticsearch.index.mapper.MapperParsingException:找不到字段[nome]的分析器[autocomplete]runAndClean(PrioritizedEsThreadPoolExecutor.java:188)[elasticsearch-1.5.2.jar:na] at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor $ TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:1.5.2。) :na]在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[na:1.8.0_77]在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)[na:1.8 .0_77] at java.lang.Thread.run(Thread.java:745)[na:1.8.0_77] [ERROR] org.springframework.data.elasticsearch.repository.support.AbstractElasticsearchRepository-无法加载elasticsearch节点:org。 elasticsearch.index.mapper.MapperParsingException:找不到字段[nome]的分析器[autocomplete]jar:na]在org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor $ TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:158)[elasticsearch-1.5.2.jar:na]在java.util.concurrent.ThreadPoolExecutor.runWorker(Thread .java:1142)[na:1.8.0_77]在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)[na:1.8.0_77]在java.lang.Thread.run(Thread.java :745)[na:1.8.0_77] [错误] org.springframework.data.elasticsearch.repository.support.AbstractElasticsearchRepository-无法加载Elasticsearch节点:org.elasticsearch.index.mapper.MapperParsingException:找不到分析器[自动完成]领域[nome]jar:na]在org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor $ TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:158)[elasticsearch-1.5.2.jar:na]在java.util.concurrent.ThreadPoolExecutor.runWorker(Thread .java:1142)[na:1.8.0_77]在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)[na:1.8.0_77]在java.lang.Thread.run(Thread.java :745)[na:1.8.0_77] [错误] org.springframework.data.elasticsearch.repository.support.AbstractElasticsearchRepository-无法加载Elasticsearch节点:org.elasticsearch.index.mapper.MapperParsingException:找不到分析器[自动完成]领域[nome]在java.util.concurrent上运行(PrioritizedEsThreadPoolExecutor.java:158)[elasticsearch-1.5.2.jar:na]在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[na:1.8.0_77]。 ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)[na:1.8.0_77],位于java.lang.Thread.run(Thread.java:745)[na:1.8.0_77] [错误] org.springframework.data。 elasticsearch.repository.support.AbstractElasticsearchRepository-无法加载elasticsearch节点:org.elasticsearch.index.mapper.MapperParsingException:找不到字段[nome]的分析器[自动完成]在java.util.concurrent上运行(PrioritizedEsThreadPoolExecutor.java:158)[elasticsearch-1.5.2.jar:na]在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[na:1.8.0_77]。 ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)[na:1.8.0_77],位于java.lang.Thread.run(Thread.java:745)[na:1.8.0_77] [错误] org.springframework.data。 elasticsearch.repository.support.AbstractElasticsearchRepository-无法加载elasticsearch节点:org.elasticsearch.index.mapper.MapperParsingException:找不到字段[nome]的分析器[自动完成]运行(Thread.java:745)[na:1.8.0_77] [错误] org.springframework.data.elasticsearch.repository.support.AbstractElasticsearchRepository-无法加载elasticsearch节点:org.elasticsearch.index.mapper.MapperParsingException:Analyzer [自动填充]找不到字段[nome]运行(Thread.java:745)[na:1.8.0_77] [错误] org.springframework.data.elasticsearch.repository.support.AbstractElasticsearchRepository-无法加载elasticsearch节点:org.elasticsearch.index.mapper.MapperParsingException:Analyzer [自动填充]找不到字段[nome]

我无法确定问题的原因,我也不知道分析器是否无效或elasticsearch甚至找到了autocomplete-analyser.json文件。我该如何解决?

Ric*_*cha 6

我想您需要"settings":从 json 文件中删除该字段并只放置内容。

而不是使用:

{
"settings": {
    ....
   }
}
Run Code Online (Sandbox Code Playgroud)

只需使用:

{ 
"index": {
"number_of_shards": 1,
"analysis": {
  "filter": {
    "autocomplete_filter": {
      "type": "edge_ngram",
      "min_gram": 1,
      "max_gram": 20
    }
  },
  "analyzer": {
    "autocomplete": {
      "type": "custom",
      "tokenizer": "standard",
      "filter": [
        "lowercase",
        "autocomplete_filter"
      ]
     }
    }
   } 
  }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮到你。。


bre*_*leq 5

解决了

经过一番研究,我发现问题是由这个声明引起的:

@Bean
public ElasticsearchOperations elasticsearchTemplate(Client client) {
    return new ElasticsearchTemplate(client, new CustomEntityMapper());
}
Run Code Online (Sandbox Code Playgroud)

我删除了这个声明,它开始获取配置。