import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.work.util.PageUtil;
//包部分有部分是其他方法中使用到的
@Controller
@RequestMapping(value = "base/BaseLog")
public class BaseLogController {
@Autowired
private RestHighLevelClient rhlClient;
@Autowired
private RedisUtil redisUtil;
@RequestMapping(value = "list", method = RequestMethod.POST)
public String list(HttpServletRequest request, Model model) {
int pageSize = 10;
int pageNo = 1;
if (request.getParameter("pageNo") != null && !request.getParameter("pageNo").equals("")) {
pageNo = Integer.valueOf(request.getParameter("pageNo"));
}
String searchValue = request.getParameter("searchValue");
if (searchValue == null) {
searchValue = "";
}
// TODO: 2018/2/26 具体demo在test->esDemo里
// 查询语句的核心,查询结果的排序,查询结果截取部分返回等一系列配置
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 结果开始处
sourceBuilder.from(pageSize*(pageNo-1));
// 查询结果终止处
sourceBuilder.size(pageSize);
// 排序
FieldSortBuilder fsb = SortBuilders.fieldSort("@timestamp");
fsb.order(SortOrder.DESC);
sourceBuilder.sort(fsb);
//查询满足名字定义为className的,内容包含BaseLog的记录
QueryBuilder queryBuilder=QueryBuilders.matchQuery("className", "BaseLog");
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//must代表and、should代表or、mustnot返回 没有字段或值为null或没有值的文档
boolQuery.mustNot(queryBuilder);
sourceBuilder.query(boolQuery);
SearchRequest searchRequest = new SearchRequest("my_project*");
searchRequest.types("doc");
searchRequest.source(sourceBuilder);
try {
SearchResponse response = rhlClient.search(searchRequest);
SearchHits searchHits=response.getHits();
SearchHit[] searchHitList=searchHits.getHits();
PageUtil pm = new PageUtil(searchHits.getTotalHits(), pageSize, pageSize);
pm.goToPage(pageNo);
request.setAttribute("pageHtml", pm.getPageCode());
request.setAttribute("pageNo", pageNo);
request.setAttribute("pageSize", pageSize);
request.setAttribute("searchValue", searchValue);
request.setAttribute("dataList", searchHitList);
} catch (IOException e) {
e.printStackTrace();
}
return "base/BaseLog/list";
}
/**
*
* @Description: TODO elasticSearch的基本查询使用方法
* @param
* @return
* @throws
* @author pb
* 2018/2/27 15:23
*/
@RequestMapping(value = "TestEsQuery", method = RequestMethod.POST)
public void TestEs(){
System.out.println("ok");
//精准查询(如果是数字)
QueryBuilder queryBuilder1 = QueryBuilders.termQuery("546","BaseModule");
//精准查询(如果是字母等,必须要有.keyword)
QueryBuilder queryBuilder2 = QueryBuilders.termQuery("className.keyword","BaseModule");
//模糊查询----->分别为单个和多个查询
QueryBuilder queryBuilder3 = QueryBuilders.matchQuery("className","BaseLog");
QueryBuilder queryBuilder4 = QueryBuilders.moreLikeThisQuery(new String[]{"className"}, new String[]{"BaseLog"}, null);
//多条件查询 must代表and、should代表or、mustnot返回 没有字段或值为null或没有值的文档(只是举个例子如何使用,没考虑逻辑)
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(queryBuilder1)
.should(queryBuilder2)
.mustNot(queryBuilder3);
// 查询语句的核心,查询结果的排序,查询结果截取部分返回等一系列配置
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 结果开始处
sourceBuilder.from(1);
// 查询结果终止处
sourceBuilder.size(20);
// 排序
FieldSortBuilder fsb = SortBuilders.fieldSort("@timestamp");
fsb.order(SortOrder.DESC);
sourceBuilder.sort(fsb);
sourceBuilder.query(queryBuilder);
SearchRequest searchRequest = new SearchRequest("my_project*");
searchRequest.types("doc");
searchRequest.source(sourceBuilder);
try {
SearchResponse response = rhlClient.search(searchRequest);
SearchHits searchHits=response.getHits();
SearchHit[] searchHitList=searchHits.getHits();
//查询的数据查看只有在循环获取的getSourceAsMap后才能在debug中看到(不知道为什么),因此获取看下结构
for (SearchHit fields : searchHitList) {
Map<String,Object> map = fields.getSourceAsMap();
////获取id
System.out.println(fields.getId());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
其他参考资料:
Elasticsearch java api 常用查询方法QueryBuilder构造举例
http://blog.youkuaiyun.com/u012546526/article/details/74184769