赞
踩
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。搜索引擎框架中不止Elasticsearch 框架,例如Lucene,Solandra,Solr,Compass等很多,举例,Lucene是将数据存在本地,生成一个个文件等,在说说为什么使用 Elasticsearch 分布式搜索引擎,因为方便,有很多可视化工具,例如 Kibana , Elasticsearch - head 还有 ik分词,总体来说方便管理,官方:
下载地址:
不知道有没有遇到一些领导是这样的,在一天早上,领导看到自己在公司像逛gai,然后就给我安排任务,然后过后跟我说推个锅给我,前期我拒绝的,然后就一句已经禅道推给你了(欲哭无泪,因为没学过),说要做个搜索,不要用 SQL LIKE,叫我问带我的领导怎么弄,然后问带我们的大佬,大佬说太久没弄了,让我自己研究,然后一直躺坑的过来了,真的是一直躺坑,有点怀疑人生了,想放弃了,不过最后还是做好了。
坑点:
很多人可能会想,为什么还用这么老的版本,说实话我也不想,最开始看b站狂神的 Elasticsearch , 查数据的时候会导致有些数据查不到,而且版本不适用,因为我们的项目没有父工程,无法覆盖版本,公司是Spring Boot 2.2.1 版本,做了很多模块,自己一改,项目直接崩溃,只好找对应版本
前提是没有spring-boot-starter-data-redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.2.2</version>
</dependency>
spring:
data:
elasticsearch:
repositories:
enabled: true
cluster-nodes: 127.0.0.1:9300
/**
* @Author: Lanys
* @Description:
* @Date: Create in 23:24 2021/7/28
*/
@Repository
public interface UserRepository extends ElasticsearchRepository<User, Integer> {
}
/** * @Author: Lanys * @Description: * @Date: Create in 23:30 2021/7/28 */ @Data @NoArgsConstructor @AllArgsConstructor @Document(indexName = "my_user") public class User { /** * index:是否设置分词 * analyzer:存储时使用的分词器 * searchAnalyze:搜索时使用的分词器 * store:是否存储 * type: 数据类型 */ @Id @Field(store = true, index = false, type = FieldType.Integer) private Integer id; @Field(type = FieldType.Text, store = true, analyzer = "ik_smart") private String username; @Field(store = true, type = FieldType.Keyword, analyzer = "my_user", searchAnalyzer = "my_user") private String password; @Field(store = true, type = FieldType.Integer, analyzer = "my_user", searchAnalyzer = "my_user") private Integer age; }
// 插入数据
@Test
public void testInsert(){
userRepository.save(new User(3, "迪迦", "123", 18));
userRepository.save(new User(4, "盖亚", "321", 18));
userRepository.save(new User(6, "雷欧", "123", 18));
userRepository.save(new User(7, "戴罗", "321", 18));
userRepository.save(new User(8, "爱思", "yao3210", 18));
userRepository.save(new User(9, "杰克", "312", 18));
userRepository.save(new User(10, "高斯", "321", 18));
userRepository.save(new User(11, "赛文", "3134", 18));
userRepository.save(new User(12, "贝利亚", "32423", 18));
userRepository.save(new User(13, "艾伦", "321", 18));
userRepository.save(new User(137, "泰罗", "3213", 18));
}
@Test
public void s5(){
// 构建查询条件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加基本分词查询 ik分词
queryBuilder.withQuery(QueryBuilders.matchQuery("username", "大学西北林新明邓紫"));
// 搜索,获取结果
Page<User> items = userRepository.search(queryBuilder.build());
// 总条数
long total = items.getTotalElements();
System.out.println("total = " + total);
items.forEach(item -> System.out.println("item = " + item));
}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.2.2</version>
</dependency>
spring:
data:
elasticsearch:
repositories:
enabled: true
cluster-nodes: 127.0.0.1:9300
解决 spring-boot-starter-data-redis 依赖会报错
/** * @author lanys * @Description: * @date 27/7/2021 下午3:33 */ @Configuration //指定RedisConfig文件 @AutoConfigureBefore(RedisConfig.class) @EnableCaching public class ElasticsearchConfig { @PostConstruct void init() { System.setProperty("es.set.netty.runtime.available.processors", "false"); } @Bean(name = "elasticsearchTemplate") public ElasticsearchTemplate elasticsearchTemplate(Client client, ElasticsearchConverter converter) { try { return new ElasticsearchTemplate(client, converter); } catch (Exception ex) { throw new IllegalStateException(ex); } } @Bean public ElasticsearchConverter elasticsearchConverter( SimpleElasticsearchMappingContext mappingContext) { return new MappingElasticsearchConverter(mappingContext); } @Bean public SimpleElasticsearchMappingContext mappingContext() { return new SimpleElasticsearchMappingContext(); } }
/** * @author lanys * @Description: Elasticsearch 索引名称 * @date 28/7/2021 下午2:11 */ public class ElasticsearchIndexName { /** * 动态索引 */ public final static String DYNAMIC_SEARCH = "dynamic"; /** * 动态搜索字段 */ public final static String DYNAMIC_CONTENT = "content"; /** * 用户索引 */ public final static String USER_SEARCH = "user"; /** * 用户搜索字段 */ public final static String USER_CONTENT = "nickname"; }
/** * @author lanys * @Description: ES 用户表搜索 * @date 29/7/2021 下午4:12 */ @Data @AllArgsConstructor @NoArgsConstructor @Document(indexName = ElasticsearchIndexName.USER_SEARCH) public class UserSearchEsVo implements Serializable { /** *用户ID */ @Id private Long id; /** *昵称 */ @Field(store = true, type = FieldType.Keyword, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word") private String nickname; /** *头像URL */ private String avatar; /** *个性签名/内心独白 */ private String sign; /** *城市 */ private String city; /** *登录用户是否关注发布者 */ private Integer isFollow; }
/**
* @author lanys
* @Description:
* @date 30/7/2021 下午5:49
*/
@Component
public interface UserSearch extends ElasticsearchRepository<UserSearchEsVo,Long> {
}
/**
* ES 用户搜索
* @param userId
* @param message
* @param page
* @param num
* @return
*/
List<UserSearchEsVo> userSearch(Long userId, String message, Integer page, Integer num);
/**
* 添加用户数据到es中
* @return
*/
Boolean addUserSearchData();
@Slf4j @Service public class EsSearchServiceImpl implements IEsSearchService { @Autowired private UserSearch userSearch; /** * 用户搜索 * * @param userId * @param page * @param num * @return */ @Override public List<UserSearchEsVo> userSearch(Long userId, String message, Integer page, Integer num) { // Page<UserSearchEsVo> search = userSearch.search(publicSearchBasics(ElasticsearchIndexName.USER_SEARCH,message,page,num).build()); NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); //模糊查询 nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery(ElasticsearchIndexName.USER_CONTENT, message)); //查询 Page<UserSearchEsVo> search = userSearch.search(nativeSearchQueryBuilder.build()); List<UserSearchEsVo> UserSearchEsVoList = search.getContent(); return UserSearchEsVoList; } @Override public Boolean addUserSearchData() { //根据自己的数据自己添加 List<UserSearchEsVo> user2Es = userMapper.getUser2Es(); try{ userSearch.saveAll(user2Es); }catch (Exception e){ log.error("数据异常",e); return false; } return true; } }
如果是高版本的话,差别也不是很大,我还整合了7.6.0版本的,用法有点不一样,如果需要就整上还有配置,好了结束。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。