我正在尝试实现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