使用Hibernate Search构建元搜索引擎时遇HSEARCH000610错误
这个报错说明Hibernate Search在Vehiculo索引中找不到名为CODIGO的字段,以下是排查和解决步骤:
核对实体类的索引字段配置:检查
Vehiculo实体类,确认是否给对应字段添加了Hibernate Search的索引注解(比如@FullTextField、@KeywordField)。注意字段名大小写——如果实体类属性是codigo(小写),默认生成的索引字段名也是小写,查询时用大写CODIGO就会匹配失败。要是需要强制用大写字段名,可以在注解里指定name属性,比如@FullTextField(name = "CODIGO")。重建索引:如果是刚修改过实体的索引配置,或者是首次部署应用,旧的索引结构可能和当前实体不匹配。执行全量索引重建:
SearchSession searchSession = Search.session(entityManager); searchSession.massIndexer(Vehiculo.class) .startAndWait();检查查询代码的字段名:确认查询DSL中指定的字段名和索引中实际存在的字段名完全一致。比如用match查询时:
错误写法(字段名不匹配):searchSession.search(Vehiculo.class) .where(f -> f.match().field("CODIGO").matching("XXX")) .fetchHits(20);正确写法(和索引字段名一致):
searchSession.search(Vehiculo.class) .where(f -> f.match().field("codigo").matching("XXX")) .fetchHits(20);验证索引映射:直接查看搜索引擎(比如Elasticsearch)中的
Vehiculo索引映射,确认目标字段是否存在。如果是Elasticsearch,可以用GET /vehiculo/_mapping命令查看字段列表。
附报错信息:
org.hibernate.search.util.common.SearchException: HSEARCH000610: Unknown field 'CODIGO'.
Context: indexes [Vehiculo]
at org.hibernate.search.engine.backend.scope.spi.AbstractSearchIndexScope.fieldInternal(AbstractSearchIndexScope.java:150)
at org.hibernate.search.engine.backend.scope.spi.AbstractSearchIndexScope.field(AbstractSearchIndexScope.java:138)
at org.hibernate.search.engine.backend.scope.spi.AbstractSearchIndexScope.fieldQueryElement(AbstractSearchIndexScope.java:205)
at org.hibernate.search.engine.search.predicate.dsl.impl.MatchPredicateFieldMoreStepImpl.<init>(MatchPredicateFieldMoreStepImpl.java:45)
at org.hibernate.search.engine.search.predicate.dsl.impl.MatchPredicateFieldStepImpl.fields(MatchPredicateFieldStepImpl.java:26)
内容的提问来源于stack exchange,提问作者MariaRambo

