Elasticsearch是一个基于Lucene的搜索服务器。是一个分布式、可扩展、实时的搜索与数据分析引擎。 它能从项目一开始就赋予你的数据以搜索、分析和探索的能力,可用于实现全文搜索和实时数据统计。
简称ES。
一、安装和使用
1、可进入官网下载zip的包:https://www.elastic.co/cn/
2、安装中文分词插件,在elasticsearch-版本号\bin目录下执行以下命令:elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/版本号/elasticsearch-analysis-ik-版本号.zip
ps:安装ik分词器必须对应es版本。
3、运行bin目录下的elasticsearch.bat启动ES。
4、下载Kibana,作为访问Elasticsearch的客户端,下载zip包,并解压到指定目录,下载地址:https://artifacts.elastic.co/downloads/kibana/kibana-你的es版本号-windows-x86_64.zip
5、运行bin目录下的kibana.bat
6、访问http://localhost:5601 即可打开Kibana的用户界面
二、springboot整合Elasticsearch
添加es相关pom
<!--Elasticsearch-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch<artifactId>
</dependency>
在spring节点下添加es配置。
data:
elasticsearch:
repositories:
enabled: true
cluster-nodes: 127.0.0.1:9300 # 地址及端口号
cluster-name: elasticsearch # 集群名称
保存到es里的字段信息
/**
* @date 2021-05-27 13:34
* @Document 作用在类,标记实体类为文档对象,一般有两个属性
* indexName:对应索引库名称
* type:对应在索引库中的类型
* shards:分片数量,默认5
* replicas:副本数量,默认1
* @Id 作用在成员变量,标记一个字段作为id主键
* @Field 作用在成员变量,标记为文档的字段,并指定字段映射属性:
* type:字段类型,取值是枚举:FieldType
* index:是否索引,布尔类型,默认是true
* store:是否存储,布尔类型,默认是false
* analyzer:分词器名称
*/
@Document(indexName = "user", type = "issue")
@Data
public class EsUser implements Serializable {
@Id
@Field(type = FieldType.Long,store = true)
private Long id;
/**
* 用户名
*/
@Field(type = FieldType.Text,store = true,analyzer = "ik_max_word")
private String userName;
/**
* 密码
*/
@Field(type = FieldType.Text,store = true,index = false)
private String password;
/**
* 加密盐值
*/
@Field(type = FieldType.Text,store = true,index = false)
private String salt;
/**
* 邮箱
*/
@Field(type = FieldType.Text,store = true)
private String email;
/**
* 联系方式
*/
@Field(type = FieldType.Text,store = true)
private String phone;
/**
* 年龄:1男2女
*/
@Field(type = FieldType.Integer,store = true,index = false)
private Integer sex;
/**
* 年龄
*/
@Field(type = FieldType.Integer,store = true,index = false)
private Integer age;
/**
* 最后登录时间
*/
@Field(type = FieldType.Date,store = true,index = false)
private Date lastLoginTime;
/**
* 创建时间
*/
@Field(type = FieldType.Date,store = true,index = false)
private Date createdAt;
/**
* 是否删除:0=正常,1=删除
*/
@Field(type = FieldType.Boolean,store = true)
private Boolean archive;
}
新建一个接口,继承ElasticsearchRepository
public interface EsUserRepository extends ElasticsearchRepository<EsUser,Long> {
}
我这边是直接查询数据库,添加一些数据到es中
@Autowired
private EsUserRepository esUserRepository;
@Autowired
UserService userService;
@Override
public R userSaveAll() {
//查询数据
List<User> users = userService.selectByExample(Example.builder(User.class).andWhere(Sqls.custom()).build());
List<EsUser> esUsers = new ArrayList<>();
if (users!=null && users.size()>0){
for (User user : users){
EsUser esUser = new EsUser();
BeanUtils.copyProperties(user,esUser);
esUsers.add(esUser);
}
}
//插入所有
Iterable<EsUser> esUsersList = esUserRepository.saveAll(esUsers);
int result = 0;
//成功数量
Iterator<EsUser> iterator = esUsersList.iterator();
while (iterator.hasNext()){
result++;
iterator.next();
}
return R.success(result);
}
使用kibana查询一下全部是否都保存进来了
可以看到数据库里的数据都保存到es中了
这里再分享一个多条件查询的Java代码
public R findUserList(String name,String phone, Integer pageNum, Integer pageSize) {
//分页信息
Pageable pageable = PageRequest.of(pageNum, pageSize);
//创建查询条件生成器
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//分页
nativeSearchQueryBuilder.withPageable(pageable);
//匹配查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//过滤
if (StringUtils.isNotEmpty(name)){
//根据名称查询
MatchQueryBuilder userName = QueryBuilders.matchQuery("userName", name);
boolQueryBuilder.must(userName);
}
if (StringUtils.isNotEmpty(phone)){
//根据手机号查询
MatchQueryBuilder userName = QueryBuilders.matchQuery("phone", phone);
boolQueryBuilder.must(userName);
}
//过滤是否删除的用户
boolQueryBuilder.filter(QueryBuilders.matchPhraseQuery("archive", false));
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
//排序
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("createdAt").order(SortOrder.DESC));
//es查询
Page<EsUser> page = esUserRepository.search(nativeSearchQueryBuilder.build());
PageModel pageModel = new PageModel();
pageModel.setPage(pageNum);
pageModel.setSize(pageSize);
pageModel.setPageList(page.getContent());
pageModel.setTotal(Long.valueOf(page.getTotalElements()));
return R.success(pageModel);
}
三、常用的DSL命令
1、查询全部
GET _search
{
"query": {
"match_all": {}
}
}
2、条件查询
match:match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,将查询语句分词之后去匹配含有分词之后词语的。
term:不进行分词,直接完全匹配查询。
需要注意的是:如果你搜索的字段是keyword类型,那么无论match和term都是一样的,都不进行分词。
match_all的是一个空查询,就是查询索引类型下的所有文档。可以查询出所有文档之后在进行过滤等。
GET user/issue/_search
{
"query": {
"match": {
"userName":"张三"
}
}
}
3、多条件查询
bool可以用来实现多条件查询,bool包含的属性如下:
must:表示必须匹配的属性,匹配这些条件才能被包含进来
must_not:表示不能匹配这些条件才能被包含进来。
should :如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
filter :必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
需要特别注意的是: match不支持多条件查询,会提示 [match] query doesn’t support multiple fields, found [author] and [wordCount]"。
//查询用户带李的用户,排除id不为1的数据
GET user/issue/_search
{
"query": {
"bool": {
"must": [{
"match": {
"userName": "李"
}
}
],
"must_not": [{
"match": {
"id": "1"
}
}
]
}
}
}
4、分页排序
from:表示分页开始的条数(也是从0开始),size表示你要查询的数量。
sort:排序的字段,根据哪个字段进行如何排序。
//查询全部分页根据id排序
GET _search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 10,
"sort": [
{
"id": {
"order": "asc"
}
}
]
}