弹簧数据弹性搜索-注册自定义分析器

弹簧数据弹性搜索-注册自定义分析器,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,我正在尝试在我的应用程序中使用ElasticSearch进行全文搜索,目前我正在尝试使用: 由于我的应用程序是用Spring构建的,所以我决定使用Spring数据elasticsearch并以这种方式映射我的实体: @Document(indexName = "estabelecimento") @Setting(settingPath = "/elasticsearch/autocomplete-analyser.json") public class ESEstabelecimento {

我正在尝试在我的应用程序中使用ElasticSearch进行全文搜索,目前我正在尝试使用:

由于我的应用程序是用Spring构建的,所以我决定使用Spring数据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;
}
但是,elasticsearch没有加载自定义分析器:

[DEBUG]org.elasticsearch.action.admin.indexes.mapping.put-[Magus]未能在索引[[Establecimento]]上放置映射,键入[esestabelecimento] org.elasticsearch.index.mapper.MapperParsingException:未找到字段[nome]的分析器[autocomplete] 在org.elasticsearch.index.mapper.core.TypeParsers.parseField(TypeParsers.java:220)~[elasticsearch-1.5.2.jar:na] 在org.elasticsearch.index.mapper.core.StringFieldMapper$TypeParser.parse(StringFieldMapper.java:153)~[elasticsearch-1.5.2.jar:na] 在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] 在org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:211)~[elasticsearch-1.5.2.jar:na] 在org.elasticsearch.index.mapper.DocumentMapperParser.parseCompressed(DocumentMapperParser.java:192)~[elasticsearch-1.5.2.jar:na] 在org.elasticsearch.index.mapper.MapperService.parse(MapperService.java:434)~[elasticsearch-1.5.2.jar:na] 在org.elasticsearch.cluster.metadata.MetaDataMappingService$4.execute(MetaDataMappingService.java:505)~[elasticsearch-1.5.2.jar:na] 在org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:365)~[elasticsearch-1.5.2.jar:na] 位于org.elasticsearch.common.util.concurrent.PrioritizedThreadPoolExecutor$TiebreakingPriorizedRunnable.runAndClean(priorizedThreadPoolExecutor.java:188)[elasticsearch-1.5.2.jar:na] 在org.elasticsearch.common.util.concurrent.PrioritizedThreadPoolExecutor$TiebreakingPriorizedRunnable.run(priorizedThreadPoolExecutor.java:158)[elasticsearch-1.5.2.jar:na] 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[na:1.8.077] 在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[na:1.8.077] 在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]的Analyzer[autocomplete]


我无法确定问题的原因,我不知道分析仪是否无效,或者elasticsearch是否找到了autocomplete-analyzer.json文件。如何解决这个问题?

我想您需要从json文件中删除字段
“设置”:
,只放内容

而不是使用:

{
"settings": {
    ....
   }
}
只需使用:

{ 
"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"
      ]
     }
    }
   } 
  }
}

希望它能帮助你解决问题

经过一些研究,我发现问题是由以下声明引起的:

@Bean
public ElasticsearchOperations elasticsearchTemplate(Client client) {
    return new ElasticsearchTemplate(client, new CustomEntityMapper());
}

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

我遇到了类似的问题,这可能是由于多种原因造成的:

  • 确保json文件位于同一位置 设置路径中提到的位置及其正确读取。要验证这一点,正如Richa在上面所说的,只需从json中删除analyzer并测试 创建的碎片数
  • 如果位置正确,但仍然 未读取json文件,请检查是否添加了@Document(indexName= 模型类中的“indexName”,createIndex=false)注释 然后,只需从文档注释中删除createIndex=false,然后重试
  • 始终记住删除旧索引,然后再次测试它

  • 同样的结果。。。有没有办法调试@Setting?我想问题可能就在那里……只是确认一下,您的json文件是否与
    设置路径中提到的位置相同?是的。该文件位于src/main/resources/elasticsearch/autocomplete-analyzer.json中。我尝试了完整路径:/home/hudson/。。。但是结果是相同的,移动analyzer部分,看看有多少碎片被创建。如果设置中提到的是1,那么我们将确保正在读取json文件,并且analyzer中存在一些问题。如果创建的碎片数为5(默认值),则这将推断您的json文件没有被读取。它没有读取文件:[DEBUG]org.elasticsearch.index.memory-[Nightside]重新计算碎片索引缓冲区(reason=[[ADDED]]),总数为[354.3mb],其中有[5]个活动碎片,每个碎片设置为索引=[70.8mb],translog=[64kb]您是否在尝试之间删除了索引?它只会在索引不存在时创建索引。如果索引已经存在,则不会更新设置。首先删除索引,让spring重新创建它。您还可以使用GET/estabelecimento/\u settings检查设置,这可能会提供一些见解。
    
    @Bean
    public ElasticsearchOperations elasticsearchTemplate(Client client) {
        return new ElasticsearchTemplate(client, new CustomEntityMapper());
    }