[英]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.