【问题标题】:Lucene Hibernate SearchLucene 休眠搜索
【发布时间】:2021-07-28 07:07:05
【问题描述】:

我正在尝试实现 lucene 搜索。我将回购构建如下 公共类 CustomizedContentItemRepositoryImpl 实现 CustomizedContentItemRepository {

@PersistenceContext
private EntityManager entityManager;

@Override
public List<ContentItem> librarySearch(String searchText) {

    SearchResult<ContentItem> result = Search.session(entityManager).search(ContentItem.class)
            .where(f -> f.match()
                    .fields("description", "title", "creator.firstName", "creator.lastName")
                    .matching(searchText))
            .fetchAll();
    List<ContentItem> contentItems = result.hits();
    return contentItems;
}

还有作为流动的服务Impl:

public List<ContentItem> searchContentItems(String searchText) {
    return contentItemRepository.librarySearch(searchText);
}

当我测试它时,我总是得到一个空值

这是一个测试代码 @测试 void searchContentItems() 抛出 InterruptedException { ContentItem video1 = createContentItem(ContentType.VIDEO); contentItemRepository.save(video1);

    ContentItem video2 = createContentItem(ContentType.VIDEO, 1000);
    video2.getSubjects().clear();
    contentItemRepository.save(video2);

    ContentItem audio = createContentItem(ContentType.AUDIO);
    contentItemRepository.save(audio);
    assertEquals(3, contentItemRepository.findAll().size());

        Search.session(entityManager)
                .massIndexer(ContentItem.class)
                .startAndWait();

    Collection<ContentItem> videos = contentItemService.searchContentItems("type");
    assertEquals(2, videos.size());
    Iterator<ContentItem> iterator = videos.iterator();
    assertEquals(video2.getId(), iterator.next().getId());
    assertEquals(video1.getId(), iterator.next().getId());
}

【问题讨论】:

    标签: java lucene hibernate-search


    【解决方案1】:

    您得到的是null 值,还是只是一个空列表?您很可能得到一个空列表。

    您观察到的结果是由于indexing happens when you commit a transaction 这一事实。据我所知,您的测试没有使用事务,因此您永远不会索引任何内容。

    请注意,海量索引也没有用:因为您的 ORM 会话甚至没有刷新到数据库中,所以海量索引器(使用自己的会话)只会看到一个空数据库。

    尽量将各种操作封装在事务模板中,解释here

    
    @Autowired
    TransactionTemplate transactionTemplate;
    
    @Test
    void searchContentItems() throws InterruptedException {
        transactionTemplate.execute(ignored -> {
            ContentItem video1 = createContentItem(ContentType.VIDEO);
            contentItemRepository.save(video1);
    
            ContentItem video2 = createContentItem(ContentType.VIDEO, 1000);
            video2.getSubjects().clear();
            contentItemRepository.save(video2);
    
            ContentItem audio = createContentItem(ContentType.AUDIO);
            contentItemRepository.save(audio);
            return null;
        });
    
        transactionTemplate.execute(ignored -> {
            assertEquals(3, contentItemRepository.findAll().size());
    
            Collection<ContentItem> videos = contentItemService.searchContentItems("type");
            assertEquals(2, videos.size());
            Iterator<ContentItem> iterator = videos.iterator();
            assertEquals(video2.getId(), iterator.next().getId());
            assertEquals(video1.getId(), iterator.next().getId());
            return null;
        });
    }
    

    为了通过此测试,您还需要将 Hibernate Search 配置为等待索引完成,然后再进行下一个事务。您可以通过将automatic indexing synchronization strategy 设置为sync 来做到这一点。

    src/test/resources/application.properties:

    hibernate.search.automatic_indexing.synchronization.strategy = sync
    

    【讨论】:

      猜你喜欢
      • 2012-08-17
      • 1970-01-01
      • 2014-08-31
      • 2015-02-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多