pom.xml
<!--elasticSearch整合-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
application.yml
#====================== 配置elasticSearch ====================#
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 192.168.1.133:9200
repositories:
enabled: true
elasticsearch:
rest:
uris: 192.168.1.133:9200
connection-timeout: 10s
实体类
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
// indexName :索引名字(对应mysql的数据库名字)
//type:类型(对应mysql的表名)
@Document(indexName = "item",type = "docs", shards = 10, replicas = 2)
public class Employee {
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "ik_max_word",fielddata = true)
private String firstName;
@Field (type = FieldType.Text,fielddata = true)
private String lastName;
@Field (type = FieldType.Integer)
private Integer age=0;
@Field (type = FieldType.Keyword)
private String about;
public String getId() {return id;}
public void setId(String id){this.id = id;}
public String getFirstName() {return firstName;}
public void setFirstName(String firstName) {this.firstName = firstName;}
public String getLastName() {return lastName;}
public void setLastName(String lastName) {this.lastName = lastName;}
public Integer getAge() {return age;}
public void setAge(Integer age) {this.age = age;}
public String getAbout() {return about;}
public void setAbout(String about) {this.about = about;}
public Employee(String id, String firstName, String lastName, Integer age, String about) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.about = about;
}
public Employee() {
super();
}
@Override
public String toString() {
return "Employee{" +
"id='" + id + '\'' +
", firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", age=" + age +
", about='" + about + '\'' +
'}';
}
}
elasticsearch增删改查及聚类查询junit测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class EsTest {
@Autowired
private EmployeeRepository er;
@Test
public void saveIndex() {
ArrayList<Employee> list = new ArrayList<>();
list.add(new Employee("1", "哈利", "波特", 25, "哈利·波特"));
list.add(new Employee("2", "赫敏", "格兰杰", 25, "哈利·波特"));
list.add(new Employee("3", "罗恩", "韦斯莱", 25, "哈利·波特"));
list.add(new Employee("4", "阿不思", "邓布利多", 65, "哈利·波特"));
list.add(new Employee("5", "西弗勒斯", "斯内普", 42, "哈利·波特"));
list.add(new Employee("6", "阿拉斯托", "穆迪", 57, "哈利·波特"));
list.add(new Employee("7", "琼恩", "雪诺", 57, "权力的游戏"));
list.add(new Employee("8", "丹尼莉丝", "坦格利安", 57, "权力的游戏"));
list.add(new Employee("9", "提利昂", "兰尼斯特", 57, "权力的游戏"));
list.add(new Employee("10", "艾莉亚", "史塔克", 57, "权力的游戏"));
er.saveAll(list);
}
/**
* 查询所有
*/
@Test
public void findAll() {
Iterable<Employee> all = er.findAll();
all.forEach(System.out::println);
}
/**
* 删除所有
*/
@Test
public void deleteAll() {
er.deleteAll();
System.out.println("删除成功");
}
/**
* 查询所有按字段排序
*/
@Test
public void findAllSort() {
Iterable<Employee> all = er.findAll(Sort.by(Sort.Direction.ASC, "age"));
all.forEach(System.out::println);
}
/**
* 自定义查询方法
*/
@Test
public void findCustom() {
Iterable<Employee> all = er.queryByAgeBetween(1, 5);
all.forEach(System.out::println);
}
/**
* 普通自定义查询
*/
@Test
public void customQuery() {
FuzzyQueryBuilder termQueryBuilder = QueryBuilders.fuzzyQuery("firstName", "艾莉亚");
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("firstName", "艾莉亚");
Iterable<Employee> search1 = er.search(matchQueryBuilder);
Iterable<Employee> search2 = er.search(termQueryBuilder);
search1.forEach(System.out::println);
System.out.println("------------");
search2.forEach(System.out::println);
}
/**
* 分页查询
*/
@Test
public void nativeQuery() {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withPageable(PageRequest.of(0, 1));
nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("firstName", "艾莉亚"));
Page<Employee> items = er.search(nativeSearchQueryBuilder.build());
// 打印总条数
System.out.println(items.getTotalElements());
// 打印总页数
System.out.println(items.getTotalPages());
items.forEach(System.out::println);
}
/**
* 聚类查询
*/
@Test
public void juleiQuery() {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withPageable(PageRequest.of(0, 10));
nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("about", "哈利"));
Page<Employee> items = er.search(nativeSearchQueryBuilder.build());
// 打印总条数
System.out.println(items.getTotalElements());
// 打印总页数
System.out.println(items.getTotalPages());
items.forEach(System.out::println);
}
}
实现自定义查询方法
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;
@Component
public interface EmployeeRepository extends ElasticsearchRepository<Employee,String>{
/**
* 查询根据id数据对象
* @param id
* @return
*/
Employee queryEmployeeById(String id);
/**
* 查询年龄在age1和age2之间的数据
* @param age1
* @param age2
* @return
*/
Iterable<Employee> queryByAgeBetween(Integer age1,Integer age2);