@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 13:11:10 浏览: 122
这段代码是基于 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 对象返回。
相关问题
package com.neutech.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.neutech.elasticsearch.ES; import com.neutech.entity.Post; import com.neutech.mapper.PostMapper; import com.neutech.service.PostService; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.search.SearchHit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; import java.util.List; @Service public class PostServiceImpl implements PostService { @Autowired private PostMapper postMapper; @Autowired private ES es; // @Override // public List<Post> selectAll() { // return postMapper.selectList(null); // } @Override public List<Post> selectPostList() throws IOException { List<Post> posts = postMapper.selectPostList(); es.createBulkDocument(posts); List<Post> query = es.query(); return query; } @Override public int addLikesByPostId(Integer postId) { QueryWrapper<Post> wrapper = new QueryWrapper<>(); wrapper.eq("post_id",postId); Post post = postMapper.selectOne(wrapper); post.setLikes(post.getLikes() + 1); return postMapper.updateById(post); } @Override public int addCollectionsByPostId(Integer postId) { QueryWrapper<Post> wrapper = new QueryWrapper<>(); wrapper.eq("post_id",postId); Post post = postMapper.selectOne(wrapper); post.setCollections(post.getCollections() + 1); return postMapper.updateById(post); } @Override public Post getPostByPostId(Integer postId) { return postMapper.getPostByPostId(postId); } @Override public Integer getCountOfCommentsByPostId(Integer postId) { return postMapper.getCountOfCommentsByPostId(postId); } @Override public List<Post> selectPostListByUserId(Integer userId) { return postMapper.selectPostListByUserId(userId); } @Override public int insertPost(Post post) { return postMapper.insert(post); } }这段代码只能向es批量插入200条文档,告诉我为什么,我应该如何批量插入更多数据
这段代码中批量插入200条文档的限制可能来自于 Elasticsearch 中的默认设置,它限制了单个请求中可以插入的最大文档数。可以通过修改 Elasticsearch 的配置文件来调整这个限制。另外,还可以将批量插入的文档分批进行插入,每批插入200条以内的文档,以达到插入更多数据的目的。需要注意的是,分批插入时需要保证每批文档的 ID 不会与已有的文档 ID 重复,否则会导致插入失败。
有如下需求:根据输入关键字检索博客信息;请根据下面已有代码,补全业务逻辑。 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方法,传入查询条件和分页条件,返回查询结果。
总之,根据输入关键字检索博客信息是一个比较常见的需求,实现起来也比较简单。需要注意的是,查询条件和分页条件需要根据具体业务进行调整,以达到最优的查询效果和用户体验。
阅读全文