Springboot集成elasticsearch 使用IK+拼音分词
Springboot集成elasticsearch 使用IK+拼音分词
docker安装ES
下载
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.2
启动
docker run -d --name="es" -p 9200:9200 -p 9300:9300 -e "cluster.name=elasticsearch" -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.3.2
springboot集成
maven依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.1.4.RELEASE</version></dependency>
配置文件
spring:data:elasticsearch:cluster-name: elasticsearchcluster-nodes: ip:9300
实体类
package com.my.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.elasticsearch.annotations.Document;/*** <一句话功能简述><br>* ()** @author M.Y* @date 2019/5/30* @since 1.0.0*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(indexName = "contents",type = "content")
//indexName索引名称 可以理解为数据库名 必须为小写 不然会报org.elasticsearch.indices.InvalidIndexNameException异常
//type类型 可以理解为表名
public class GoodsInfo {private Long id;private String name;private String des;}
DAO
package com.my.dao;import com.my.entity.GoodsInfo;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;/*** <一句话功能简述><br>* ()** @author M.Y* @date 2019/5/30* @since 1.0.0*/
@Component
public interface GoodsRepository extends ElasticsearchRepository<GoodsInfo,Long> {}
Controller
package com.my.controller;import com.my.dao.GoodsRepository;
import com.my.entity.GoodsInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;/*** <一句话功能简述><br>* ()** @author M.Y* @date 2019/5/30* @since 1.0.0*/
@RestController
public class GoodsController {@Autowiredprivate GoodsRepository goodsRepository;//http://localhost:8080/save?des=@GetMapping("save")public String save(String des){GoodsInfo goodsInfo = new GoodsInfo(System.currentTimeMillis(),"商品"+System.currentTimeMillis(),des);goodsRepository.save(goodsInfo);return "success";}//http://localhost:8080/delete?id=@GetMapping("delete")public String delete(long id){goodsRepository.deleteById(id);return "success";}//http://localhost:8080/update?name=修改&des=修改&id=@GetMapping("update")public String update(long id,String name,String description){GoodsInfo goodsInfo = new GoodsInfo(id,name,description);goodsRepository.save(goodsInfo);return "success";}//http://localhost:8080/getOne?id=@GetMapping("getOne")public GoodsInfo getOne(long id){GoodsInfo goodsInfo = goodsRepository.findById(id).orElse(null);return goodsInfo;}
}
测试
谷歌elasticsearch-head插件查看
安装IK分词插件
进入容器
docker exec -it es bash
进入目录
cd /usr/share/elasticsearch/
下载安装插件(注意版本要与es一致)
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.2/elasticsearch-analysis-ik-6.3.2.zip
退出容器
exit
重启容器
docker restart es
验证结果
ik_max_word:尽可能多的分词
ik_smart:尽可能少的分词
安装拼音转换插件
进入容器
docker exec -it es bash
进入目录
cd /usr/share/elasticsearch/
下载安装插件(注意版本要与es一致)
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v6.3.2/elasticsearch-analysis-pinyin-6.3.2.zip
退出容器
exit
重启容器
docker restart es
新建索引
关闭索引(更新配置前要关闭索引,不然会报错)
创建拼音分词
{"analysis" : {"analyzer" : {"pinyin_analyzer" : {"tokenizer" : "my_pinyin"}},"tokenizer" : {"my_pinyin" : {"type" : "pinyin","keep_separate_first_letter" : false,"keep_full_pinyin" : true,"keep_original" : true,"limit_first_letter_length" : 16,"lowercase" : true,"remove_duplicated_term" : true}}}
}
验证结果
Springboot集成以上分词
新建索引,新增分词配置
{"analysis" : {"analyzer" : {"pinyin_analyzer" : {"tokenizer" : "my_pinyin"}},"tokenizer" : {"my_pinyin" : {"type" : "pinyin","keep_separate_first_letter" : false,"keep_full_pinyin" : true,"keep_original" : true,"limit_first_letter_length" : 16,"lowercase" : true,"remove_duplicated_term" : true}}}
}
{"properties": {"字段名": {"type": "keyword","fields": {"pinyin": {"type": "text","store": false,"term_vector": "with_offsets","analyzer": "pinyin_analyzer","boost": 10}}}}}
新实体类
package com.my.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Mapping;import java.util.Date;@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(indexName = "new_film", type = "new")
public class FilmEntity {private Long id;private String name;private String director;private Date created ;@Overridepublic String toString() {return "FilmEntity [id=" + id + ", name=" + name + ", director=" + director + "]";}
}
新增测试数据
@AutowiredFilmRepository filmRepository;@GetMapping("save")public String save(String des,String name){LocalDateTime localDateTime = LocalDateTime.now();ZoneId zone = ZoneId.systemDefault();Instant instant = localDateTime.atZone(zone).toInstant();Date date = Date.from(instant);FilmEntity filmEntity = new FilmEntity(System.currentTimeMillis(),name,des,date);filmRepository.save(filmEntity);return "success";}
查询
/*** 拼接搜索条件** @param name the name* @return list*/@GetMapping("search")public List<FilmEntity> search(String name) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(structureQuery(name)).build();List<FilmEntity> list = filmRepository.search(searchQuery).getContent();return list;}/*** 中文、拼音混合搜索** @param content the content* @return dis max query builder*/public DisMaxQueryBuilder structureQuery(String content) {//使用dis_max直接取多个query中,分数最高的那一个query的分数即可DisMaxQueryBuilder disMaxQueryBuilder = QueryBuilders.disMaxQuery();//boost 设置权重,只搜索匹配name和disrector字段QueryBuilder ikNameQuery = QueryBuilders.matchQuery("name", content).boost(2f);QueryBuilder pinyinNameQuery = QueryBuilders.matchQuery("name.pinyin", content);QueryBuilder ikDirectorQuery = QueryBuilders.matchQuery("director", content).boost(2f);disMaxQueryBuilder.add(ikNameQuery);disMaxQueryBuilder.add(pinyinNameQuery);disMaxQueryBuilder.add(ikDirectorQuery);return disMaxQueryBuilder;}
http://localhost:8080/film/search?name=中国
:
[{"id": 1559724973532,"name": "ceshi","director": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船","created": "2019-06-05T08:56:13.531+0000"},{"id": 1559724949646,"name": "测试","director": "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首","created": "2019-06-05T08:55:49.645+0000"},{"id": 1559724960792,"name": "小明","director": "美国留给伊拉克的是个烂摊子吗","created": "2019-06-05T08:56:00.792+0000"}
]
http://localhost:8080/film/search?name=ceshi
http://localhost:8080/film/search?name=测试
[{"id": 1559786111119,"name": "ceshi","director": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船","created": "2019-06-06T01:55:11.119+0000"},{"id": 1559786123724,"name": "测试","director": "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首","created": "2019-06-06T01:55:23.724+0000"}
]
构建高亮查询
@AutowiredTransportClient client;/*** 构建高亮查询* @param des* @return*/@GetMapping("query")public List<FilmEntity> query(String des) {QueryBuilder query = structureQuery(des);// 加入查询中HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.preTags("<span>");//设置前缀highlightBuilder.postTags("</span>");//设置后缀highlightBuilder.field("name");//设置高亮字段highlightBuilder.field("director");//设置高亮字段
// highlightBuilder.field("name.pinyin");//这里设置之后没有生效,如果有大佬知道请告知谢谢SearchResponse response = client.prepareSearch("new_film").setTypes("new").setQuery(query).highlighter(highlightBuilder).execute().actionGet();// 遍历结果, 获取高亮片段SearchHits searchHits = response.getHits();FilmEntity filmEntity = null;List<FilmEntity> result = new ArrayList<>();for (SearchHit hit : searchHits) {Map<String, Object> entityMap = hit.getSourceAsMap();filmEntity = com.alibaba.fastjson.JSON.parseObject(JSON.toJSONString(entityMap), FilmEntity.class);if (!StringUtils.isEmpty(hit.getHighlightFields().get("name"))) {Text[] text = hit.getHighlightFields().get("name").getFragments();filmEntity.setName(text[0].toString());}if (!StringUtils.isEmpty(hit.getHighlightFields().get("director"))) {Text[] text = hit.getHighlightFields().get("director").getFragments();filmEntity.setDirector(text[0].toString());}result.add(filmEntity);}return result;}
http://localhost:8080/film/query?des=中国
[{"id": 1559786111119,"name": "ceshi","director": "<span>中</span>韩渔警冲突调查:韩警平均每天扣1艘<span>中</span><span>国</span>渔船","created": "2019-06-06T01:55:11.119+0000"},{"id": 1559786123724,"name": "测试","director": "<span>中</span><span>国</span>驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首","created": "2019-06-06T01:55:23.724+0000"},{"id": 1559786119620,"name": "小明","director": "美<span>国</span>留给伊拉克的是个烂摊子吗","created": "2019-06-06T01:55:19.620+0000"}
]
http://localhost:8080/film/query?des=测试
[{"id": 1559786123724,"name": "<span>测试</span>","director": "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首","created": "2019-06-06T01:55:23.724+0000"},{"id": 1559786111119,"name": "ceshi","director": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船","created": "2019-06-06T01:55:11.119+0000"}
]
代码地址
Springboot集成elasticsearch 使用IK+拼音分词相关推荐
- IK集成ElasticSearch,IK分词器的下载及使用
IK集成ElasticSearch,IK分词器的下载及使用 下载ElasticSearch 8.7.0网址:Download Elasticsearch | Elastic 历史版本地址:Past R ...
- springboot集成Elasticsearch实现各种搜索功能
springboot集成Elasticsearch各类搜索功能实现 springboot集成Elasticsearch使用completion suggest实现自动关键字补全 建立学生的索引和映射: ...
- springboot集成elasticsearch,实现搜索提示补全功能
springboot集成elasticsearch,通过实体类创建索引,实现搜索提示补全功能 文章目录 springboot集成elasticsearch,通过实体类创建索引,实现搜索提示补全功能 一 ...
- 自学笔记-SpringBoot集成ElasticSearch
目录 一.ElasticSearch介绍: 二.ElasticSearch安装: 三.Kibana的安装 四.配置ik分词器 五.Springboot集成ElasticSearch Ⅰ.依赖 Ⅱ.配置 ...
- 史上最简单的Elasticsearch教程:SpringBoot集成Elasticsearch 实时流量监测平台
SpringBoot集成Elasticsearch 实时流量监测平台 目录: 第一章:初尝 Elasticsearch 第二章:玩转 Kibana 第三章:开发原生 Elasticsearch 案例 ...
- GitChat优质文章-SpringBoot集成Elasticsearch
Elasticsearch 是一个基于 Lucene 库的搜索引擎.Elasticsearch 是目前大数据领域最热门的技术栈之一.目前 Elasticsearch 被广泛应用在搜索.安全.数据分析等 ...
- 【SpringBoot高级篇】SpringBoot集成Elasticsearch搜索引擎
[SpringBoot高级篇]SpringBoot集成Elasticsearch搜索引擎 1. 什么是Elasticsearch? 2. 安装并运行Elasticsearch 2.1 拉取镜像 2.2 ...
- springboot——集成elasticsearch进行搜索并高亮关键词
目录 1.elasticsearch概述 3.springboot集成elasticsearch 4.实现搜索并高亮关键词 1.elasticsearch概述 (1)是什么: Elasticsearc ...
- SpringBoot集成Elasticsearch搜索引擎(九)
官网:https://www.elastic.co/cn/ 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/i ...
最新文章
- 【GTSAM】GTSAM学习
- java 时间间隔 工作日,计算Java中两个日期之间的工作日数
- 4、MySQL设置事务自动提交(开启和关闭)
- oracle11g sp 1503,Oracle11g操作ASM权限问题
- Python 数据分析三剑客之 Matplotlib(九):极区图 / 极坐标图 / 雷达图的绘制
- java中地图查询比较慢,在java中缓慢的地图
- proguard-gui 混淆代码简要笔记
- flowchart流程图编程语言下载_c语言流程图生成器下载
- 阿铭Linux_网站维护学习笔记20190409
- 百度编辑器ueditor表格无法显示边框以及边框颜色等系列问题解决方案
- 设置WebView字体颜色,背景颜色
- Weston 窗口管理(2)
- Endnote20加载入wps——当COM加载项找不到插件时
- 【裴蜀定理】CF1055C Lucky Days
- [WinError 10060]错误
- 互联网站规划与设计.txt
- 4种超好用的PS调色小技巧,知道的人不多!
- Java精品项目源码第47期房屋租赁管理系统
- 关于组织 2021年全国大学生数学建模竞赛的通知
- 将base64转换为图片