大佬教程收集整理的这篇文章主要介绍了Lucene 休眠搜索,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试实现 lucene 搜索。我按照以下方式构建了 Repo 公共类 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;
}
@H_801_6@
还有服务 Impl 作为流:
public List<ContentItem> searchContentItems(String searchText) {
return contentItemRepository.librarySearch(searchText);
}
@H_801_6@
当我测试它时,我总是得到一个空值
这是一个测试代码 @测试 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());
}
@H_801_6@
您得到的是 null@H_801_6@ 值,还是只是一个空列表?您很可能会得到一个空列表。
您观察到的结果是由于 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;
});
}
@H_801_6@
为了通过此测试,您还需要配置 Hibernate Search 以等待索引编制完成,然后再继续进行下一个事务。您可以通过将 automatic indexing synchronization strategy 设置为 sync@H_801_6@ 来实现。
在src/test/resources/application.properties@H_801_6@中:
hibernate.search.automatic_indexing.synchronization.strategy = sync
@H_801_6@
以上是大佬教程为你收集整理的Lucene 休眠搜索全部内容,希望文章能够帮你解决Lucene 休眠搜索所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。