Java Lucene Hibernate搜索
我正在尝试实现lucene搜索。我建立回购协议如下 公共类CustomizedContentItemRepositoryImpl实现CustomizedContentItemRepository{Java Lucene Hibernate搜索,java,lucene,hibernate-search,Java,Lucene,Hibernate Search,我正在尝试实现lucene搜索。我建立回购协议如下 公共类CustomizedContentItemRepositoryImpl实现CustomizedContentItemRepository{ @PersistenceContext private EntityManager entityManager; @Override public List<ContentItem> librarySearch(String searchText) { SearchResult
@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;
}
@PersistenceContext
私人实体管理者实体管理者;
@凌驾
公共列表库搜索(字符串搜索文本){
SearchResult=Search.session(entityManager.Search)(ContentItem.class)
.其中(f->f.匹配()
.fields(“描述”、“标题”、“创建者.姓氏”、“创建者.姓氏”)
.匹配(搜索文本))
.fetchAll();
List contentItems=result.hits();
归还物品;
}
以及服务Impl作为流程:
public List<ContentItem> searchContentItems(String searchText) {
return contentItemRepository.librarySearch(searchText);
}
公共列表searchContentItems(字符串searchText){
返回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(音频);
assertEquals(3,contentItemRepository.findAll().size());
Search.session(entityManager)
.massIndexer(ContentItem.class)
.startAndWait();
收集视频=contentItemService.searchContentItems(“类型”);
assertEquals(2,videos.size());
迭代器迭代器=videos.Iterator();
assertEquals(video2.getId(),iterator.next().getId());
assertEquals(video1.getId(),iterator.next().getId());
}
您得到的是一个null
值,还是一个空列表?很可能您得到的是一个空列表
您观察到的结果是由于这个事实。从我所看到的,您的测试没有使用事务,所以您从来没有索引任何东西
请注意,海量索引也没有用处:因为ORM会话甚至没有刷新到数据库,所以海量索引器(使用自己的会话)只会看到一个空数据库
尝试将各种操作封装在事务模板中,如下所述:
@自动连线
交易模板交易模板;
@试验
void searchContentItems()引发InterruptedException{
transactionTemplate.execute(已忽略->{
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(音频);
返回null;
});
transactionTemplate.execute(已忽略->{
assertEquals(3,contentItemRepository.findAll().size());
收集视频=contentItemService.searchContentItems(“类型”);
assertEquals(2,videos.size());
迭代器迭代器=videos.Iterator();
assertEquals(video2.getId(),iterator.next().getId());
assertEquals(video1.getId(),iterator.next().getId());
返回null;
});
}
为了通过此测试,您还需要将Hibernate Search配置为在继续下一个事务之前等待索引完成。您可以通过将设置为sync
来完成此操作
在src/test/resources/application.properties
中:
hibernate.search.automatic_indexing.synchronization.strategy = sync
hibernate.search.automatic_indexing.synchronization.strategy = sync