@Service public class SearchService implements ISearchService { @Autowired private RestHighLevelClient client; @Autowired private RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.200.130:9200"))); // 分页搜索 @Override public PageDto<ItemDoc> search(SearchDto params) throws Exception { // 1.创建对象 SearchRequest request = new SearchRequest("item"); // 2.准备DSL // query String key = params.getKey(); if (key == null || "".equals(key)) { request.source().query(QueryBuilders.matchAllQuery()); } else { request.source().query(QueryBuilders.matchQuery("all", key)); } // 排序 sort request.source().sort("spec", SortOrder.ASC); // 分页 request.source().from((params.getPage() - 1) * params.getSize()).size(20); // 3.发送请求 SearchResponse search = client.search(request, RequestOptions.DEFAULT); // 4.解析响应 return handleResponse(search); } private PageDto<ItemDoc> handleResponse(SearchResponse search) { // 4.解析响应 SearchHits searchHits = search.getHits(); // 4.1.获取总条数 long total = searchHits.getTotalHits().value; // 4.2.文档数组 SearchHit[] hits = searchHits.getHits(); // 4.3.遍历 List<ItemDoc> items = new ArrayList<>(); for (SearchHit hit : hits) { // 获取文档source String json = hit.getSourceAsString(); // 反序列化 ItemDoc itemDoc = JSON.parseObject(json, ItemDoc.class); // 放入集合 items.add(itemDoc); } // 4.4.封装返回 return new PageDto(total, items); }
时间: 2024-02-14 14:11:10 浏览: 30
这段代码是基于 Elasticsearch 的 Java 客户端 High Level REST Client 实现的搜索服务。其中,@Service 注解表示这是一个服务类,实现了 ISearchService 接口。@Autowired 注解用于自动注入 Elasticsearch 的客户端 RestHighLevelClient 对象,这个对象可以用于执行 Elasticsearch 的搜索请求。
在 search() 方法中,首先创建一个 SearchRequest 对象,指定查询的索引名称为 "item"。接着,通过 QueryBuilders 构建查询条件,根据参数中的 key 字段进行全文搜索或匹配搜索。然后,通过 request.source() 方法设置分页、排序等请求参数。最后,通过 client.search() 方法发送请求,获取 SearchResponse 响应对象,并调用 handleResponse() 方法对响应进行解析,获取搜索结果。
handleResponse() 方法中,通过 SearchHits 对象获取搜索结果的总条数和文档数组,遍历文档数组,将每个文档反序列化为 ItemDoc 对象,并将 ItemDoc 对象添加到集合中。最后,将总条数和 ItemDoc 集合封装成 PageDto 对象返回。
相关问题
java @Service
@Service注解用于标记一个类是一个service类,并将其自动注入到Spring容器中。加上该注解后,不需要再在applicationContext.xml文件中定义bean。\[1\]
在使用@Service注解时,可以指定一个别名,方便在其他类中注入该service类。如果不指定别名,别名默认为当前类名的首字母小写。\[3\]
例如,在下面的代码中,@Service注解标记了一个名为UserServiceImpl的类,并将其注入到Spring容器中。在调用该service类时,只需要将该类注入到接口中即可。\[1\]
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
public User login(String username, String pwd){
return userMapper.selectByNameAndPwd(username,pwd);
}
}
```
另外,@Service注解还可以与其他注解一起使用,例如@Component、@Repository、@Controller。这些注解在自动扫描指定路径下的包时,会自动注册到Spring容器中,无需在applicationContext.xml中定义bean。\[2\]
#### 引用[.reference_title]
- *1* [@Service注解有什么用?@Service注解的用法?](https://blog.csdn.net/m0_69699237/article/details/125445989)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [@Service注解怎么使用?@Service注解的用法](https://blog.csdn.net/wang121213145/article/details/121651719)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
- *3* [spring注解@Service注解的使用详解](https://blog.csdn.net/weixin_29467909/article/details/114168511)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
有如下需求:根据输入关键字检索博客信息;请根据下面已有代码,补全业务逻辑。 PostDocment实体类: @Data @Document(indexName="post", type="post", createIndex=true) public class PostDocment implements Serializable { @Id private Long id; // ik分词器 @Field(type = FieldType.Text, searchAnalyzer="ik_smart", analyzer = "ik_max_word") private String title; @Field(type = FieldType.Long) private Long authorId; @Field(type = FieldType.Keyword) private String authorName; private String authorAvatar; private Long categoryId; @Field(type = FieldType.Keyword) private String categoryName; private Integer level; private Boolean recomment; private Integer commentCount; private Integer viewCount; @Field(type = FieldType.Date) private Date created; } PostRepository: @Repository public interface PostRepository extends ElasticsearchRepository<PostDocment, Long> { } SearchService接口(Page类型是org.springframework.data.domain): public interface SearchService { Page search(Long current, Long size, String keyword); } SearchServiceImpl实现类: @Slf4j @Service public class SearchServiceImpl implements SearchService { @Autowired PostRepository postRepository; /** * 实现根据关键词检索,关键词可能匹配title,也可能匹配authorName或者categoryName * @param current 查询的当前页 * @param size 每页展示size * @param keyword 查询关键词 * @return */ public org.springframework.data.domain.Page search(Long current, Long size, String keyword ) { } 控制层此处省略...... 注意:es中可能设计的操作QueryBuilders.multiMatchQuery(Object text, String... fieldNames); QueryBuilders.MatchQuery(Object text, String fieldNames); QueryBuilders.boolQuery().......
根据输入关键字检索博客信息的具体实现可以参考以下代码:
```
@Slf4j
@Service
public class SearchServiceImpl implements SearchService {
@Autowired
PostRepository postRepository;
/**
* 实现根据关键词检索,关键词可能匹配title,也可能匹配authorName或者categoryName
* @param current 查询的当前页
* @param size 每页展示size
* @param keyword 查询关键词
* @return
*/
public Page<PostDocment> search(Long current, Long size, String keyword ) {
// 查询条件
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("title", keyword))
.should(QueryBuilders.matchQuery("authorName", keyword))
.should(QueryBuilders.matchQuery("categoryName", keyword));
// 分页条件
Pageable pageable = PageRequest.of(current.intValue() - 1, size.intValue());
// 执行查询
return postRepository.search(queryBuilder, pageable);
}
}
```
具体实现步骤如下:
1. 定义查询条件:使用boolQuery构造多个should语句,表示title、authorName和categoryName中只要有一个匹配关键词,就可以返回。
2. 定义分页条件:使用PageRequest构造分页请求对象。
3. 执行查询:调用postRepository.search方法,传入查询条件和分页条件,返回查询结果。
总之,根据输入关键字检索博客信息是一个比较常见的需求,实现起来也比较简单。需要注意的是,查询条件和分页条件需要根据具体业务进行调整,以达到最优的查询效果和用户体验。