无法在 Spring Boot Hibernate Search Elasticsearch 中配置我自己的分析器

阿兰·B

请帮忙。我尝试在 Spring Boot 应用程序中配置弹性搜索索引已经很多天了,当然我错过了文档中的某些内容,但我没有找到。

我对 spring 比较陌生,几天后我发现它非常强大,这是我的第一个很长的问题。

问题描述我有一个简单的对象 Book 在我自己的分析器上用 @FullTextField 索引

@Entity
@Indexed
@Data
public class Book {
    @Id
    @GeneratedValue
    private Long id;

    @FullTextField(analyzer = "my_analyze_french")
    private String name;

用我的配置

package com.mycompany.jpa.elasticsearch;
import org.hibernate.search.backend.elasticsearch.analysis.ElasticsearchAnalysisConfigurationContext;
import org.hibernate.search.backend.elasticsearch.analysis.ElasticsearchAnalysisConfigurer;

// https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#getting-started-analysis
public class CVAnalysisConfigurer implements ElasticsearchAnalysisConfigurer {
    @Override
    public void configure(ElasticsearchAnalysisConfigurationContext context) {
        System.out.println("DEFINE a NEW ANALYZER");
        // define each analyzer + associated token filter parameters
        context.analyzer("my_analyze_french").custom()
                .tokenizer("standard")
                .tokenFilters("lowercase", "snowball_french", "asciifolding"); // warning order

        // stemmer for french : regroup words by family
        context.tokenFilter("snowball_french")
                .type("snowball")
                .param("language", "French");

        System.out.println("DEFINE a NEW ANALYZER:DONE");
    }
}

在我的application.propertiesi 中指明 bean 的名称来配置我的分析器

# cf https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#backend-elasticsearch-analysis
hibernate.search.backend.analysis.configurer=class:com.mycompany.jpa.elasticsearch.CVAnalysisConfigurer

当我启动我的应用程序时出现错误

2021-06-21 11:37:05.685 ERROR 17135 --- [port thread - 1] o.h.s.e.r.spi.RootFailureCollector       : HSEARCH000521: Hibernate Search encountered a failure during bootstrap; continuing for now to list all problems, but the process will ultimately be aborted.
Context: Hibernate ORM mapping, type 'com.mycompany.jpa.elasticsearch.Book'
Failure:

org.hibernate.search.util.common.SearchException: HSEARCH400007: Elasticsearch request failed: HSEARCH400090: Elasticsearch response indicates a failure.
Request: PUT /book-000001 with parameters {}
Response: 400 'Bad Request' from 'http://localhost:9200' with body 
{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "Failed to parse mapping [_doc]: analyzer [my_analyze_french] has not been configured in mappings"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping [_doc]: analyzer [my_analyze_french] has not been configured in mappings",
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "analyzer [my_analyze_french] has not been configured in mappings"
    }
  },
  "status": 400
}

    at org.hibernate.search.backend.elasticsearch.work.impl.AbstractNonBulkableWork.handleResult(AbstractNonBulkableWork.java:84) ~[hibernate-search-backend-elasticsearch-6.0.4.Final.jar:6.0.4.Final]
    at org.hibernate.search.backend.elasticsearch.work.impl.AbstractNonBulkableWork.lambda$execute$3(AbstractNonBulkableWork.java:66) ~[hibernate-search-backend-elasticsearch-6.0.4.Final.jar:6.0.4.Final]
    at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:642) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073) ~[na:na]
    at org.hibernate.search.backend.elasticsearch.client.impl.ElasticsearchClientImpl$1.onFailure(ElasticsearchClientImpl.java:127) ~[hibernate-search-backend-elasticsearch-6.0.4.Final.jar:6.0.4.Final]
    at org.elasticsearch.client.RestClient$FailureTrackingResponseListener.onDefinitiveFailure(RestClient.java:644) ~[elasticsearch-rest-client-7.13.2.jar:7.13.2]
    at org.elasticsearch.client.RestClient$1.completed(RestClient.java:386) ~[elasticsearch-rest-client-7.13.2.jar:7.13.2]
    at org.elasticsearch.client.RestClient$1.completed(RestClient.java:370) ~[elasticsearch-rest-client-7.13.2.jar:7.13.2]
    at org.apache.http.concurrent.BasicFuture.completed(BasicFuture.java:122) ~[httpcore-4.4.14.jar:4.4.14]
    at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted(DefaultClientExchangeHandlerImpl.java:181) ~[httpasyncclient-4.1.4.jar:4.1.4]
    at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:448) ~[httpcore-nio-4.4.14.jar:4.4.14]
    at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:338) ~[httpcore-nio-4.4.14.jar:4.4.14]
    at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:265) ~[httpcore-nio-4.4.14.jar:4.4.14]
    at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81) ~[httpasyncclient-4.1.4.jar:4.1.4]
    at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39) ~[httpasyncclient-4.1.4.jar:4.1.4]
    at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114) ~[httpcore-nio-4.4.14.jar:4.4.14]
    at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162) ~[httpcore-nio-4.4.14.jar:4.4.14]
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337) ~[httpcore-nio-4.4.14.jar:4.4.14]
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315) ~[httpcore-nio-4.4.14.jar:4.4.14]
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276) ~[httpcore-nio-4.4.14.jar:4.4.14]
    at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) ~[httpcore-nio-4.4.14.jar:4.4.14]
    at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591) ~[httpcore-nio-4.4.14.jar:4.4.14]
    at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]
