elasticsearch - 休眠搜索和弹性搜索:mapper_parsing_exception + 分析器 [...] 找不到字段 [...]
问题描述
我正在使用休眠搜索自动为特定实体创建索引
@Entity
@Indexed
public class Entity extends BaseEntity {
private static final long serialVersionUID = -6465422564073923433L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@Field(bridge = @FieldBridge(impl = PropertyFieldBridge.class))
private List<PropertyValue> properties = new ArrayList<>(); // PropertyValue is an abstract
}
字段桥正在创建格式为:pt_[a-zA-Z0-9]+_i18n 的字符串字段。
之后,我正在创建一个动态模板来处理翻译的字段:
PUT {{elasticsearch}}/com.orm.entity.entity.entity/com.orm.entity.entity.Entity/_mapping
{
"com.gamila.api.orm.entity.entity.Entity": {
"dynamic_templates": [
{
"my_analyzer": {
"match_mapping_type": "string",
"match_pattern": "regex",
"match": "^pt_[a-zA-Z0-9]+_i18n",
"mapping": {
"type": "text",
"analyzer": "portugueseAnalyzer"
}
}
}
]
}
}
但是当我创建一个实体时,它总是返回一个错误:
Response: 400 'Bad Request' with body
{
"error": {
"root_cause": [
{
"type": "mapper_parsing_exception",
"reason": "analyzer [portugueseAnalyzer] not found for field [pt_name_i18n]"
}
],
"type": "mapper_parsing_exception",
"reason": "analyzer [portugueseAnalyzer] not found for field [pt_name_i18n]"
},
"status": 400
}
葡萄牙语分析器通过以下方式定义:
public class Analyzer implements ElasticsearchAnalysisDefinitionProvider {
@Override
public void register(ElasticsearchAnalysisDefinitionRegistryBuilder builder) {
builder.analyzer("portugueseAnalyzer")
.withTokenizer("standard")
.withTokenFilters("lowercase", "portugueseStemmer", "portugueseStop", "edge_ngram_3");
builder.tokenFilter("portugueseStemmer")
.type("stemmer").param("language", "portuguese");
builder.tokenFilter("portugueseStop")
.type("stop").param("stopwords", "_portuguese_");
}
}
有人可以告诉我我做错了什么吗?我已经在stackoverflow中浏览了一些问题,但没有成功。
PS:我正在使用 AWS 的 elasticsearch (5.6)
提前致谢
解决方案
当 Hibernate Search 5 将映射推送到 Elasticsearch 时,它只会包含映射中某处实际使用的分析器的分析器定义。在您的情况下,就 Hibernate Search 而言,没有使用分析器,因此它被忽略了。
作为 Hibernate Search 5 中的一种解决方法,您可以声明一个使用您的分析器的虚拟字段,但永远不会被填充。您可以在此处找到如何执行此操作的示例。
推荐阅读
- sql-server - 具有水平过滤的事务复制
- json - 如何使用 JSON 数据生成 Helm 图表配置文件
- linux - execl off 两个字节
- c# - 我需要帮助理解通过二维 (2D) 数组循环
- kubernetes - Kubernetes中的OutOfcpu错误是什么意思?
- laravel - Laravel 5.4 和 5.8 之间使用 Model::create 的区别?
- javascript - setTimeOut 和模式选择的生活游戏问题
- android - 如何自定义 Mapbox 路由的样式?
- javascript - 结合 google-maps-react 与 react-router
- typescript - 更改对象属性的位置后获取正确的类型信息