Lucene休眠搜索



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

@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=创建ContentItem(ContentType.VIDEO(;contentItemRepository.save(视频1(;

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());
}

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

您观察到的结果是由于在提交事务时进行了事实索引。据我所见,你的测试没有使用事务,所以你从来没有索引任何东西。

请注意,大规模索引也没有用处:由于ORM会话甚至没有刷新到数据库,因此大规模索引器(使用自己的会话(将只看到一个空数据库。

尝试将各种操作封装在事务模板中,如下所述:


@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配置为等待索引完成,然后再进行下一个事务。您可以通过将自动索引同步策略设置为sync来实现这一点。

src/test/resources/application.properties:中

hibernate.search.automatic_indexing.synchronization.strategy = sync

最新更新