Caused by: org.hibernate.search.util.common.SearchException: HSEARCH400090: Elasticsearch response indicates a failure.
    at org.hibernate.search.backend.elasticsearch.work.impl.DefaultElasticsearchRequestSuccessAssessor.checkSuccess(DefaultElasticsearchRequestSuccessAssessor.java:103) ~[hibernate-search-backend-elasticsearch-6.0.4.Final.jar:6.0.4.Final]
    at org.hibernate.search.backend.elasticsearch.work.impl.DefaultElasticsearchRequestSuccessAssessor.checkSuccess(DefaultElasticsearchRequestSuccessAssessor.java:86) ~[hibernate-search-backend-elasticsearch-6.0.4.Final.jar:6.0.4.Final]
    at org.hibernate.search.backend.elasticsearch.work.impl.AbstractNonBulkableWork.handleResult(AbstractNonBulkableWork.java:79) ~[hibernate-search-backend-elasticsearch-6.0.4.Final.jar:6.0.4.Final]
    ... 23 common frames omitted

2021-06-21 11:37:05.741 ERROR 17135 --- [           main] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.search.util.common.SearchException: HSEARCH000520: Hibernate Search encountered failures during bootstrap. Failures:

    Hibernate ORM mapping: 
        type 'com.mycompany.jpa.elasticsearch.Book': 
            failures: 
              - HSEARCH400007: Elasticsearch request failed: HSEARCH400090: Elasticsearch response indicates a failure.
Request: PUT /book-000001 with parameters {}
Response: 400 'Bad Request' from 'http://localhost:9200' with body 
{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "Failed to parse mapping [_doc]: analyzer [my_analyze_french] has not been configured in mappings"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping [_doc]: analyzer [my_analyze_french] has not been configured in mappings",
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "analyzer [my_analyze_french] has not been configured in mappings"
    }
  },
  "status": 400
}

2021-06-21 11:37:05.742  WARN 17135 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.search.util.common.SearchException: HSEARCH000520: Hibernate Search encountered failures during bootstrap. Failures:

    Hibernate ORM mapping: 
        type 'com.mycompany.jpa.elasticsearch.Book': 
            failures: 
              - HSEARCH400007: Elasticsearch request failed: HSEARCH400090: Elasticsearch response indicates a failure.
Request: PUT /book-000001 with parameters {}
Response: 400 'Bad Request' from 'http://localhost:9200' with body 
{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "Failed to parse mapping [_doc]: analyzer [my_analyze_french] has not been configured in mappings"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping [_doc]: analyzer [my_analyze_french] has not been configured in mappings",
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "analyzer [my_analyze_french] has not been configured in mappings"
    }
  },
  "status": 400
}

2021-06-21 11:37:05.743  INFO 17135 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2021-06-21 11:37:05.758  INFO 17135 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2021-06-21 11:37:05.761  INFO 17135 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]

我的配置我使用 spring Boot 2.3.11,我的数据库如果是 h2

