java操作elasticsearch
代码地址
https://gitee.com/wl1092212424/prarent-project.git
创建工程添加pom依赖
父工程pom文件
<!-- 统一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
<mysql.version>5.1.47</mysql.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
<swagger2.version>2.9.2</swagger2.version>
</properties>
<!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>3.1.0</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.1.0</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.1.0</version>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
common模块pom文件
<properties>
<swagger2.version>2.9.2</swagger2.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
es学习模块
<dependencies>
<dependency>
<groupId>com.lang.cloud</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
</dependencies>
在yml中添加ES连接信息
server:
port: 8081
spring:
application:
name: learning-es
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/national_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: Ab123456!@#
data:
elasticsearch:
cluster-name: my-application
cluster-nodes: 112.126.63.57:9300
repositories:
enabled: true
避免踩坑,添加一个bean
@SpringBootConfiguration
public class ElasticSearchConfig {
@PostConstruct
void init() {
System.setProperty("es.set.netty.runtime.available.processors", "false");
}
}
创建ESRepository接口,用于与es交互
ElasticsearchTemplate这个不用我们注入就可以了,可以通过这个对象来操作ES
@Component
public interface NewsLogDocumentRepository extends ElasticsearchRepository<NewsLog,String> {
}
来实现增删改查
创建一个索引
@Override
public void addDocument(NewsLog... newsLog) {
//先把这个mapping保存起来
esTemplate.putMapping(NewsLog.class);
//第二步存储数据
//得到一共传递了多少个
newsLogDocumentRepository.saveAll(Arrays.asList(newsLog));
}
删除一个索引
//删除索引
@Override
public void delete(String indexName) {
boolean b = esTemplate.deleteIndex(indexName);
System.out.println("删除的状态: " + b);
}
清空索引
@Override
public void deleteAll() {
newsLogDocumentRepository.deleteAll();
}
根据ID获取
@Override
public NewsLog getNewsLogById(String id) {
Optional<NewsLog> byId = newsLogDocumentRepository.findById(id);
return byId.get();
}
获取全部
@Override
public List<NewsLog> getAll() {
List<NewsLog> list = new ArrayList<>();
newsLogDocumentRepository.findAll().forEach(list::add);
return list;
}
搜索
@Override
public List<NewsLog> queryByKeyword(String keyword, Class<NewsLog> newsLogClass) {
NativeSearchQuery build = new NativeSearchQueryBuilder().
withQuery(new QueryStringQueryBuilder(keyword)).//根据关键词查询
withSort(SortBuilders.scoreSort().//根据hit分查询
order(SortOrder.DESC)).build();//根据降序排列
List<NewsLog> newsLogs = esTemplate.queryForList(build, newsLogClass);
return newsLogs;
}
搜索,命中关键字高亮
@Override
public List<Map<String, Object>> queryHit(String keyword, String indexName, String[] fieldNames) {
//构造查询条件,使用标准的分词器
QueryBuilder matchQuery = createQueryBuilder(keyword,fieldNames);
//设置高亮默认的hightLighter高亮器
HighlightBuilder highlightBuilder = createHightlightBuilder(fieldNames);
SearchResponse searchResponse = esTemplate.getClient().prepareSearch(indexName)
.setQuery(matchQuery)
.highlighter(highlightBuilder)
.setSize(10000)// 设置一次返回的文档数量,最大值:10000
.get();
SearchHits hits = searchResponse.getHits();
//返回高亮和不高亮的数据
return getHitList(hits);
}
//构造查询条件,使用标准的分词器
private QueryBuilder createQueryBuilder(String keyword, String[] fieldNames) {
MultiMatchQueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(keyword, fieldNames)
.analyzer("ik_max_word")
.operator(Operator.OR);
return queryBuilder;
}
//设置高亮默认的hightLighter高亮器
private HighlightBuilder createHightlightBuilder(String[] fieldNames) {
HighlightBuilder highlightBuilder = new HighlightBuilder()
.preTags("<span> style='color:red'>")
.postTags("</span>");
for (String item : fieldNames) {
highlightBuilder.field(item);
}
return highlightBuilder;
}
private List<Map<String,Object>> getHitList(SearchHits hits){
List<Map<String,Object>> list = new ArrayList<>();
Map<String,Object> map;
for (SearchHit item : hits) {
map = new HashMap<>();
//处理的源数据
map.put("source",item.getSourceAsMap());
//处理高亮数据
Map<String, String> hitMap = new HashMap<>();
Map<String, HighlightField> hightMap = item.getHighlightFields();
hightMap.keySet().forEach((key)->{
HighlightField value = hightMap.get(key);
StringBuilder hightStr = new StringBuilder();
Text[] fragments = value.getFragments();
for (Text text : fragments) {
hightStr.append(text);
}
String name = value.getName();
hitMap.put(name,hightStr.toString());
});
map.put("hightlight",hitMap);
list.add(map);
}
return list;
}
分页查询
@Override
public Page<Map<String, Object>> queryHitByPage(int pageNo, int pageSize, String keyword, String indexName, String[] fieldNames) {
//构造查询条件,使用标准分词器
QueryBuilder queryBuilder = createQueryBuilder(keyword,fieldNames);
//设置高亮,使用默认的hightLighter高亮器
HighlightBuilder highlight = createHightlightBuilder(fieldNames);
//设置查询字段
SearchResponse response = esTemplate.getClient().prepareSearch(indexName)
.setQuery(queryBuilder)
.highlighter(highlight)
.setFrom((pageNo-1) * pageSize)
.setSize(pageNo * pageSize)// 设置一次返回的文档数量,最大值:10000
.get();
SearchHits hits = response.getHits();
Long totalHits = hits.getTotalHits();
Page<Map<String, Object>> page = new Page(pageNo,pageSize,totalHits.intValue());
page.setList(getHitList(hits));
return page;
}
谢谢