spring-data-elasticsearch - 注册自定义分析器
spring-data-elasticsearch - registering custom analyser
我正在尝试在我的应用程序中使用 ElasticSearch 进行全文搜索,此时我正在尝试使用 autocomplete analyser:
{
"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] failed to put mappings on indices [[estabelecimento]], type [esestabelecimento]
org.elasticsearch.index.mapper.MapperParsingException: Analyzer [autocomplete] not found for field [nome]
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.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 - failed to load elasticsearch nodes : org.elasticsearch.index.mapper.MapperParsingException: Analyzer [autocomplete] not found for field [nome]
我无法确定问题的原因,我不知道是分析器无效还是elasticsearch甚至找到了autocomplete-analyser.json文件。我该如何解决这个问题?
我想您需要从 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"
]
}
}
}
}
}
希望对你有帮助..
已解决
经过一番研究,我发现问题是由以下声明引起的:
@Bean
public ElasticsearchOperations elasticsearchTemplate(Client client) {
return new ElasticsearchTemplate(client, new CustomEntityMapper());
}
我删除了这个声明,它开始获取配置。
我遇到了类似的问题,这可能是由于多种原因造成的:
- 确保您的 json 文件位于同一位置
settingPath 中提到的位置及其正确读取。如 Richa 在上面所说的那样验证这一点,只需从 json 中删除分析器并测试
创建的分片数量。
- 如果位置正确但仍然
json 文件未被读取然后检查你是否添加了@Document(indexName =
"indexName", createIndex = false) 模型中的注释 class
然后简单地从文档注释中删除 createIndex = false 然后再试一次。
- 永远记得删除旧索引,然后再次测试。
我正在尝试在我的应用程序中使用 ElasticSearch 进行全文搜索,此时我正在尝试使用 autocomplete analyser:
{
"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] failed to put mappings on indices [[estabelecimento]], type [esestabelecimento] org.elasticsearch.index.mapper.MapperParsingException: Analyzer [autocomplete] not found for field [nome] 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.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 - failed to load elasticsearch nodes : org.elasticsearch.index.mapper.MapperParsingException: Analyzer [autocomplete] not found for field [nome]
我无法确定问题的原因,我不知道是分析器无效还是elasticsearch甚至找到了autocomplete-analyser.json文件。我该如何解决这个问题?
我想您需要从 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"
]
}
}
}
}
}
希望对你有帮助..
已解决
经过一番研究,我发现问题是由以下声明引起的:
@Bean
public ElasticsearchOperations elasticsearchTemplate(Client client) {
return new ElasticsearchTemplate(client, new CustomEntityMapper());
}
我删除了这个声明,它开始获取配置。
我遇到了类似的问题,这可能是由于多种原因造成的:
- 确保您的 json 文件位于同一位置 settingPath 中提到的位置及其正确读取。如 Richa 在上面所说的那样验证这一点,只需从 json 中删除分析器并测试 创建的分片数量。
- 如果位置正确但仍然 json 文件未被读取然后检查你是否添加了@Document(indexName = "indexName", createIndex = false) 模型中的注释 class 然后简单地从文档注释中删除 createIndex = false 然后再试一次。
- 永远记得删除旧索引,然后再次测试。