主要依赖是

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- for use of elastic search, automatic indexation with jpa -->
    <dependency>
        <groupId>org.hibernate.search</groupId>
        <artifactId>hibernate-search-mapper-orm</artifactId>
        <version>6.0.4.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.search</groupId>
        <artifactId>hibernate-search-backend-elasticsearch</artifactId>
        <version>6.0.4.Final</version>
    </dependency>

我指定了弹性搜索的版本

<properties>
    <elasticsearch.version>7.13.2</elasticsearch.version>
</properties>

我的服务器版本是一样的,我使用一个简单的 docker 来测试,我在每次启动之前从卷中删除节点

version: '3'
services:
  elasticsearchstudy:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.13.2
    container_name: elasticsearchstudy
    environment:
      - "discovery.type=single-node"
    volumes:
      - ./elasticsearch:/usr/share/elasticsearch/data:rw
    ports:
      - 9200:9200
    restart: unless-stopped

我试过什么?为了避免 Spring Boot 可能出现的一些问题,我尝试推迟引导,但无论有没有它都没有改变

@SpringBootApplication
@EnableJpaRepositories(bootstrapMode = BootstrapMode.DEFERRED)
public class HibernateSearchStudy {

我尝试在 Postman 上使用 REST API 配置我的分析,当我处理使用 REST API 创建的新索引时可以分析文档,localhost:9200/book/_analyze但无法在我的应用程序索引 Book-000001 上执行此操作(我无法修改先前创建的索引的分析器)

首先,我尝试在 a 中完成所有操作,@DataJpaTest但由于它不起作用(相同的错误),我现在尝试在 CommandLineRunner 中对其进行测试,该 CommandLineRunner 在我的存储库中插入数据,然后进行搜索

我认为我的ElasticsearchAnalysisConfigurer初始化从未被调用(我输入的跟踪configure从未出现)。怎么办?

任何帮助将不胜感激 !!

罗迪埃

application.properties是 Spring Boot 配置文件,而不是 Hibernate Search 配置文件。您不能只是在那里转储 Hibernate Search 属性。

相反,在您的 Hibernate Search 属性前加上spring.jpa.properties.,以便 Spring Boot 将这些属性传递给 Hibernate ORM,Hibernate ORM 将它们传递给 Hibernate Search。例如:

# cf https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#backend-elasticsearch-analysis
spring.jpa.properties.hibernate.search.backend.analysis.configurer=class:com.mycompany.jpa.elasticsearch.CVAnalysisConfigurer

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Boot Elasticsearch配置

我无法在 Spring Boot 中使用 Elasticsearch 实现 Reactive Repository

Spring Boot中的Hibernate统计信息无法正常工作?

在Spring Boot REST中无法从Hibernate POJO返回JSON

Spring Boot 2:无法构建Hibernate SessionFactory

Spring Boot:无法配置

在 Spring Boot 中记录 Hibernate

Hibernate Search 在多租户 Spring Boot 应用程序中初始化索引

为什么这个错误在Spring Boot中无法加载Elasticsearch节点?

使用Java API在Spring Boot上的Elasticsearch中无法对数组元素排序

如何使用 Spring Boot 配置 JPA + HIBERNATE

Spring Boot错误org.hibernate.MappingException:无法确定类型

Spring Boot + Hibernate多租户:@Transactional无法正常工作

Spring Boot .JAR无法运行(Maven,Intellij,Hibernate ...)

无法使用Spring Boot JPA构建Hibernate SessionFactory

无法使用Spring Boot和Hibernate连接到Oracle

Spring Boot 2.0无法连接到ElasticSearch 5.5.0-NoNodeAvailableException

在Spring Boot 2.1中覆盖Hibernate ConnectionProvider

Spring Boot with Hibernate Search 找不到 org.hibernate.query.ParameterMetadata

在Spring Boot中找不到Elasticsearch方法

从Spring Boot连接到内存中的ElasticSearch

Spring boot :Hibernate 注解

无法使用WebApp启动tomcat7(Spring + Hibernate + Hibernate Search 4.5)NoClassDefFound:CorruptIndexException

使用Hibernate搜索的Spring Boot-在Elasticsearch上未创建索引

在spring boot / spring data elasticsearch中禁用自动索引创建

Spring Boot 中的 Spring 安全配置无法按预期工作

Spring Boot-无法读取配置?

无法加载配置类错误spring boot

Hibernate Search + Spring Boot:java.lang.IllegalStateException:没有可用的事务性EntityManager