赞
踩
- #查询所有数据
- GET /索引名/_search
- {
- "query": {
- "查询类型": {
- "查询条件":"条件值"
- }
- }
- }
-
match查询:全文检索查询的一种,会对用户内容分词,然后去倒排索引库检索,语法。
- #根据条件查询 match
-
- GET /索引名/_search
- {
- "query": {
- "查询类型": {
- "查询那个字段": "查询的具体值"
- }
- }
- }
- # 示例
- GET /hotel/_search
- {
- "query": {
- "match": {
- "all": "北京"
- }
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
multi_match:和match类似,但是它允许多个字段进行查询
- # 根据多个字段来搜 multi_match
- GET /索引名/_search
- {
- "query": {
- "查询类型": {
- "query": "需要查询字段的具体值",
- "fields": ["查询字段1","查询字段2"]
- }
- }
- }
-
- # 根据多个字段来搜 multi_match
- GET /hotel/_search
- {
- "query": {
- "multi_match": {
- "query": "北京",
- "fields": ["city","name"]
- }
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
解释:在hotel索引库中按照address和name两个字段搜索值包含北京的文档
精准查询一般是查找keyword,数值,日期,boolean等不可分割的字段。
term:根据词条精准查询
range:根据值的范围查询
term查询
- #精准查询-term
- GET /索引名/_search
- {
- "query": {
- "查询类型": {
- "查询字段": {
- "value": "查询的具体值"
- }
- }
- }
- }
-
- #精准查询-term
- GET /hotel/_search
- {
- "query": {
- "term": {
- "city": {
- "value": "上海"
- }
- }
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
解释:在hotel索引库中查找city的值等于上海的所有文档,(city值一定是上海)
range查询-范围查询
-
- #精准查询-范围查询range
- GET /索引名/_search
- {
- "query": {
- "查询类型": {
- "查询字段": {
- "gte": 最小值,
- "lte": 最大值
- }
- }
- }
- }
-
- GET /hotel/_search
- {
- "query": {
- "range": {
- "score": {
- "gte": 10,
- "lte": 45
- }
- }
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
解释:在hotel索引库中查询score的值大于等于10小于等于45的文档。
复合查询:复合查询可以将其他简单查询组合起来,实现更复杂的逻辑,例如:
funcation_score:算分函数查询,可以根据某些规则(打分算法)计算文档得分
1,funcation score Query
例如:
- #修改得分
- GET /hotel/_search
- {
- "query": {
- "function_score": {
- "query": {
- "match": {
- "all": "北京"
- }
- },
- "functions": [
- {
- "filter": {
- "term": {
- "brand": "如家"
- }
- },
- "weight": 10
- }
- ],
- "boost_mode": "multiply"
- }
- }
-
- }
-
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
解释:查询索引库为hotel索引库,查询字段为all,值为北京,过滤brand为如家的文档,得分方式为默认,乘10.
2,Boolean Query
布尔查询是一个或者多个子句的组合子查询的组合方式有
must:必须匹配每个子查询,类似“与
should:选择性匹配子查询,类似“或
must_not:必须不匹配,不参与算分,类似“非
filter:必须匹配,不参与算分
例如,查询名字包含如家,价格不高于400的酒店
- # 使用bool查询功能
- GET /hotel/_search
- {
- "query": {
- "bool": {
- "must": [
- {
- "match": {
- "name": "如家"
- }
- }
- ],
- "must_not": [
- {
- "range": {
- "range": {
- "gt": 400
- }
- }
- }
- ]
- }
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
建议在上一篇博客基础上进行
会在倒排索引库中做分词匹配,类似于模糊查询
因为最后的结果需要解析,于是为了后续代码的简洁,我们把解析的代码单独书写出来,这里用的是fastJson:
-
- /**
- *用来解析返回的数据,包含高亮处理(针对的是name字段)
- * @param searchResponse 发送请求之后的响应
- */
- void parseData( SearchResponse searchResponse){
- //解析拿到的数据
- //有用的数据都在这个对象里面
- SearchHits hits = searchResponse.getHits();
- //获取数据总数
- long total = hits.getTotalHits().value;
- System.out.println("数据总数:"+total);
- //这个数组里面存放的是每一条数据
- SearchHit[] searchHits = hits.getHits();
- for (SearchHit documentFields : searchHits) {
- String sourceJson = documentFields.getSourceAsString();
- HotelDoc hotelDoc = JSON.parseObject(sourceJson, HotelDoc.class);
- //进行高亮的结果解析
- Map<String, HighlightField> highlightFieldMap = documentFields.getHighlightFields();
- if(!CollectionUtils.isEmpty(highlightFieldMap)){
- HighlightField highlightField = highlightFieldMap.get("name");
- if(highlightField!=null){
- //获取高亮处理后的name
- String name = highlightField.fragments()[0].string();
- hotelDoc.setName(name);
- }
-
- }
- System.out.println(hotelDoc);
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- @Test
- void matchAllTest() throws IOException {
- //1,创建请求
- SearchRequest request=new SearchRequest("hotel");
- //2,准备请求参数
- request.source().query(QueryBuilders.matchAllQuery());
- //3,发送请求
- SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
- //4,解析拿到的数据
- parseData(searchResponse);
-
- }
-
-
- /**
- * match查询,可以指定字段及逆行查询,但是只能指定一个
- * @throws IOException
- */
- @Test
- void matchTest() throws IOException {
- //1,创建请求
- SearchRequest request=new SearchRequest("hotel");
- //2,准备请求参数,针对all字段,对所有all中包含北京的进查询
- request.source().query(QueryBuilders.matchQuery("all","北京"));
- //因为es默认返回十条数据,我们如果向返回多一点,可以设置返回的数量
- request.source().size(20);
- //3,发送请求
- SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
- //4,解析拿到的数据
- parseData(searchResponse);
- }
-
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
-
- /**
- * multiMatch查询,可以指定多个字段
- * @throws IOException
- */
- @Test
- void multiMatchTest() throws IOException {
- SearchRequest request =new SearchRequest("hotel");
- //指定查询字段的值是多少,并指定那个字段,可以有多个,我们这里指定name,和city
- request.source().query(QueryBuilders.multiMatchQuery("北京","name","city"));
- SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
- parseData(searchResponse);
- }
-
精准查询-字段基本上是keyword类型的不可以在分词
-
- /**
- * term查询-根据词条精准查询
- * @throws IOException
- */
- @Test
- void termTest() throws IOException {
- SearchRequest request =new SearchRequest("hotel");
- //指定查询字段的值是多少,并指定那个字段,这个查询的值是固定的完全匹配的
- request.source().query(QueryBuilders.termQuery("city","上海"));
- SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
- parseData(searchResponse);
- }
-
-
- /**
- * range查询-根据条件范围插寻
- * @throws IOException
- */
- @Test
- void rangTest() throws IOException {
- SearchRequest request =new SearchRequest("hotel");
- //指定词条进行范围插寻,查找评分从20到40 的酒店
- request.source().query(QueryBuilders.rangeQuery("score").gt(20).lt(40));
- SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
- parseData(searchResponse);
- }
-
- /**
- * 针对查询结果做排序和分页
- * @throws IOException
- */
- @Test
- void PageSortTest() throws IOException {
- int page=3;
- int size=5;
- SearchRequest request =new SearchRequest("hotel");
- //使用matchall查询所有酒店
- request.source().query(QueryBuilders.matchAllQuery());
- //对查询结果进行排序和分页,from:第几页。size;每页大小
- request.source().from((page-1)*size).size(size);
- //排序,针对价格字段降序,从高到低
- request.source().sort("price", SortOrder.DESC);
- SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
- parseData(searchResponse);
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- /**
- * 对查询结果高亮处理
- * @throws IOException
- */
- @Test
- void HignLightTest() throws IOException {
- SearchRequest request =new SearchRequest("hotel");
- //指定词条进行范围插寻,查找all字段中包含如家的酒店
- request.source().query(QueryBuilders.matchQuery("all","如家"));
- //查询后的name字段高亮处理,可以指定多个字段进行高亮
- request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
- SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
- parseData(searchResponse);
- }
至此,es基础查询完结,了解更多,可查看官方文档!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。