#java #spring-boot #hibernate #elasticsearch #hibernate-search
#java #весенняя загрузка #переход в режим гибернации #elasticsearch #переход в режим гибернации-поиск
Вопрос:
У меня возникли некоторые проблемы с правильной индексацией динамических числовых полей, кажется, они всегда индексируются как строки.
В моем понимании, при индексации динамических числовых полей я должен использовать динамические шаблоны:
PUT /com.product.product
{
"mappings": {
"com.product.Product": {
"dynamic_templates": [
{
"numeric_sort": {
"match_mapping_type": "*",
"match_pattern": "regex",
"match": "^sort_num_.*",
"mapping": {
"type": "double"
}
}
}
]
}
}
}
Которое я загружаю в прослушиватель событий:
@Configuration
@Transactional
public abstract class DynamicTemplateConfig {
@EventListener
public void addDynamicTemplates(ContextRefreshedEvent event) {
if (this.searchIndexingIsActive) {
this.addDynamicTemplates();
}
}
...
}
И я индексирую свойства в мосте полей:
public class PropertyValueFieldBridge implements FieldBridge {
...
private void indexBigDecimalProperties(Document document, LuceneOptions luceneOptions, PropertyBigDecimal property) {
String fieldName = PREFIX_SORT NUMERIC DELIMITER property.getProperty().getCode();
Double indexedValue = property.getValue().doubleValue();
luceneOptions.addNumericFieldToDocument(
fieldName,
indexedValue,
document);
}
}
После индексации этих свойств BigDecimal я всегда заканчиваю индексированием строкового свойства:
"_source": {
"id": "1",
"sort_id": 1,
"filter_id": 1,
"sort_num_quantity": "115.0"
}
И когда я пытаюсь отсортировать это свойство, у меня возникает следующее исключение:
org.hibernate.search.exception.SearchException: Cannot automatically determine the field type for field 'sort_num_quantity'. Use byField(String, Sort.Type) to provide the sort type explicitly.
at org.hibernate.search.query.dsl.sort.impl.SortFieldStates.getCurrentSortFieldTypeFromMetamodel(SortFieldStates.java:177) ~[hibernate-search-engine-5.11.5.Final.jar:5.11.5.Final]
at org.hibernate.search.query.dsl.sort.impl.SortFieldStates.determineCurrentSortFieldTypeAutomaticaly(SortFieldStates.java:150) ~[hibernate-search-engine-5.11.5.Final.jar:5.11.5.Final]
at org.hibernate.search.query.dsl.sort.impl.ConnectedSortContext.byField(ConnectedSortContext.java:42) ~[hibernate-search-engine-5.11.5.Final.jar:5.11.5.Final]
Я стараюсь избегать использования byField(String, Sort.Type)
, поскольку для этого требуется проверка эксплицитности каждого свойства, имя и тип которого я могу не знать.
Я делаю что-то не так в процессе индексации?
Заранее спасибо
Ответ №1:
Я не думаю, что вы делаете что-то не так. Экспериментальная интеграция Elasticsearch в Hibernate Search 5 на самом деле не поддерживает динамические поля. Вы не можете указать тип полей заранее, и, по-видимому, по умолчанию используется строковый тип для динамических полей.
Решением было бы обновление до Hibernate Search 6 (в настоящее время находится на стадии выпуска кандидата), поскольку он поддерживает динамические поля с помощью шаблонов полей API Hibernate Search 6 отличается, поэтому миграция может потребовать значительной работы.