ES小总结
组合查询
FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(boolQuery,new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("isAD",true),ScoreFunctionBuilders.weightFactorFunction(200))});
总代码:
public PageResult search(RequestParams params) {try {SearchRequest request = new SearchRequest("hotel");//准备DSLString key = params.getKey();//query//构建BooleanQueryBoolQueryBuilder boolQuery = QueryBuilders.boolQuery();//关键字搜索--> mustif (key == null || "".equals(key)) {boolQuery.must(QueryBuilders.matchAllQuery());} else {boolQuery.must(QueryBuilders.matchQuery("all", key));}//城市条件if (params.getCity() != null && !params.getCity().equals("")) {boolQuery.filter(QueryBuilders.termQuery("city", params.getCity()));}//品牌条件if (params.getBrand() != null && !params.getBrand().equals("")) {}//星级条件if (params.getStarName() != null && !params.getStarName().equals("")) {}//价格if (params.getMinPrice() != null && params.getMaxPrice() != null) {//range过滤boolQuery.filter(QueryBuilders.rangeQuery("price").lte(params.getMaxPrice()).gte(params.getMinPrice()));}//分页int page = params.getPage();int size = params.getSize();request.source().from((page - 1) * size).size(size);//排序String location = params.getLocation();if (location != null && !location.equals("")) {request.source().sort(SortBuilders.geoDistanceSort("location", new GeoPoint(location)).unit(DistanceUnit.KILOMETERS).order(SortOrder.ASC));}//算分控制FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(boolQuery,new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("isAD",true),ScoreFunctionBuilders.weightFactorFunction(200))});request.source().query(functionScoreQuery);//发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);return handleResponse(response);} catch (IOException e) {throw new RuntimeException(e);}}private PageResult handleResponse(SearchResponse response) {//解析响应SearchHits searchHits = response.getHits();//获取总条数Long total = searchHits.getTotalHits().value;//获取文档数组SearchHit[] hits = searchHits.getHits();//遍历数组,取出数据List<HotelDoc> hotels = new ArrayList<>();for (SearchHit hit : hits) {//获取文档的sourceString json = hit.getSourceAsString();//反序列化HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);//获取sort值Object[] sortValues = hit.getSortValues();if (sortValues.length > 0) {Object sortValue = sortValues[0];hotelDoc.setDistance(sortValue);}hotels.add(hotelDoc);}//构造返回对象PageResult result = new PageResult(hotels, total);return result;}
步骤总结:
- 准备request
- 准备DSL
- 利用client来发送请求
- 解析client的返回值
准备request
request分为创建、查询、删除、更新等操作。
Document文档的操作
创建
void testAddDocument() throws IOException {Hotel hotel = hotelService.getById(61083L);HotelDoc hotelDoc=new HotelDoc(hotel);//创建request对象IndexRequest request=new IndexRequest("hotel").id(hotelDoc.getId().toString());//准备JSON文档request.source(JSON.toJSONString(hotelDoc),XContentType.JSON);//发送请求client.index(request,RequestOptions.DEFAULT);}
查询
void testGetDocumentById() throws IOException {GetRequest request=new GetRequest("hotel","61083");//获取响应GetResponse response=client.get(request,RequestOptions.DEFAULT);String json = response.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc);}
删除
void DeleteDocument() throws IOException {DeleteRequest request=new DeleteRequest("hotel","61083");client.delete(request,RequestOptions.DEFAULT);}
更新
void testUpdateDocument() throws IOException {UpdateRequest request=new UpdateRequest("hotel","61083");//准备发送请求request.doc("price","123");client.update(request,RequestOptions.DEFAULT);}
Index索引的操作
创建
void createHotelIndex() throws IOException {//创建Request对象CreateIndexRequest request = new CreateIndexRequest("hotel");//准备请求参数,DSL语句request.source(MAPPING_TEMPLATE, XContentType.JSON);//发送请求client.indices().create(request, RequestOptions.DEFAULT);}
删除
void DeleteHotelIndex() throws IOException {//创建对象DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("hotel");//发送请求client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);}
Bool复合查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();//创建boolQuery//根据must、should、filter等来填写查询条件boolQuery.must(QueryBuilders.matchQuery("all", key));boolQuery.filter(QueryBuilders.termQuboolQuery.filter(QueryBuilders.rangeQuery("price").lte(params.getMaxPrice()).gte(params.getMinPrice()));ery("city", params.getCity()));