首页 > 解决方案 > 如何将数据从H2数据库导入elasticsearch?

问题描述

我正在尝试使用 elasticsearch 从 H2 数据库中搜索数据。elasticsearch在我的项目中工作正常。我在外部添加了elasticsearch。当我使用构造函数添加数据时,它会添加到elasticsearch。但是如果尝试将数据从H2数据库添加到elasticsearch,我会收到此错误。
- 创建文件中定义的名称为“itemMigrator”的 bean 时出错。
- 创建名为“userJpaRepository”的 bean 时出错:调用 init 方法失败;
- 没有找到用户类型的属性 findAll!

spring-boot-starter-parent 2.0.6.RELEASE

elasticsearch 版本-5.6.12

我正在关注这个例子https://www.hameister.org/SpringBootElasticsearch.html

http://techprimers.com/spring-data-elastic-search-example-3-using-spring-jpa/

用户.java

    @Entity
@Document(indexName = "user", type = "user", shards = 1)
@Table(name = "user_detail")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @NotBlank
    @Column(name = "first_name")
    private String firstName;
    @NotBlank
    @Column(name = "last_name")
    private String lastName;

SearchQueryBuilder.java

@Component
    public class SearchQueryBuilder {

         private ElasticsearchTemplate elasticsearchTemplate;

            @Autowired
            public SearchQueryBuilder(ElasticsearchTemplate elasticsearchTemplate) {
                this.elasticsearchTemplate = elasticsearchTemplate;
            }

        public List<User> getAll(String text) {

            QueryBuilder query = QueryBuilders.boolQuery()
                    .should(
                            QueryBuilders.queryStringQuery(text)
                                    .lenient(true)
                                    .field("firstName")
                                    .field("role")
                    ).should(QueryBuilders.queryStringQuery("*" + text + "*")
                            .lenient(true)
                            .field("firstName")
                            .field("role"));

            NativeSearchQuery build = new NativeSearchQueryBuilder()
                    .withQuery(query)
                    .build();

            List<User> userses = elasticsearchTemplate.queryForList(build, User.class);

            return userses;
        }
    }

ItemMigrator.java

@Autowired
    ElasticsearchOperations operations;
    @Autowired
    UsersRepository UsersRepository;
    @Autowired
    UserJpaRepository jpaRepository;

    @Autowired
    public ItemMigrator(UserJpaRepository jpaRepository, ElasticsearchTemplate operations, UsersRepository UsersRepository) {
        this.jpaRepository = jpaRepository;
        this.operations = operations;
        this.UsersRepository = UsersRepository;
    }

    @PostConstruct
    @Transactional
    public void loadAll() {
        Iterable<User> items = jpaRepository.findAll();
        operations.putMapping(User.class);
        UsersRepository.saveAll(items);
    }

}

UserJpaRepository.java

    public interface UserJpaRepository extends JpaRepository<User, Long> 

用户存储库.java

public interface UsersRepository extends ElasticsearchRepository<User, Long>{
        List<User> findByFirstName(String text);
        List<User> findByRole(String text);

手动搜索资源.java

    @RestController
@RequestMapping("/rest/manual/search")
public class ManualSearchResource {

     @Autowired
        private SearchQueryBuilder searchQueryBuilder;

        @GetMapping(value = "/{text}")
        public List<User> getAll(@PathVariable final String text) {
            return searchQueryBuilder.getAll(text);
        }
}

配置文件

    @Configuration
@EnableJpaRepositories(basePackages = "net.kzn.shoppingbackend")
@EnableElasticsearchRepositories(basePackages = "net.kzn.shoppingbackend")
@ComponentScan(basePackages = { "net.kzn.shoppingbackend" })
public class Config {

    @Bean
    public Client client() throws UnknownHostException {
        Settings settings = Settings.builder()
                 .put("client.transport.sniff", true)
                    .put("cluster.name", "elasticsearch").build();
        @SuppressWarnings("resource")
        TransportClient client = new PreBuiltTransportClient(settings)
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
         return client;
    }

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() throws UnknownHostException {
        return new ElasticsearchTemplate(client());
    }
}

这是我的堆栈跟踪https://www.dropbox.com/s/nxf2a3m961dx7a7/elastic_error.txt?dl=0

添加@Entity 和@Document 是同一个类是否正确?请告诉我我在这里做错了什么。

标签: javaspring-bootelasticsearchh2

解决方案


推荐阅读