首先配置ES,elasticsearch.yml添加以下配置,然后单机启动,我用的windows启动,linux也一样的。
如要搭集群参考https://blog.csdn.net/letterss/article/details/91361205
http.cors.enabled: true
http.cors.allow-origin: "*"
path.data: C:\Users\wangsheng\Desktop\esdata\data
path.logs: C:\Users\wangsheng\Desktop\esdata\logs
network.host: 0.0.0.0
node.name: node-1
cluster.initial_master_nodes: ["node-1"]
node.master: true
Springboot POM添加以下依赖,一定要注意springboot和ES版本是否匹配,否则连接不上,我用的ES版本6.2.3,springboot 2.1.7RELEASE
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.2.3</version>
</dependency>
<!--elasticsearch 6.2.3 transport-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.2.3</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.39</version>
</dependency>
<!--springboot 对 spring data es 的支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
application.properties
spring.data.elasticsearch.cluster-name=wangsheng
//默认是9300,不是9200
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
新建实体类,注意要有@Document注解,还要有有参和无参构造方法
import lombok.Builder;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import java.io.Serializable;
/**
* 创 建 人 : wangsheng 创建日期:2020年11月
*/
@Builder
@Document(indexName = "myindex", type = "user")
public class User implements Serializable {
@Id
private Integer id;
private String name;
private String age;
private String phone;
private String address;
public User(Integer id, String name, String age, String phone, String address) {
this.id = id;
this.name = name;
this.age = age;
this.phone = phone;
this.address = address;
}
private User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
ES工具类
import com.example.demo.entity.User;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.common.recycler.Recycler;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.*;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
import static org.elasticsearch.index.query.QueryBuilders.*;
/**
* 创 建 人 : wangsheng 创建日期:2020年11月
*/
@Component
public class ElasticsearchUtil {
@Autowired
private ElasticsearchTemplate template;
/**
* 更新
*
* @return
*/
public <T> Boolean update(String index, String type, T t) throws IOException {
try {
Class<? extends Object> tClass = t.getClass();
//得到所有属性
Field[] field = tClass.getDeclaredFields();
//设置ID可以访问私有变量
field[0].setAccessible(true);
//整合出 getId() 属性这个方法
Method m = tClass.getMethod("get"+"Id");
//调用这个整合出来的get方法,强转成自己需要的类型
Integer id = (Integer)m.invoke(t);
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject();
for(int i=0;i<field.length;i++)
{ String updateField1=field[i].getName();
//将属性名字的首字母大写
updateField1=updateField1.replaceFirst(updateField1.substring(0, 1), updateField1.substring(0, 1).toUpperCase());
if(!updateField1.equals("Id")){
Object updateValue=getValue(t,field[i]);
if(updateValue!=null)
{
xContentBuilder.field(field[i].getName(),updateValue);
}
}}
xContentBuilder.endObject();
UpdateRequest updateRequest = new UpdateRequest().index(index)
.type(type).id(id.toString()).doc(xContentBuilder);;
UpdateQuery updateQuery = new UpdateQueryBuilder()
.withId(id.toString())
.withClass(tClass)
.withUpdateRequest(updateRequest)
.build();
template.update(updateQuery);
} catch (Exception e) {
return false;
}
return true;
}
//批量添加
public <T> boolean addList(List<T> list) {
try {
List queries = new ArrayList();
for (T t : list) {
IndexQuery indexQuery = new IndexQueryBuilder()
.withId(getId(t).toString())
.withObject(t)
.build();
queries.add(indexQuery);
}
if (queries.size() > 0) {
template.bulkIndex(queries);
}
} catch (Exception e) {
return false;
}
return true;
}
/**
* 删除
*
* @return
*/
public <T> boolean delete(T t) throws IOException {
try {
Class<? extends Object> tClass = t.getClass();
//得到所有属性
Field[] field = tClass.getDeclaredFields();
//设置ID可以访问私有变量
field[0].setAccessible(true);
//整合出 getId() 属性这个方法
Method m = tClass.getMethod("get"+"Id");
//调用这个整合出来的get方法,强转成自己需要的类型
Object id=getValue(t,field[0]);
template.delete(tClass, id.toString());
} catch (Exception e) {
System.out.println(e);
return false;
}
return true;
}
//添加单条数据
public <T> Boolean addOneData(T t) throws Exception {
try {
IndexQuery indexQuery = new IndexQueryBuilder()
.withId(getId(t).toString())
.withObject(t)
.build();
template.index(indexQuery);
} catch (Exception e) {
return false;
}
return true;
}
//分词匹配查询,比如有两条数据:1、我今天非常高兴 2、他摔倒很高兴输入:今天高兴. 这两条数据都能匹配上
public <T> List<Class<T>> queryByfenci(Integer startpage, Integer pageSize,Class<T> tClass, String keyword, String value) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery(keyword, value))
.withPageable(new PageRequest(startpage, pageSize))
.build();
List<T> list = template.queryForList(searchQuery, tClass);
return (List<Class<T>>) list;
}
//分页单字符串全文查询
public <T> List<Class<T>> queryByKeyWord(Integer startpage, Integer pageSize, String value,Class<T> tClass) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.queryStringQuery(value))
.withPageable(new PageRequest(startpage, pageSize))
.build();
List<T> list = template.queryForList(searchQuery,tClass);
return (List<Class<T>>) list;
}
//分页模糊查询,类似mysql中like "%word%"的模糊匹配
public <T> List<T> queryLike(Integer startpage, Integer pageSize, String keyword, String value,Class<T> tClass) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchPhraseQuery(keyword, value))
.withPageable(new PageRequest(startpage, pageSize))
.build();
List<T> list = template.queryForList(searchQuery, tClass);
return list;
}
//分页多条件查,字段和值必须全等
public <T> List<T> queryByManyKey(Integer startpage, Integer pageSize,T t) throws Exception {
BoolQueryBuilder mustQuery = QueryBuilders.boolQuery();
Pageable pageable = new PageRequest(startpage, pageSize);
Class<? extends Object> tClass = t.getClass();
//得到所有属性
Field[] field = tClass.getDeclaredFields();
for(int i=0;i<field.length;i++)
{ String updateField=field[i].getName();
//将属性名字的首字母大写
updateField=updateField.replaceFirst(updateField.substring(0, 1), updateField.substring(0, 1).toUpperCase());
if(!updateField.equals("Id")){
Object updateValue=getValue(t,field[i]);
if(updateValue!=null)
{ mustQuery.must(QueryBuilders.matchPhraseQuery(field[i].getName(), updateValue));
}
}}
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(mustQuery).withPageable(pageable).build();
return (List<T>) template.queryForList(searchQuery, tClass);
}
/**
* 分页多个字段匹配某字符串,value是字符串,column是匹配的列,只要任何一个字段包括该字符串即可
*/
public <T> List<Class<T>> manyFiledMach(Integer startpage, Integer pageSize,Class<T> tClass, String value, String... column) {
Pageable pageable = new PageRequest(startpage, pageSize);
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(multiMatchQuery(value, column)).withPageable(pageable).build();
List<T> list = template.queryForList(searchQuery, tClass);
return (List<Class<T>>) list;
}
public <T> Object getValue( T t,Field field){
try{
Class<? extends Object> tClass = t.getClass();
field.setAccessible(true);
String updateField1=field.getName();
//将属性名字的首字母大写
updateField1=updateField1.replaceFirst(updateField1.substring(0, 1), updateField1.substring(0, 1).toUpperCase());
Method m = tClass.getMethod("get"+updateField1);
// 获取属性类型
String type = field.getGenericType().toString();
if(type.equals("class java.lang.String")){
String value = (String)m.invoke(t);
return value;
}
if(type.equals("class java.lang.Integer")){
Integer value = (Integer)m.invoke(t);
return value;
}
if(type.equals("class java.util.Date")){
Date value = (Date)m.invoke(t);
return value;
}
}catch(Exception e){
return null;
}
return null;
}
public <T> Object getId( T t){
try {
Class<? extends Object> tClass = t.getClass();
//得到所有属性
Field[] field = tClass.getDeclaredFields();
//设置ID可以访问私有变量
field[0].setAccessible(true);
//整合出 getId() 属性这个方法
Method m = tClass.getMethod("get" + "Id");
//调用这个整合出来的get方法,强转成自己需要的类型
return getValue(t, field[0]);
}catch (Exception e)
{
return null;
}
}
}
测试类
import com.alibaba.fastjson.JSON;
import com.example.demo.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
/**
* 创 建 人 : wangsheng 创建日期:2020年11月
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class tesst {
@Autowired
private ElasticsearchUtil elasticsearchUtil;
@Test
public void addOneData() throws Exception {
User user=User.builder().id(3).name("wangsheng").address("重庆市").age("25").build();
elasticsearchUtil.addOneData(user);
}
@Test
public void addList() throws Exception {
List<User> list=new ArrayList<>();
User user=User.builder().id(4).name("wangs").address("天津市").age("27").build();
User user1=User.builder().id(5).name("wangsheng").address("重庆市").age("26").build();
list.add(user);
list.add(user1);
System.out.println(elasticsearchUtil.addList(list));
}
@Test
public void queryByKeyWord()
{ User user=User.builder().id(3).name("wangsheng").address("天津市").age("27").build();
System.out.println(JSON.toJSONString(elasticsearchUtil.queryByKeyWord(0,10,user.getName(),User.class)));
}
@Test
public void queryLike()
{
User user=User.builder().id(3).name("wang").address("天津市").age("27").build();
List<User> list=elasticsearchUtil.queryLike(0,10,"name",user.getName(),User.class);
System.out.println(JSON.toJSONString(list));
}
@Test
public void queryByManyKey() throws Exception {
User user=User.builder().id(2).age("25").build();
System.out.println(JSON.toJSONString(elasticsearchUtil.queryByManyKey(0,10,user)));
}
@Test
public void update() throws Exception {
User user=User.builder().id(2).name("wangsheng").address("天津").age("28").build();
System.out.println(JSON.toJSONString(elasticsearchUtil.update("user","user",user)));
}
@Test
public void delete() throws Exception {
User user=User.builder().id(2).name("wang").address("天津市").age("25").build();
System.out.println(JSON.toJSONString(elasticsearchUtil.delete(user)));
}
@Test
public void manyFiledMach( )
{ User user=User.builder().id(2).name("wang").address("天津市").age("25").build();
System.out.println(JSON.toJSONString(elasticsearchUtil.manyFiledMach(0,10,User.class,user.getName(),"name","address")));
}
@Test
public void queryByfenci( )
{ User user=User.builder().id(2).name("wang").address("天津市").age("25").build();
System.out.println(JSON.toJSONString(elasticsearchUtil.queryByfenci(0,10,User.class,"name",user.getName())));
}
}