程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Lucene 休眠搜索大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Lucene 休眠搜索?

开发过程中遇到Lucene 休眠搜索的问题如何解决?下面主要结合日常开发的经验,给出你关于Lucene 休眠搜索的解决方法建议,希望对你解决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,请注明来意。
标签:休眠搜索