Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Lucene Hibernate搜索_Java_Lucene_Hibernate Search - Fatal编程技术网

Java Lucene Hibernate搜索

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

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