Spring Data Elasticsearch - 注册自定义分析器

11

我正在尝试在我的应用程序中使用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"
                    ]
                }
            }
        }
    }
}

由于我的应用是使用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;
}

然而,Elasticsearch没有加载自定义分析器:

[DEBUG] org.elasticsearch.action.admin.indices.mapping.put - [Magus] 在索引[[estabelecimento]],类型[esestabelecimento]上放置映射失败 org.elasticsearch.index.mapper.MapperParsingException: 找不到字段[nome]的分析器[autocomplete] at org.elasticsearch.index.mapper.core.TypeParsers.parseField(TypeParsers.java:220) ~[elasticsearch-1.5.2.jar:na] at org.elasticsearch.index.mapper.core.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] at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:214) ~[elasticsearch-1.5.2.jar:na] at 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.2.jar:na] at org.elasticsearch.index.mapper.DocumentMapperParser.parseCompressed(DocumentMapperParser.java:192) ~[elasticsearch-1.5.2.jar:na] at org.elasticsearch.index.mapper.MapperService.parse(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] at org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:365) ~[elasticsearch-1.5.2.jar:na] at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:188) [elasticsearch-1.5.2.jar:na] at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:158) [elasticsearch-1.5.2.jar:na] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_77] at 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]

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


3
你在尝试时是否删除了索引?仅在索引不存在时才会创建该索引。如果索引已经存在,则不会更新设置。首先删除索引,让 Spring 重新创建它。你也可以使用 GET /estabelecimento/_settings 检查设置,也许可以提供一些见解。 - Jettro Coenradie
3个回答

7
我猜你需要从JSON文件中删除字段"settings":,只保留内容。

不要使用:

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

希望能对你有所帮助。

有没有办法我可以调试@Setting?我认为问题可能出在那里... - brevleq
请确认一下,您的JSON文件是否位于settingPath中指定的相同位置? - Richa
1
移除分析器部分,查看创建了多少个分片。如果是您在设置中提到的1,则我们可以确定您的JSON文件已被读取,而分析器存在问题。如果创建的分片数量为5(默认值),则说明您的JSON文件未被读取。 - Richa
它没有读取文件:[DEBUG] org.elasticsearch.indices.memory - [Nightside] 重新计算分片索引缓冲区(原因=[[ADDED]]),总共为[354.3mb],有[5]个活动分片,每个分片设置为索引=[70.8mb],translog=[64kb]。 - brevleq
我曾经遇到过同样的问题,当我删除设置文本后,它就可以工作了。使用的版本是elasticsearch.version = 2.0.1.RELEASE。 - tanmally
显示剩余4条评论

5

问题已解决

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

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

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


0

我曾经遇到过类似的问题,这可能是由于多种原因引起的:

  1. 确保您的json文件位于与settingPath中提到的位置相同,并且被正确读取。如Richa在上面所说,可以通过从json中删除分析器并测试创建的分片数量来验证此操作。
  2. 如果位置正确但仍然无法读取json文件,则只需检查您是否在模型类中添加了@Document(indexName =“indexName”,createIndex = false)注释,然后从文档注释中简单地删除createIndex = false,然后再次尝试。
  3. 始终记得删除旧索引,然后再次测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接