对ElasticSearch的索引库的增删改查示例java代码
1. 查询
GET /app_info_article/_search
{
"query": {
"multi_match": {
"query": "你的搜索词", // 替换为 dto.getSearchWords() 的值
"fields": ["title", "content"]
}
},
"highlight": {
"pre_tags": ["<font style='color:red;font-size:inherit;'>"],
"post_tags": ["</font>"],
"fields": {
"title": {}
}
},
"from": 你的索引计算值, // 替换为 (dto.getPageNum() * dto.getPageSize())
"size": dto.getPageSize(), // 替换为 dto.getPageSize() 的值
"sort": [
{
"publishTime": {
"order": "desc"
}
}
]
}
对应的java代码
/***
* 搜索实现
* @param dto
* @return
*/
@Override
public ResponseResult search(UserSearchDto dto) throws IOException {
//1)创建SearchRequest
SearchRequest request = new SearchRequest("app_info_article");
//2)封装查询条件 如果搜索关键词不为空,则根据标题或者内容搜索
if(!ObjectUtils.isEmpty(dto.getSearchWords())){
//已经输入了关键词,用户如果已登陆,则异步保存该搜索 userId=0 有课 userId!=0 用户已登录
Integer userId = RequestContextUtil.get("id");
if(userId!=0){
saveHistory(dto.getSearchWords(),userId);
}
request.source().query(QueryBuilders.multiMatchQuery(dto.getSearchWords(),"title","content"));
}else{
//3)如果搜索关键词为空,则查询所有
request.source().query(QueryBuilders.matchAllQuery());
}
//4)高亮-标题高亮
request.source().highlighter(
new HighlightBuilder()
.field("title")
.preTags("<font style='color:red;font-size:inherit;'>")
.postTags("</font>")
);
//5)分页
int index = (dto.getPageNum())*dto.getPageSize();
request.source().from(index).size(dto.getPageSize());
//6)排序
request.source().sort("publishTime", SortOrder.DESC);
//7)结果集解析
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
for (SearchHit hit : response.getHits().getHits()) {
//7.1)获取每个source对象
Map<String, Object> map = hit.getSourceAsMap();
map.put("h_title",map.get("title"));
//8)高亮
if(hit.getHighlightFields()!=null && hit.getHighlightFields().get("title")!=null){
//8.1)标题高亮数据
HighlightField highlightField = hit.getHighlightFields().get("title");
String highlightTitle = StringUtils.join(highlightField.getFragments(), "..");
//8.2)存在高亮数据,则换掉默认的非高亮
map.put("h_title",highlightTitle);
}
list.add(map);
}
return ResponseResult.okResult(list);
}
结果集解析
2. 增
2.1 增加单个
/***
* 增加索引
* @param searchArticleVo
*/
public void addIndex(SearchArticleVo searchArticleVo) throws IOException {
//1)创建IndexRequest
IndexRequest request = new IndexRequest("app_info_article")
//2)封装DSL语句
//ID
.id(searchArticleVo.getId().toString())
.source(JSON.toJSONString(searchArticleVo), XContentType.JSON);
//3)使用RestHighLevelClient发送请求
restHighLevelClient.index(request, RequestOptions.DEFAULT);
}
2.2 增加多个
/**
* 注意:数据量的导入,如果数据量过大,需要分页导入
* 1)查询数据库数据
* 2)将数据写入到ES中即可
* 创建BulkRequest
* ================================
* ||A:创建XxxRequest
* ||B:向XxxRequest封装DSL语句数据
* || X C:使用RestHighLevelClient执行远程请求
* ================================
* 将XxxRequest添加到BulkRequest
* 使用RestHighLevelClient将BulkRequest添加到索引库
* @throws Exception
*/
@Test
public void init() throws Exception {
//1)查询数据库数据
List<SearchArticleVo> searchArticleVos = apArticleMapper.loadArticleList();
//2)创建BulkRequest - 刷新策略
BulkRequest bulkRequest = new BulkRequest()
//刷新策略-立即刷新
.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
for (SearchArticleVo searchArticleVo : searchArticleVos) {
//A:创建XxxRequest
IndexRequest indexRequest = new IndexRequest("app_info_article")
//B:向XxxRequest封装DSL语句数据
.id(searchArticleVo.getId().toString())
.source(JSON.toJSONString(searchArticleVo), XContentType.JSON);
//3)将XxxRequest添加到BulkRequest
bulkRequest.add(indexRequest);
}
//4)使用RestHighLevelClient将BulkRequest添加到索引库
restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
}
3. 删
3.1 删除单个
/**
* 、删除索引
* @param searchArticleVo
*/
public void deleteIndex(SearchArticleVo searchArticleVo) throws IOException {
//1)创建XxxRequest
DeleteRequest request = new DeleteRequest("app_info_article")
//2)封装DSL语句
.id(searchArticleVo.getId().toString());
//3)使用RestHighLevelClient发送请求
restHighLevelClient.delete(request,RequestOptions.DEFAULT);
}
3.2 删除多个
待更新…