博客
关于我
21 Rest高级客户端实践(七):一个小案例
阅读量:248 次
发布时间:2019-03-01

本文共 9418 字,大约阅读时间需要 31 分钟。

文章目录

1 准备

  1. 之前的索引
PUT books{     "settings": {       "number_of_shards": 3,     "number_of_replicas": 1  },   "mappings": {         "properties": {           "id":{             "type": "long"        },        "title":{             "type": "text",          "analyzer": "ik_max_word"        },        "language":{             "type": "keyword"        },        "author":{             "type": "keyword"        },        "price":{             "type": "double"        },        "publish_time":{             "type": "date",          "format": "yyyy-MM-dd"        },        "description":{             "type": "text",          "analyzer": "ik_max_word"        }      }    }  }
  1. 数据如下

    在这里插入图片描述

  2. 构造这么一个查询,这里就不关心结果了,主要是如何使用java API构造这个一个请求

GET books/_search{     "query": {       "bool": {         "filter": [        {             "term": {               "author": "张若愚"          }        }      ],      "must": [        {             "fuzzy": {               "title": "python"          }        }      ],      "must_not": [        {             "prefix": {               "language": {                 "value": "j"            }          }        }      ],       "should": [        {            "range": {              "price": {                "gte": 0,             "lte": 100           }         }        }      ]    }  },  "highlight": {       "fields": {         "title": {   }    }  },  "_source":   {       "excludes": ["id","publish_time"]  },  "suggest": {       "my_suggest": {         "text": "python",      "term": {           "field": "description"      }    }  },  "sort": [    {         "price": {           "order": "desc"      }    }  ]}
  1. 上面请求的结果
{     "took" : 5,  "timed_out" : false,  "_shards" : {       "total" : 3,    "successful" : 3,    "skipped" : 0,    "failed" : 0  },  "hits" : {       "total" : {         "value" : 1,      "relation" : "eq"    },    "max_score" : null,    "hits" : [      {           "_index" : "books",        "_type" : "_doc",        "_id" : "3",        "_score" : null,        "_source" : {             "author" : "张若愚",          "price" : 81.4,          "description" : "零基础学python,光盘中作者独家整合开发winPython运行环境,涵盖了Python各个扩展库",          "language" : "python",          "title" : "Python科学计算"        },        "highlight" : {             "title" : [            "Python科学计算"          ]        },        "sort" : [          81.4        ]      }    ]  },  "suggest" : {       "my_suggest" : [      {           "text" : "python",        "offset" : 0,        "length" : 6,        "options" : [ ]      }    ]  }}

2 编码

