Elasticsearch 的基本查询方法

本文介绍了一种基于Elasticsearch的高级查询方法,包括多条件查询、模糊查询及精确查询等,并展示了如何设置查询结果的排序及分页,适用于希望深入了解Elasticsearch搜索功能的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值