全文搜索属于最常见的需求,开源的 Elasticsearch 是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它 Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的 接口。Elastic 是 Lucene 的封装,提供了 REST API 的 *** 作接口,开箱即用。 REST API:天然的跨平台。
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
官方中文:https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html
社区中文: https://es.xiaoleilu.com/index.html http://doc.codingdict.com/elasticsearch/0
2. 相关概念 2.1 Index(索引)动词,相当于 MySQL 中的 insert; 名词,相当于 MySQL 中的 Database
2.2 Type(类型)在 Index(索引)中,可以定义一个或多个类型。 类似于 MySQL 中的 Table;每一种类型的数据放在一起;
2.3 document(文档)保存在某个索引(Index)下,某种类型(Type)的一个数据(document),文档是 JSON 格 式的,document t 就像是 MySQL 中的某个 Table 里面的内容。
2.4 倒排索引机制倒排索引源于实际应用中需要根据属性的值来查找记录,lucene是基于倒排索引实现的。
简单来说就是根据属性值获取索引值。
3. 安装使用docker安装,同时需要安装ElasticSearch和Kibana两个镜像。
更多详情请参考官方文档。
ElasticSearch符合RestFul风格
4. 基本 *** 作参考相关文档
就像是使用RestFul的风格用url *** 纵数据库。
5. 结合JAVA使用 5.1 引入相关依赖5.2 编写配置类org.elasticsearch.client elasticsearch-rest-high-level-client7.4.2
//排除引入common工程的数据源依赖 //@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) @Configuration public class ElasticSearchConfig { @Bean public RestHighLevelClient restHighLevelClient() { RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("101.200.45.111", 9200, "http")));//需要填写es所在服务器的域名以及端口号 return client; } }5.3 创建索引(添加数据)
//存储数据到es(添加更新二合一) @Test public void addIndex() throws Exception{ //(创建索引的请求指定索引名称(users)) IndexRequest indexRequest = new IndexRequest("users"); //指定id indexRequest.id("1"); //这种方法也可以 直接写json字符串 // indexRequest.source("username","zhansan","age",18,"gender","男"); User user =new User(); user.setUsername("战三"); user.setGender("f"); user.setAge(123); //将对象解析为JSON字符串 String s = JSON.toJSONString(user); indexRequest.source(s,XContentType.JSON); //保存后拿到响应结果 IndexResponse index = restHighLevelClient.index(indexRequest,COMMON_OPTIONS); System.out.println(index); } @Data class User{ private String username; private String gender; private Integer age; }5.4 查询
@Test public void searchData() throws Exception { //1.创建索引请求 SearchRequest searchRequest = new SearchRequest(); //2.指定索引 searchRequest.indices("xxx"); //3.指定DSL 检索条件 //SearchSourceBuilder sourceBuilder(里面封装的查询条件) SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //3.1构建检索条件 // searchSourceBuilder.query(); // searchSourceBuilder.from(); // searchSourceBuilder.size(); // searchSourceBuilder.aggregation(); searchSourceBuilder.query(QueryBuilders.matchQuery("field", "xxx")); //创建聚合条件 //1.查看值分布聚合 TermsAggregationBuilder agg1 = AggregationBuilders.terms("Aggname").field("AggField").size(10); //将聚合条件加入到查询条件中 searchSourceBuilder.aggregation(agg1); searchRequest.source(searchSourceBuilder); //4.执行检索 拿到数据 SearchResponse searchResponse = restHighLevelClient.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS); //5.分析结果(Json串) //获取所有查到的数据 SearchHits hits = searchResponse.getHits(); SearchHit[] searchHits = hits.getHits(); for (SearchHit hit : searchHits) { String string = hit.getSourceAsString(); XXClass xxClass = JSON.parseObject(string,XXClass.class); System.out.println("xxClass"+xxClass); } // } //获取检索到的分析信息 Aggregations aggregations = searchResponse.getAggregations(); Terms aggName = aggregations.get("AggName"); for (Terms.Bucket bucket : aggName.getBuckets()) { String keyAsString = bucket.getKeyAsString(); System.out.println("年龄"+keyAsString+bucket.getDocCount()); } }6. 结合业务使用 6.1 创建微服务gulimall-search
相关的配置文件:
application.properties
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.application.name=gulimall-search server.port=120006.2 编写配置类
@Configuration public class GulimallElasticSearchConfig { //配置es请求OPTIONS public static final RequestOptions COMMON_OPTIONS; static { RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder(); COMMON_OPTIONS = builder.build(); } //配置es连接 @Bean RestHighLevelClient client() { RestClientBuilder builder = RestClient.builder(new HttpHost("192.168.190.131", 9200, "http")); return new RestHighLevelClient(builder); } }6.3 Controller层
@RequestMapping("/search") @RestController @Slf4j public class ElasticSaveController { @Autowired ProductSaveService productSaveService; // 上架商品 @PostMapping("/product") public R productStatusUp(@RequestBody List6.4 Service层skuEsModels) { boolean flag = false; try { flag = productSaveService.productStatusUp(skuEsModels); } catch (IOException e) { log.error("ElasticSaveController商品上架错误: {}", e); return R.error(BizCodeEnume.PRODUCT_UP_EXCEPTION.getCode(), BizCodeEnume.PRODUCT_UP_EXCEPTION.getMsg()); } if (flag) { return R.ok(); } else { return R.error(BizCodeEnume.PRODUCT_UP_EXCEPTION.getCode(), BizCodeEnume.PRODUCT_UP_EXCEPTION.getMsg()); } } }
注: 使用RestHighLevelClient进行 *** 作
@Slf4j @Service public class ProductSaveServiceImpl implements ProductSaveService { @Autowired RestHighLevelClient restHighLevelClient; @Override public boolean productStatusUp(ListskuEsModels) throws IOException { // 保存到es中 //1、给es中建立索引。product,建立好映射关系。 //2、给es中保存这些数据 //BulkRequest bulkRequest, RequestOptions options BulkRequest bulkRequest = new BulkRequest(); for (SkuEsModel model : skuEsModels) { // 构造保存请求 IndexRequest indexRequest = new IndexRequest(EsConstant.PRODUCT_INDEX); //指定数据id indexRequest.id(model.getSkuId().toString()); //将要保存的数据对象转换为JSON格式 String s = JSON.toJSONString(model); //插入数据 并指明数据类型为JSON indexRequest.source(s, XContentType.JSON); //将保存请求(indexRequest)添加到批量保存请求中 bulkRequest.add(indexRequest); } //创建批量执行对象 //使用restHighLevelClient客户端进行保存 拿到响应结果 //两个参数 第一个是批量保存的请求 第二个是请求OPTIONS BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, GulimallElasticSearchConfig.COMMON_OPTIONS); //分析保存结果 boolean b = bulk.hasFailures(); List collect = Arrays.stream(bulk.getItems()).map(item -> { return item.getId(); }).collect(Collectors.toList()); log.info("商品上架成功: {}", collect); //返回布尔类型的数据,如果是true就是有错误了,返回false就是没有错误 return b; } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)