当前位置: 首页 > news >正文

营销网站建设的步骤wordpress建站视频

营销网站建设的步骤,wordpress建站视频,个人网页设计方案,萝卜建站app转载自 芋道 Spring Boot Elasticsearch 入门 1. 概述 如果胖友之前有用过 Elasticsearch 的话#xff0c;可能有过被使用的 Elasticsearch 客户端版本搞死搞活。如果有#xff0c;那么一起握个抓。所以#xff0c;我们在文章的开始#xff0c;先一起理一理这块。 Elas…转载自  芋道 Spring Boot Elasticsearch 入门 1. 概述 如果胖友之前有用过 Elasticsearch 的话可能有过被使用的 Elasticsearch 客户端版本搞死搞活。如果有那么一起握个抓。所以我们在文章的开始先一起理一理这块。 ElasticsearchES提供了两种连接方式 transport 通过 TCP 方式访问 ES 。 对应的库是 org.elasticsearch.client.transport 。 rest 通过 HTTP API 方式访问 ES 。 对应的库是 elasticsearch-rest-client  org.elasticsearch.client.rest提供 low-level rest API 。 elasticsearch-rest-high-level-client 提供 high-level rest API 。从 Elasticsearch 6.0.0-beta1 开始提供。 如果想进一步了解上述的 3 个 ES 客户端可以看看 《Elasticsearch 客户端 transport vs rest》 文章。 虽然说ES 提供了 2 种方式官方目前建议使用 rest 方式而不是 transport 方式。并且transport 在未来的计划中准备废弃。并且阿里云提供的 Elasticsearch 更加干脆直接只提供 rest 方式而不提供 transport 方式。 在社区中有个 Jest 开源项目也提供了的 Elasticsearch REST API 客户端。 参考 《ES Java Client 的历史》 Elasticsearch 5.0 才有了自己的 Rest 客户端 6.0 才有了更好用的客户端所以 Jest 作为第三方客户端使用非常广泛。 正如我们在项目中编写数据库操作的逻辑使用 MyBatis 或者 JPA 为主而不使用原生的 JDBC 。那么我们在编写 Elasticsearch 操作的逻辑也不直接使用上述的客户端而是 spring-data-elasticsearch 基于 Elasticsearch transport 客户端封装。 spring-data-jest 基于 Jest 客户端封装。 虽然这两者底层使用的不同客户端但是都基于 Spring Data 体系所以项目在使用时编写的代码是相同的。也因此如果胖友想从 spring-data-elasticsearch 迁移到 spring-data-jest 时基本透明无成本美滋滋~ 这样一个梳理胖友是不是对 Elasticsearch 客户端的选用心里已经明明白白落。嘿嘿。 下面艿艿先来讲一个悲伤的故事。大体过程是这样的 1、在上线的时候发现线上使用的是阿里云的 Elasticsearch 服务不提供 transport 连接方式而项目中使用的是 spring-data-elasticsearch 。所以先临时在 ECS 搭建一个 Elasticsearch 服务过度下。 2、然后了解到有 Jest 客户端可以使用 rest 连接方式于是将操作 Elasticsearch 的代码全部改成 Jest 的方式。 3、之后发现竟然还有 spring-data-jest 一脸悲伤重新将操作 Elasticsearch 的代码全部改成 spring-data-jest 的方式。 泪崩。所以胖友可知艿艿目前线上使用 spring-data-jest 访问 Elasticsearch 。 下面我们分别来入门 Spring Data Jest Spring Data Elasticsearch 艿艿如果胖友还没安装 Elasticsearch 并安装 IK 插件可以参考下 《Elasticsearch 安装部署》 文章先进行下安装。 2. Spring Data Jest 示例代码对应仓库lab-15-spring-data-jest 。 ES 版本号6.5.0 spring-boot-starter-data-jest 3.2.5.RELEASE 本小节我们会使用 spring-boot-starter-data-jest 自动化配置 Spring Data Jest 主要配置。同时编写相应的 Elasticsearch 的 CRUD 操作。 2.1 引入依赖 在 pom.xml 文件中引入相关依赖。 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.1.3.RELEASE/versionrelativePath/ !-- lookup parent from repository --/parentmodelVersion4.0.0/modelVersionartifactIdlab-15-spring-data-jest/artifactIddependencies!-- 自动化配置 Spring Data Jest --dependencygroupIdcom.github.vanroy/groupIdartifactIdspring-boot-starter-data-jest/artifactIdversion3.2.5.RELEASE/version/dependency!-- 方便等会写单元测试 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies/project具体每个依赖的作用胖友自己认真看下艿艿添加的所有注释噢。 2.2 Application 创建 Application.java 类配置 SpringBootApplication 注解即可。代码如下 // Application.javaSpringBootApplication(exclude {ElasticsearchAutoConfiguration.class, ElasticsearchDataAutoConfiguration.class}) public class Application { }需要排除 ElasticsearchAutoConfiguration 和 ElasticsearchDataAutoConfiguration 自动配置类否则会自动配置 Spring Data Elasticsearch 。 2.3 配置文件 在 application.yml 中添加 Jest 配置如下 spring:data:# Jest 配置项jest:uri: http://127.0.0.1:9200我们使用本地的 ES 服务。默认情况下ES rest 连接方式暴露的端口是 9200 。 2.4 ESProductDO 在 cn.iocoder.springboot.lab15.springdatajest.dataobject 包路径下创建 ESProductDO 类。代码如下 // ESProductDO.javaDocument(indexName product, // 索引名type product, // 类型。未来的版本即将废弃shards 1, // 默认索引分区数replicas 0, // 每个分区的备份数refreshInterval -1 // 刷新间隔 ) public class ESProductDO {/*** ID 主键*/Idprivate Integer id;/*** SPU 名字*/Field(analyzer FieldAnalyzer.IK_MAX_WORD, type FieldType.Text)private String name;/*** 卖点*/Field(analyzer FieldAnalyzer.IK_MAX_WORD, type FieldType.Text)private String sellPoint;/*** 描述*/Field(analyzer FieldAnalyzer.IK_MAX_WORD, type FieldType.Text)private String description;/*** 分类编号*/private Integer cid;/*** 分类名*/Field(analyzer FieldAnalyzer.IK_MAX_WORD, type FieldType.Text)private String categoryName;// 省略 setting/getting 方法 }为了区别关系数据库的实体对象艿艿习惯以 ES 前缀开头。 字段上的 Field 注解的 FieldAnalyzer 是定义的枚举类记得自己创建下噢。代码如下 // FieldAnalyzer.javapublic class FieldAnalyzer {/*** IK 最大化分词** 会将文本做最细粒度的拆分*/public static final String IK_MAX_WORD ik_max_word;/*** IK 智能分词** 会做最粗粒度的拆分*/public static final String IK_SMART ik_smart;}再友情提示下一定要记得给 Elasticsearch 安装 IK 插件不然等会示例会报错的哟。 2.5 ProductRepository 在 cn.iocoder.springboot.lab15.mybatis.repository 包路径下创建 ProductRepository 接口。代码如下 // ProductRepository.javapublic interface ProductRepository extends ElasticsearchRepositoryESProductDO, Integer {}继承 org.springframework.data.elasticsearch.repository.ProductRepository 接口第一个泛型设置对应的实体是 ESProductDO 第二个泛型设置对应的主键类型是 Integer 。 因为实现了 ElasticsearchRepository 接口Spring Data Jest 会自动生成对应的 CRUD 等等的代码。 是不是很方便。 ElasticsearchRepository 类图如下 每个接口定义的方法胖友可以点击下面每个链接自己瞅瞅简单~ org.springframework.data.repository.CrudRepository org.springframework.data.repository.PagingAndSortingRepository org.springframework.data.elasticsearch.repository.ElasticsearchCrudRepository org.springframework.data.elasticsearch.repository.ElasticsearchRepository 艿艿如果胖友看过艿艿写的 《芋道 Spring Boot JPA 入门》 文章会发现和 Spring Data JPA 的使用方式基本一致。这就是 Spring Data 带给我们的好处使用相同的 API 统一访问不同的数据源。o(▽) 点赞。 2.6 简单测试 创建 ProductRepositoryTest 测试类我们来测试一下简单的 ProductRepositoryTest 的每个操作。代码如下 // ProductRepositoryTest.JAVARunWith(SpringRunner.class) SpringBootTest(classes Application.class) public class ProductRepositoryTest {Autowiredprivate ProductRepository productRepository;Test // 插入一条记录public void testInsert() {ESProductDO product new ESProductDO();product.setId(1); // 一般 ES 的 ID 编号使用 DB 数据对应的编号。这里先写死product.setName(芋道源码);product.setSellPoint(愿半生编码如一生老友);product.setDescription(我只是一个描述);product.setCid(1);product.setCategoryName(技术);productRepository.save(product);}// 这里要注意如果使用 save 方法来更新的话必须是全量字段否则其它字段会被覆盖。// 所以这里仅仅是作为一个示例。Test // 更新一条记录public void testUpdate() {ESProductDO product new ESProductDO();product.setId(1);product.setCid(2);product.setCategoryName(技术-Java);productRepository.save(product);}Test // 根据 ID 编号删除一条记录public void testDelete() {productRepository.deleteById(1);}Test // 根据 ID 编号查询一条记录public void testSelectById() {OptionalESProductDO userDO productRepository.findById(1);System.out.println(userDO.isPresent());}Test // 根据 ID 编号数组查询多条记录public void testSelectByIds() {IterableESProductDO users productRepository.findAllById(Arrays.asList(1, 4));users.forEach(System.out::println);}}每个测试单元方法胖友自己看看方法上的注释。 具体的胖友可以自己跑跑妥妥的。 3. Spring Data Elasticsearch 示例代码对应仓库lab-15-spring-data-elasticsearch 。 ES 版本号6.5.0 spring-boot-starter-data-elasticsearch 2.1.3.RELEASE 本小节我们会使用 spring-boot-starter-data-elasticsearch 自动化配置 Spring Data Elasticsearch 主要配置。同时编写相应的 Elasticsearch 的 CRUD 操作。 重点是我们希望通过本小节让胖友感受到Spring Data Jest 和 Spring Data Elasticsearch 是基本一致的。 3.1 引入依赖 在 pom.xml 文件中引入相关依赖。 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.1.3.RELEASE/versionrelativePath/ !-- lookup parent from repository --/parentmodelVersion4.0.0/modelVersionartifactIdlab-15-spring-data-elasticsearch/artifactIddependencies!-- 自动化配置 Spring Data Elasticsearch --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-elasticsearch/artifactId/dependency!-- 方便等会写单元测试 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies/project差异点就是将依赖 spring-boot-starter-data-jest 替换成 spring-boot-starter-data-elasticsearch 。 具体每个依赖的作用胖友自己认真看下艿艿添加的所有注释噢。 3.2 Application 创建 Application.java 类配置 SpringBootApplication 注解即可。代码如下 // Application.javaSpringBootApplication public class Application { }差异点在于无需排除 ElasticsearchAutoConfiguration 和 ElasticsearchDataAutoConfiguration 自动配置类因为需要它们自动化配置 Spring Data Elasticsearch 。 3.3 配置文件 在 application.yml 中添加 Jest 配置如下 spring:data:# Elasticsearch 配置项elasticsearch:cluster-name: elasticsearch # 集群名cluster-nodes: 127.0.0.1:9300 # 集群节点差异点将配置项 jest 替换成 elasticsearch 。 我们使用本地的 ES 服务。默认情况下ES transport 连接方式暴露的端口是 9300 。 3.4 ESProductDO 和 「2.4 ESProductDO」 一致。 3.5 ProductRepository 和 「3.5 ProductRepository」 一致。 3.6 简单测试 和 「3.6 简单测试」 一致。 有没感受到Spring Data Jest 和 Spring Data Elasticsearch 是基本一致的。 4. 基于方法名查询 示例代码对应仓库lab-15-spring-data-jest 。 ES 版本号6.5.0 spring-boot-starter-data-jest 3.2.5.RELEASE 在 《芋道 Spring Boot JPA 入门》 文章的「4. 基于方法名查询」小节中我们已经提到 在 Spring Data 中支持根据方法名作生成对应的查询WHERE条件进一步进化我们使用 JPA 具体是方法名以 findBy、existsBy、countBy、deleteBy 开头后面跟具体的条件。具体的规则在 《Spring Data JPA —— Query Creation》 文档中已经详细提供。如下 关键字方法示例JPQL snippetAndfindByLastnameAndFirstname… where x.lastname ?1 and x.firstname ?2OrfindByLastnameOrFirstname… where x.lastname ?1 or x.firstname ?2Is, EqualsfindByFirstname,findByFirstnameIs,findByFirstnameEquals… where x.firstname ?1BetweenfindByStartDateBetween… where x.startDate between ?1 and ?2LessThanfindByAgeLessThan… where x.age ?1LessThanEqualfindByAgeLessThanEqual… where x.age ?1GreaterThanfindByAgeGreaterThan… where x.age ?1GreaterThanEqualfindByAgeGreaterThanEqual… where x.age ?1AfterfindByStartDateAfter… where x.startDate ?1BeforefindByStartDateBefore… where x.startDate ?1IsNull, NullfindByAge(Is)Null… where x.age is nullIsNotNull, NotNullfindByAge(Is)NotNull… where x.age not nullLikefindByFirstnameLike… where x.firstname like ?1NotLikefindByFirstnameNotLike… where x.firstname not like ?1StartingWithfindByFirstnameStartingWith… where x.firstname like ?1 (parameter bound with appended %)EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (parameter bound with prepended %)ContainingfindByFirstnameContaining… where x.firstname like ?1 (parameter bound wrapped in %)OrderByfindByAgeOrderByLastnameDesc… where x.age ?1 order by x.lastname descNotfindByLastnameNot… where x.lastname ?1InfindByAgeIn(Collection ages)… where x.age in ?1NotInfindByAgeNotIn(Collection ages)… where x.age not in ?1TruefindByActiveTrue()… where x.active trueFalsefindByActiveFalse()… where x.active falseIgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) UPPER(?1)注意如果我们有排序需求可以使用 OrderBy 关键字。 下面我们来编写一个简单的示例。 艿艿IDEA 牛逼提供的插件已经能够自动提示上述关键字。太强了~ 因为 Spring Data Elasticsearch 和 Spring Data Jest 也是 Spring Data 体系中的一员所以也能享受到基于方法名查询的福利。所以我们在本小节中我们也来尝试下。 我们会在 「2. Spring Data Jest」 的示例代码对应仓库 lab-15-spring-data-jest 的基础上进行本小节的示例。 4.1 ProductRepository02 在 cn.iocoder.springboot.lab15.springdatajest.repository 包路径下创建 UserRepository02 接口。代码如下 // ProductRepository02.javapublic interface ProductRepository02 extends ElasticsearchRepositoryESProductDO, Integer {ESProductDO findByName(String name);PageESProductDO findByNameLike(String name, Pageable pageable);}对于分页操作需要使用到 Pageable 参数需要作为方法的最后一个参数。 4.2 简单测试 创建 UserRepository02Test 测试类我们来测试一下简单的 UserRepository02Test 的每个操作。代码如下 // UserRepository02Test.javaRunWith(SpringRunner.class) SpringBootTest(classes Application.class) public class ProductRepository02Test {Autowiredprivate ProductRepository02 productRepository;Test // 根据名字获得一条记录public void testFindByName() {ESProductDO product productRepository.findByName(芋道源码);System.out.println(product);}Test // 使用 name 模糊查询分页返回结果public void testFindByNameLike() {// 根据情况是否要制造测试数据if (true) {testInsert();}// 创建排序条件Sort sort new Sort(Sort.Direction.DESC, id); // ID 倒序// 创建分页条件。Pageable pageable PageRequest.of(0, 10, sort);// 执行分页操作PageESProductDO page productRepository.findByNameLike(芋道, pageable);// 打印System.out.println(page.getTotalElements());System.out.println(page.getTotalPages());}/*** 为了给分页制造一点数据*/private void testInsert() {for (int i 1; i 100; i) {ESProductDO product new ESProductDO();product.setId(i); // 一般 ES 的 ID 编号使用 DB 数据对应的编号。这里先写死product.setName(芋道源码 i);product.setSellPoint(愿半生编码如一生老友);product.setDescription(我只是一个描述);product.setCid(1);product.setCategoryName(技术);productRepository.save(product);}}}每个测试单元方法胖友自己看看方法上的注释。 具体的胖友可以自己跑跑妥妥的。 5. 复杂查询 在一些业务场景下我们需要编写相对复杂的查询例如说类似京东 https://search.jd.com/Search?keyword华为手机 搜索功能需要支持关键字、分类、品牌等等并且可以按照综合、销量等等升降序排序那么我们就无法在上面看到的 Spring Data Repository 提供的简单的查询方法而需要使用到 ElasticsearchRepository 的 search 方法代码如下 // ElasticsearchRepository.java // 省略非 search 方法PageT search(QueryBuilder query, Pageable pageable);PageT search(SearchQuery searchQuery);PageT searchSimilar(T entity, String[] fields, Pageable pageable);此时我们就需要使用 QueryBuilder 和 SearchQuery 构建相对复杂的搜索和排序条件。所以我们继续在 「2. Spring Data Jest」 的示例代码对应仓库 lab-15-spring-data-jest 的基础上进行本小节的示例实现一个简单的商品搜索功能。 5.1 ProductRepository03 在 cn.iocoder.springboot.lab15.springdatajest.repository 包路径下创建 ProductRepository03 接口。代码如下 // ProductRepository03.javapublic interface ProductRepository03 extends ElasticsearchRepositoryESProductDO, Integer {default PageESProductDO search(Integer cid, String keyword, Pageable pageable) {// 1 创建 NativeSearchQueryBuilder 对象NativeSearchQueryBuilder nativeSearchQueryBuilder new NativeSearchQueryBuilder();// 2.1 筛选条件 cidif (cid ! null) {nativeSearchQueryBuilder.withFilter(QueryBuilders.termQuery(cid, cid));}// 2.2 筛选if (StringUtils.hasText(keyword)) {FunctionScoreQueryBuilder.FilterFunctionBuilder[] functions { // TODO 芋艿分值随便打的new FunctionScoreQueryBuilder.FilterFunctionBuilder(matchQuery(name, keyword),ScoreFunctionBuilders.weightFactorFunction(10)),new FunctionScoreQueryBuilder.FilterFunctionBuilder(matchQuery(sellPoint, keyword),ScoreFunctionBuilders.weightFactorFunction(2)),new FunctionScoreQueryBuilder.FilterFunctionBuilder(matchQuery(categoryName, keyword),ScoreFunctionBuilders.weightFactorFunction(3)), // new FunctionScoreQueryBuilder.FilterFunctionBuilder(matchQuery(description, keyword), // ScoreFunctionBuilders.weightFactorFunction(2)), // TODO 芋艿目前这么做如果商品描述很长在按照价格降序会命中超级多的关键字。};FunctionScoreQueryBuilder functionScoreQueryBuilder QueryBuilders.functionScoreQuery(functions).scoreMode(FunctionScoreQuery.ScoreMode.SUM) // 求和.setMinScore(2F); // TODO 芋艿需要考虑下 scorenativeSearchQueryBuilder.withQuery(functionScoreQueryBuilder);}// 排序if (StringUtils.hasText(keyword)) { // 3.1 关键字使用打分nativeSearchQueryBuilder.withSort(SortBuilders.scoreSort().order(SortOrder.DESC));} else if (pageable.getSort().isSorted()) { // 3.2 有排序则进行拼接pageable.getSort().get().forEach(sortField - nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(sortField.getProperty()).order(sortField.getDirection().isAscending() ? SortOrder.ASC : SortOrder.DESC)));} else { // 3.3 无排序则按照 ID 倒序nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(id).order(SortOrder.DESC));}// 4 分页nativeSearchQueryBuilder.withPageable(PageRequest.of(pageable.getPageNumber(), pageable.getPageSize())); // 避免// 5 执行查询return search(nativeSearchQueryBuilder.build());}}使用 QueryBuilder 和 SearchQuery 构建相对复杂的搜索和排序条件我们可以放在 Service 层也可以放在 Repository 层。艿艿个人的偏好放在 Repository 层。 主要原因是尽量避免数据层的操作暴露在 Service 层。 缺点呢就像我们这里看到的有点业务逻辑就到了 Repository 层。 有舍有得看个人喜好。翻了一些开源项目放在 Service 或 Repository 层的都有。 简单来说下这个方法的整体逻辑根据商品分类编号 关键字检索相应的商品分页返回结果。 1 处创建 NativeSearchQueryBuilder 对象。 筛选条件 2.1 处如果有分类编号 cid 则进行筛选。 2.2 处如果有关键字 keyword 则按照 name 10 分、sellPoint 2 分、categoryName 3 分计算求和筛选至少满足 2 分。 排序条件 3.1 处如果有关键字则按照打分结果降序。 3.2 处如果有排序条件则按照该排序即可。 3.3 处如果无排序条件则按照 ID 编号降序。 分页条件 4 处创建新的 PageRequest 对象避免 pageable 里原有的排序条件。 执行搜索 5 处调用 #search(SearchQuery searchQuery) 方法执行 Elasticsearch 搜索。 5.2 ProductRepository03Test 创建 ProductRepository03Test 测试类我们来测试一下简单的 UserRepository03Test 的每个操作。代码如下 // ProductRepository03Test.javaRunWith(SpringRunner.class) SpringBootTest(classes Application.class) public class ProductRepository03Test {Autowiredprivate ProductRepository03 productRepository;Testpublic void testSearch() {// 查找分类为 1 指定关键字并且按照 id 升序PageESProductDO page productRepository.search(1, 技术,PageRequest.of(0, 5, Sort.Direction.ASC, id));System.out.println(page.getTotalPages());// 查找分类为 1 并且按照 id 升序page productRepository.search(1, null,PageRequest.of(0, 5, Sort.Direction.ASC, id));System.out.println(page.getTotalPages());}}每个测试单元方法胖友自己看看方法上的注释。 具体的胖友可以自己跑跑妥妥的。 6. ElasticsearchTemplate 在 Spring Data Elasticsearch 中有一个 ElasticsearchTemplate 类提供了 Elasticsearch 操作模板方便我们操作 Elasticsearch 。 要注意这是 Spring Data Elasticsearch 独有而 Spring Data Jest 没有的一个类。 咳咳咳当艿艿写完这篇博客后突然发现Spring Data Jest 有一个 JestElasticsearchTemplate 类和 ElasticsearchTemplate 是对等的。 也因此我们继续在 「3. Spring Data Elasticsearch」 的示例代码对应仓库 lab-15-spring-data-elasticsearch 的基础上进行本小节的示例实现一个商品搜索条件返回的功能。 6.1 ProductConditionBO 在 cn.iocoder.springboot.lab15.springdataelasticsearch.bo 包路径下创建 ProductConditionBO 类商品搜索条件 BO 代码如下 // ProductConditionBO.javapublic class ProductConditionBO {/*** 商品分类数组*/private ListCategory categories;public static class Category {/*** 分类编号*/private Integer id;/*** 分类名称*/private String name;// ... 省略 setting/getting 方法}// ... 省略 setting/getting 方法}6.2 简单示例 创建 ProductRepository04Test 测试类我们来测试一下简单的 ProductRepository04Test 的每个操作。代码如下 // ProductRepository04Test.javaRunWith(SpringRunner.class) SpringBootTest(classes Application.class) public class ProductRepository04Test {Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;Testpublic void test() {// 1 创建 ES 搜索条件NativeSearchQueryBuilder nativeSearchQueryBuilder new NativeSearchQueryBuilder().withIndices(product);;// 2 筛选nativeSearchQueryBuilder.withQuery(QueryBuilders.multiMatchQuery(芋道,name, sellPoint, categoryName));// 3 聚合nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms(cids).field(cid)); // 商品分类// 4 执行查询ProductConditionBO condition elasticsearchTemplate.query(nativeSearchQueryBuilder.build(), response - {ProductConditionBO result new ProductConditionBO();// categoryIds 聚合Aggregation categoryIdsAggregation response.getAggregations().get(cids);if (categoryIdsAggregation ! null) {result.setCategories(new ArrayList());for (LongTerms.Bucket bucket : (((LongTerms) categoryIdsAggregation).getBuckets())) {result.getCategories().add(new ProductConditionBO.Category().setId(bucket.getKeyAsNumber().intValue()));}}// 返回结果return result;});// 5 后续遍历 condition.categories 数组查询商品分类设置商品分类名。System.out.println();}}简单来说下这个方法的整体逻辑根据关键字检索 name、sellPoint、categoryName 字段聚合 cid 返回。 1 处创建 NativeSearchQueryBuilder 对象并设置查询的索引是 product 即 ESProductDO 类的对应的索引。 筛选条件 2 处根据关键字检索 name、sellPoint、categoryName 字段。此处我们使用的关键字是 芋道 。 聚合 3 处将商品分类编号 cid 聚合成 cids 返回。 如果 ESProductDO 上有品牌编号我们可以多在聚合一个品牌编号返回。 执行搜索 4 处执行查询解析聚合结果设置回 ProductConditionBO 中。 5 处后续遍历 condition.categories 数组查询商品分类设置商品分类名。 6.3 小结 可能胖友会有疑惑Spring Data Jest 没有 ElasticsearchTemplate 类岂不是不能实现当前示例么答案是否定的我们回过头看 「5. 复杂查询」 。对于 Spring Data Jest 来说可以通过 ElasticsearchRepository 提供的 search 方法实现聚合操作的功能。当然Spring Data Elasticsearch 也可以。 所以呢绝大多数情况下我们并不会直接使用 ElasticsearchTemplate 类。 666. 彩蛋 通过写这篇文章艿艿自己也查了一些资料终于把 Elasticsearch 客户端的情况理顺了。 当然也推荐几篇艿艿觉得不错的 Elasticsearch 文章 《图解 Elasticsearch 原理》 《全文搜索引擎选 ElasticSearch 还是 Solr》 《别再说你不会 ElasticSearch 调优了都给你整理好了》 《Elasticsearch 如何做到亿级数据查询毫秒级返回》 《日均 5 亿查询量的京东订单中心为什么舍 MySQL 用 ES ?》 另外在推荐一个 Chrome ElasticSearch Head 插件可用于监控 Elasticsearch 状态的客户端提供数据可视化、执行增删改查操作等等功能。
http://www.sadfv.cn/news/83207/

