簡體   English   中英

Lucene Hibernate 搜索

[英]Lucene Hibernate Search

我正在嘗試實現 lucene 搜索。 我將存儲庫構建為以下 public class CustomizedContentItemRepositoryImpl implements 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;
}

以及服務 Impl 作為流動:

public List<ContentItem> searchContentItems(String searchText) {
    return contentItemRepository.librarySearch(searchText);
}

當我測試它時,我總是得到一個 null 值

這是一個測試代碼 @Test void searchContentItems() throws 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());
}

您得到的是null值,還是只是一個空列表? 您很可能得到一個空列表。

您觀察到的結果是由於在您提交事務時發生了索引 據我所知,您的測試沒有使用事務,因此您永遠不會索引任何內容。

請注意,質量索引也沒有用:因為您的 ORM session 甚至沒有刷新到數據庫中,所以質量索引器(使用自己的會話)只會看到一個空數據庫。

嘗試將各種操作封裝事務模板中,如下所述:


@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 搜索以等待索引完成,然后再進行下一個事務。 您可以通過將自動索引同步策略設置為sync來做到這一點。

src/test/resources/application.properties

hibernate.search.automatic_indexing.synchronization.strategy = sync

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM