如何建设动漫网站,使用angular2框架做的网站,印团网网站是哪家做的,周口航迪科技网站建设公司怎么样Java操作Elasticsearch的实用指南 一、创建索引二、增删改查 一、创建索引
在ElasticSearch中索引相当于mysql中的表,mapping相当于表结构#xff0c;所以第一步我们要先创建索引。
假设我们有一张文章表的数据需要同步到ElasticSearch#xff0c;首先需要根据数据库表创建… Java操作Elasticsearch的实用指南 一、创建索引二、增删改查 一、创建索引
在ElasticSearch中索引相当于mysql中的表,mapping相当于表结构所以第一步我们要先创建索引。
假设我们有一张文章表的数据需要同步到ElasticSearch首先需要根据数据库表创建ES的索引结构。
-- 文章表
create table if not exists post
(id bigint auto_increment comment id primary key,title varchar(512) null comment 标题,content text null comment 内容,tags varchar(1024) null comment 标签列表json 数组,thumbNum int default 0 not null comment 点赞数,favourNum int default 0 not null comment 收藏数,userId bigint not null comment 创建用户 id,createTime datetime default CURRENT_TIMESTAMP not null comment 创建时间,updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 更新时间,isDelete tinyint default 0 not null comment 是否删除,index idx_userId (userId)
) comment 帖子 collate utf8mb4_unicode_ci;
ElasticSearch的索引结构:
aliases:别名为了方便后续数据迁移字段类型是text这个字段可以被分词可模糊查询字段类型是keyword只能完全匹配精确查询。analyzer(存储时生效的分词器):用ik_max_word拆的更碎、索引更多更有可能被搜出来search analyzer (查询时生效的分词器):用ik_smart更偏向于用户想要搜的分词。
PUT post
{aliases: {post: {}},mappings: {properties: {title: {type: text,analyzer: ik_max_word,search_analyzer: ik_smart,fields: {keyword: {type: keyword,ignore_above: 256}}},content: {type: text,analyzer: ik_max_word,search_analyzer: ik_smart,fields: {keyword: {type: keyword,ignore_above: 256}}},tags: {type: keyword},userId: {type: keyword},createTime: {type: date},updateTime: {type: date},isDelete: {type: keyword}}}
}二、增删改查
使用java客户端进行增删改查第一步导入依赖。 !-- elasticsearch--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-elasticsearch/artifactId/dependency第一种方式: ElasticsearchRepositoryPostEsDTO,Long默认提供了简单的增删改查多用于可预期的、相对没那么复杂的查询、自定义查询。 Testvoid testSelect() {System.out.println(postEsDao.count());PagePostEsDTO PostPage postEsDao.findAll(PageRequest.of(0, 5, Sort.by(createTime)));ListPostEsDTO postList PostPage.getContent();System.out.println(postList);}Testvoid testAdd() {PostEsDTO postEsDTO new PostEsDTO();postEsDTO.setId(1L);postEsDTO.setTitle(我是章三);postEsDTO.setContent(张三学习java学习使我快乐);postEsDTO.setTags(Arrays.asList(java, python));postEsDTO.setUserId(1L);postEsDTO.setCreateTime(new Date());postEsDTO.setUpdateTime(new Date());postEsDTO.setIsDelete(0);postEsDao.save(postEsDTO);System.out.println(postEsDTO.getId());}Testvoid testFindById() {OptionalPostEsDTO postEsDTO postEsDao.findById(1L);System.out.println(postEsDTO);}Testvoid testCount() {System.out.println(postEsDao.count());}Testvoid testFindByCategory() {ListPostEsDTO postEsDaoTestList postEsDao.findByUserId(1L);System.out.println(postEsDaoTestList);}ES 中_开头的字段表示系统默认字段比如 _id如果系统不指定会自动生成。但是不会在surce 字段中补充 id 的值所以建议大家手动指定。
支持根据方法名自动生成方法比如:
ListcPostEsDTO findByTitle(String title);第二种方式: Spring 默认给我们提供的提作 es 的客户端对象 ElasticsearchRestTemplate也提供了增制改查它的增删改查更灵活适用于更复杂的操作。 ES的搜索条件
GET /_search
{query: { bool: { 组合条件must: [ 必须都满足{ match: { title: Search }}, 模糊查询 { match: { content: Elasticsearch }}],filter: [ { term: { status: published }}, 精确查询{ range: { publish_date: { gte: 2015-01-01 }}} 范围查询],should : [{ term : { tags : env1 } },{ term : { tags : deployed } }],minimum_should_match : 1, 包含匹配最少匹配1条boost : 1.0}}
}对于复杂的查询建议使用第二种方式。
//依赖注入
Resourceprivate ElasticsearchRestTemplate elasticsearchRestTemplate;三个步骤 1、取参数 2、把参数组合为ES支持的搜索条件 3、从返回值中取结果 Long id postQueryRequest.getId();Long notId postQueryRequest.getNotId();String searchText postQueryRequest.getSearchText();String title postQueryRequest.getTitle();String content postQueryRequest.getContent();ListString tagList postQueryRequest.getTags();ListString orTagList postQueryRequest.getOrTags();Long userId postQueryRequest.getUserId();// es 起始页为 0long current postQueryRequest.getCurrent() - 1;long pageSize postQueryRequest.getPageSize();String sortField postQueryRequest.getSortField();String sortOrder postQueryRequest.getSortOrder();BoolQueryBuilder boolQueryBuilder QueryBuilders.boolQuery();// 过滤boolQueryBuilder.filter(QueryBuilders.termQuery(isDelete, 0));if (id ! null) {boolQueryBuilder.filter(QueryBuilders.termQuery(id, id));}if (notId ! null) {boolQueryBuilder.mustNot(QueryBuilders.termQuery(id, notId));}if (userId ! null) {boolQueryBuilder.filter(QueryBuilders.termQuery(userId, userId));}// 必须包含所有标签if (CollectionUtils.isNotEmpty(tagList)) {for (String tag : tagList) {boolQueryBuilder.filter(QueryBuilders.termQuery(tags, tag));}}// 包含任何一个标签即可if (CollectionUtils.isNotEmpty(orTagList)) {BoolQueryBuilder orTagBoolQueryBuilder QueryBuilders.boolQuery();for (String tag : orTagList) {orTagBoolQueryBuilder.should(QueryBuilders.termQuery(tags, tag));}orTagBoolQueryBuilder.minimumShouldMatch(1);boolQueryBuilder.filter(orTagBoolQueryBuilder);}// 按关键词检索if (StringUtils.isNotBlank(searchText)) {boolQueryBuilder.should(QueryBuilders.matchQuery(title, searchText));// boolQueryBuilder.should(QueryBuilders.matchQuery(description, searchText));boolQueryBuilder.should(QueryBuilders.matchQuery(content, searchText));boolQueryBuilder.minimumShouldMatch(1);}// 按标题检索if (StringUtils.isNotBlank(title)) {boolQueryBuilder.should(QueryBuilders.matchQuery(title, title));boolQueryBuilder.minimumShouldMatch(1);}// 按内容检索if (StringUtils.isNotBlank(content)) {boolQueryBuilder.should(QueryBuilders.matchQuery(content, content));boolQueryBuilder.minimumShouldMatch(1);}// 排序SortBuilder? sortBuilder SortBuilders.scoreSort();if (StringUtils.isNotBlank(sortField)) {sortBuilder SortBuilders.fieldSort(sortField);sortBuilder.order(CommonConstant.SORT_ORDER_ASC.equals(sortOrder) ? SortOrder.ASC : SortOrder.DESC);}// 分页PageRequest pageRequest PageRequest.of((int) current, (int) pageSize);// 构造查询NativeSearchQuery searchQuery new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withPageable(pageRequest).withSorts(sortBuilder).build();SearchHitsPostEsDTO searchHits elasticsearchRestTemplate.search(searchQuery, PostEsDTO.class);后记 美好的一天到此结束下次继续努力欲知后续请看下回分解写作不易感谢大家的支持