package study.wyy.esclient.high;import com.fasterxml.jackson.databind.ObjectMapper;import org.apache.http.HttpHost;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestHighLevelClient;/** * @author wyaoyao * @description * @date 2021/1/8 15:30 */public abstract class BaseTest {       public static RestHighLevelClient client;    public static ObjectMapper objectMapper;    static {           client = new RestHighLevelClient(                RestClient.builder(new HttpHost("localhost", 9200, "http"))        );        objectMapper = new ObjectMapper();    }}
package study.wyy.esclient.high.search;import com.fasterxml.jackson.databind.ObjectMapper;import lombok.extern.slf4j.Slf4j;import org.elasticsearch.action.search.SearchRequest;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.client.RequestOptions;import org.elasticsearch.common.unit.TimeValue;import org.elasticsearch.index.query.BoolQueryBuilder;import org.elasticsearch.index.query.QueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.search.builder.SearchSourceBuilder;import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;import org.elasticsearch.search.sort.FieldSortBuilder;import org.elasticsearch.search.sort.SortBuilder;import org.elasticsearch.search.sort.SortOrder;import org.elasticsearch.search.suggest.SuggestBuilder;import org.elasticsearch.search.suggest.SuggestBuilders;import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;import org.junit.Test;import study.wyy.esclient.high.BaseTest;import java.io.IOException;/** * @author wyaoyao * @description * @date 2021/1/13 14:17 */@Slf4jpublic class SearchTest extends BaseTest {       @Test    public void test() throws IOException {           // 1 构建SearchRequest        SearchRequest request = buildSearchRequest();        // 2 执行请求        SearchResponse response = client.search(request, RequestOptions.DEFAULT);        log.info(new ObjectMapper().writer().writeValueAsString(response));    }    private SearchRequest buildSearchRequest() {           SearchRequest request = new SearchRequest();        // 设置要搜索的索引        request.indices("books");        // 添加搜索条件,大多数搜索参数都是通过SearchSourceBuilder构建        // 构建SearchSourceBuilder        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();        // 设置一些基本参数,超时时间,分页信息(from size)等        searchSourceBuilder.timeout(TimeValue.timeValueSeconds(10));        searchSourceBuilder.from(0);        searchSourceBuilder.size(10);        // 构建查询参数        QueryBuilder queryBuilder = buildQueryParam();        searchSourceBuilder.query(queryBuilder);        // 设置高亮        HighlightBuilder highlightBuilder = new HighlightBuilder();        // title字段高亮        HighlightBuilder.Field title = new HighlightBuilder.Field("title");        highlightBuilder.field(title);        searchSourceBuilder.highlighter(highlightBuilder);        // 设置Suggest        SuggestBuilder suggestBuilder = new SuggestBuilder();        TermSuggestionBuilder text = SuggestBuilders.termSuggestion("description").text("python");        suggestBuilder.addSuggestion("my_suggest",text);        searchSourceBuilder.suggest(suggestBuilder);        // source过滤        String[] excludes = {   "id","publish_time"};        searchSourceBuilder.fetchSource(null,excludes);        // 排序        FieldSortBuilder sortBuilder = new FieldSortBuilder("price").order(SortOrder.DESC);        searchSourceBuilder.sort(sortBuilder);        // 最后不要忘记将searchSourceBuilder添加到SearchRequest        request.source(searchSourceBuilder);        return request;    }    private QueryBuilder buildQueryParam() {           QueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()                // 过滤                .filter(QueryBuilders.termQuery("author", "张若愚"))                // 模糊查询                .must(QueryBuilders.fuzzyQuery("title", "python"))                // 前缀查询                .mustNot(QueryBuilders.prefixQuery("language", "j"))                // 范围查询                .should(QueryBuilders.rangeQuery("price").gte(0).lte(100));        return boolQueryBuilder;    }}

最后的输出

{       "internalResponse":{           "numReducePhases":1,        "fragment":true    },    "scrollId":null,    "totalShards":3,    "successfulShards":3,    "skippedShards":0,    "shardFailures":[    ],    "clusters":{           "total":0,        "successful":0,        "skipped":0,        "fragment":true    },    "profileResults":{       },    "numReducePhases":1,    "terminatedEarly":null,    "aggregations":null,    "timedOut":false,    "took":{           "hours":0,        "minutes":0,        "seconds":0,        "nanos":12000000,        "millis":12,        "stringRep":"12ms",        "micros":12000,        "minutesFrac":0.0002,        "hoursFrac":0.0000033333333333333333,        "days":0,        "microsFrac":12000,        "daysFrac":0.00000013888888888888888,        "millisFrac":12,        "secondsFrac":0.012    },    "suggest":{           "fragment":true    },    "failedShards":0,    "hits":{           "hits":[            {                   "score":"NaN",                "id":"3",                "type":"_doc",                "nestedIdentity":null,                "version":-1,                "seqNo":-2,                "primaryTerm":0,                "highlightFields":{                       "title":{                           "name":"title",                        "fragments":[                            {                                   "fragment":true                            }                        ],                        "fragment":true                    }                },                "sortValues":[                    81.4                ],                "matchedQueries":[                ],                "explanation":null,                "shard":null,                "index":"books",                "clusterAlias":null,                "sourceAsMap":{                       "author":"张若愚",                    "price":81.4,                    "description":"零基础学python,光盘中作者独家整合开发winPython运行环境,涵盖了Python各个扩展库",                    "language":"python",                    "title":"Python科学计算"                },                "innerHits":null,                "fields":{                   },                "sourceRef":{                       "fragment":true                },                "rawSortValues":[                ],                "sourceAsString":"{"author":"张若愚","price":81.4,"description":"零基础学python,光盘中作者独家整合开发winPython运行环境,涵盖了Python各个扩展库","language":"python","title":"Python科学计算"}",                "fragment":false            }        ],        "totalHits":{               "value":1,            "relation":"EQUAL_TO"        },        "maxScore":"NaN",        "sortFields":null,        "collapseField":null,        "collapseValues":null,        "fragment":true    },    "fragment":false}

转载地址:http://yirv.baihongyu.com/

你可能感兴趣的文章
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>