相关文章:

  • 普通网站 seo 多少钱电影站的seo
  • html5网站开发公司李沧做网站
  • 做阿里渠道的销售要有哪些网站网站备案的接入商
  • asp.net手机网站开发烟台html5网站建设
  • 天津市哪里有做网站的青海城乡和住房建设厅网站
  • 南宁网站建设怎样建立一个好网站博创安泰网站建设
  • 站长工具seo综合查询怎么提高网站排名
  • 网站前台右侧怎么做二维码银川网站设计联系电话
  • 无法进入建设银行网站网站后台 全局配置
  • 成都seo网站建设引流推广公司
  • 深圳网站运营慈溪网页设计
  • h5企业网站源码知名企业网站大全
  • 河北建设部官方网站网站建设单选题
  • 门户网站建设依据五屏网站建设多少钱
  • 网站建设都需要什么资料电子商务网站建设与维护题库
  • 廊坊网站网站建设工程建设网站导航图
  • 做网站送的手机站是什么博客推广工具
  • 电商网站建设思路wordpress 4.9.4 漏洞
  • 网站去哪做网站交互图片怎么做
  • 做挂件的网站厚街镇做网站
  • 新手怎样自己做网站网站怎么添加统计代码
  • 土巴兔这种网站怎么做wordpress zzt
  • 上海网站排名优化公司线上网络平台推广
  • 正定网站建设百度收录提交接口
  • 网站专题活动策划方案纯flash网站价格
  • 中国网站建设新闻优秀网站架构
  • 网站建设培训公司哪家好手机制作网站开发
  • 厦门 做网站如何用word做网站地图
  • 鄂尔多斯住房和城乡建设局网站品牌营销和品牌推广的区别
  • 网站翻译建设网站建设 宣传