搜索引擎使用技巧有哪些? 全文搜索引擎使用技巧( 二 )


filterForDublicates(myMovie, dublicates)).toList();
// remove dublicates
results = results.isEmpty() ? ftMovies :
List.copyOf(CommonUtils.filterDublicates(results));
}
return results.subList(0, results.size() > 50 ? 50 : results.size());
}

public List<Movie> findMoviesBySearchTerm(String bearerStr,
SearchTermDto searchTermDto) {
List<Movie> movies = searchTermDto.getSearchPhraseDto() != null ?
this.movieRep.findMoviesByPhrase(searchTermDto.getSearchPhraseDto()) :
this.movieRep.
findMoviesBySearchStrings(searchTermDto.getSearchStringDtos());
List<Movie> filteredMovies = movies.stream().filter(myMovie ->
myMovie.getUsers().stream().anyMatch(myUser -> myUser.getId()
.equals(this.auds.getCurrentUser(bearerStr).getId()))).toList();
return filteredMovies;
}

该findMoviesByFilterCriteria(...) *** 首先调用 JPA 存储库来选择电影 。该 *** getCurrentUser(...)查找为其颁发 JWT 令牌的用户实体并返回 ID 。电影有一个与用户相关的数据库 。由于这种关系,一部电影在表中只存储一次,并由所有已导入它的用户使用 。

然后SearchTermDto创建 来调用findMoviesBySearchTerm(...)全文搜索的 ***。该 *** 使用在MovieRep电影的“概览”索引中执行搜索并过滤当前用户的电影的结果 。

然后将 JPA 查询和全文搜索的结果分 3 步合并:

findDublicates(...)返回在两个搜索结果中找到的 id。
返回 id的filterForDublicates(...)实体 。
filterDublicates(...)删除具有重复 ID 的对象并返回它们 。如果没有找到共同的结果,则返回全文搜索结果 。
组合结果限制为 50 个实体并返回 。

数据存储库
MovieRepositoryBean和ActorRepositoryBean实现JPA Criteria 搜索和 Hibernate 搜索搜索 。的 JPA 搜索MovieRepositoryBean如下所示:


【搜索引擎使用技巧有哪些? 全文搜索引擎使用技巧】public List<Movie> findByFilterCriteria(MovieFilterCriteriaDto



该 *** 的这一部分filterByCriteria(...) 显示了电影标题搜索和演员姓名搜索的 where 条件 。

首先,创建条件查询和根电影对象 。创建谓词列表以包含搜索的查询条件 。

检查电影标题的存在和最小长度 。EntityManager 用于为“title”属性创建一个“like”标准,其中包含一个“lower”函数 。标题字符串被转换为小写并用“%%”包围以查找包含不区分大小写字符串的所有标题 。然后将条件添加到谓词列表中 。

检查演员名称的存在和最小长度 。然后创建 JPA 元模型以获取要加入的演员实体的 EntityType 。EntityManager 用于创建“喜欢”和“较低”标准 。根实体 ('cMove') 用于将转换实体加入查询 。演员实体的“characterName”用在“like”标准中 。搜索的演员姓名字符串被转换为小写并用“%%”包围以查找包含搜索字符串的所有演员姓名 。最后将完整的参与者标准添加到谓词列表中 。

然后以与演员姓名搜索标准相同的方式创建用户检查标准并将其添加到谓词列表中 。

添加条件谓词并添加CriteriaQuery.where(...)“distinct(true)”调用以删除重复项 。

查询结果限制为 1000 个实体,以保护服务器免受 I/O 和内存过载的影响 。

全文检索
全文搜索在findMoviesBySearchPhrase(...)MovieRepository 的 *** 中实现:


@SuppressWarnings("unchecked")
public List<Movie> findMoviesByPhrase(SearchPhraseDto searchPhraseDto) {
List<Movie> resultList = List.of();
if (searchPhraseDto.getPhrase() != null &&
searchPhraseDto.getPhrase().trim().length() > 2) {
FullTextEntityManager fullTextEntityManager =
Search.getFullTextEntityManager(entityManager);
QueryBuilder movieQueryBuilder =
fullTextEntityManager.getSearchFactory().buildQueryBuilder()
.forEntity(Movie.class).get();