Поиск в режиме гибернации [5.11.5.Final] динамические числовые свойства: не удается автоматически определить тип поля для поля ‘ …’

#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 отличается, поэтому миграция может потребовать значительной работы.