1、Kibana指令说明
1.1 查询索引
查询所有索引
GET _cat/indices
查询索引mapper
GET gov_search_web/_mapper
查询索引配置
GET government_governmentsearch/_settings
1.2 创建索引
DELETE /gov_search_web3
PUT /gov_search_web3
{
"mappings": {
"question": {
"properties": {
"id": {
"type": "keyword"
},
"question": {
"type": "text"
},
"answer": {
"type": "text"
},
"updateTime": {
"type": "long"
}
}
}
}
}
1.3 查询指定索引下的所有数据
GET gov_search_web/nlp/_search
{
"query": {
"match_all": {}
}
}
1.4 精确查询索引下的数据
GET government_governmentsearch/governmentsearch/_search
{
"query": {
"term": {
"category": "07"
}
}
}
1.5 精确查询多个值
GET government_governmentsearch/governmentsearch/_search
{
"query": {
"terms": {
"category": ["01", "07"]
}
}
}
1.6 条件删除文档
POST government_governmentsearch/governmentsearch/_delete_by_query
{
"query": {
"match": {"id": "ff80808160179faa016024c8b4ac60bc"}
}
}
1.7 多条件查询
GET government_governmentsearch/governmentsearch/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"category": "07"
}
},
{
"match": {
"title": "公积金提取"
}
}
]
}
}
}
1.8 插入数据
POST gov_yiqing/xqjkzkdj/123
{
"id": "123",
"name": "111",
"gender": "1",
"mobile": "15001233210",
"idCard": "111111222233334444"
}
1.9 备份索引到一个新索引中去
创建新索引
迁移老索引的数据到新索引中
POST _reindex
{
"source": {
"index": "index_old"
},
"dest": {
"index": "index_old_new"
}
}
1.10 查询非空和排序
GET akm_show_his/_search
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "jzdCityCode"
}
}
}
},
"sort": [
{
"createTime": {
"order": "desc"
}
}
]
}
2、 索引及索引模板
2.1 索引模板
属性 | 说明 |
order | 当存在多个索引模板时并且某个索引两者都匹配时,settings和mpapings将合成一个配置应用在这个索引上。合并的顺序可由索引模板的order属性来控制。 |
index_patterns | 索引前缀 |
total_shards_per_node | 每个节点的分片数,最多设置为3个 |
refresh_interval | 每个索引的刷新频率,刷新间隔为 |
number_of_shards | 总分片数,节点数乘3 |
translog.flush_threshold_size | 当事务日志大小到达此预设值,则执行flush。(默认512mb) |
translog.sync_interval | translog多久被同步到磁盘并提交一次,默认5秒。 |
translog.durability | 是否在每次index,delete,update,bulk请求之后立即同步并提交translog:
|
slowlog | 慢日志阈值设置 |
注意:Elasticsearch7.X 移除了类型(type),使用的是默认的_doc
PUT _template/akm_template
{
"order": 0,
"index_patterns": [
"akm*"
],
"settings": {
"index": {
"routing": {
"allocation": {
"total_shards_per_node": "3"
}
},
"refresh_interval": "30s",
"number_of_shards": "9",
"translog": {
"flush_threshold_size": "256mb",
"sync_interval": "30s",
"durability": "async"
},
"indexing": {
"slowlog": {
"threshold": {
"index": {
"warn": "100ms",
"debug": "20ms",
"info": "30ms"
}
}
}
},
"search": {
"slowlog": {
"threshold": {
"fetch": {
"warn": "500ms",
"debug": "100ms",
"info": "200ms"
},
"query": {
"warn": "2s",
"debug": "500ms",
"info": "1s"
}
}
}
}
}
},
"mappings": {},
"aliases": {}
}
2.2、索引
DELETE akm_show_his
PUT /akm_show_his
{
"mappings":{
"properties":{
"id":{
"type":"keyword"
},
"userName":{
"type":"text"
},
"idCardNo":{
"type":"text"
},
"userPhone":{
"type":"text"
} "type":"text"
},
"createTime":{
"type":"long"
}
}
}
}
3、项目集成ES说明
3.1 升级springboot版本
对于Elasticsearch7.X版本,需要升级springboot版本在2.2.0以上
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
3.2 引入elasticsearch依赖
在pom文件中,添加Elasticsearch依赖
<!-- 集成es -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
3.3 增加配置文件
Elasticsearch有两种连接方式:transport、rest。transport通过TCP方式访问ES(只支持java),rest方式通过http API 访问ES(没有语言限制)。
Elasticsearch7.X版本不建议使用transport方式,在8.X的版本中将要废弃。
在配置文件的时候,就需要配置ES的http端口,如下:
# ----- es配置 -----------
elasticsearch:
rest:
uris: ip1:port1,ip2:port2,ip3:port3 #es连接的http地址端口
connection-timeout: 6s #连接超时
3.4 Dto类
@Data
@Document(indexName = "#{indexConfig.showIndexName}", type = "_doc")
public class EsShowHisDto {
@Id
@Field(type = FieldType.Keyword)
private String id;
@Field(type = FieldType.Text)
private String userName;
/**
* 证件号码
*/
@Field(type = FieldType.Text)
private String idCardNo;
/**
* 手机号
*/
@Field(type = FieldType.Text)
private String userPhone;
/**
* 现居住地
*/
@Field(type = FieldType.Text)
private String addressNow;
/**
* 健康状态
*/
@Field(type = FieldType.Text)
private String healthStatus;
/**
* 创建时间
*/
@Field(type = FieldType.Long)
private Long createTime;
/**
* 健康信息表id
*/
@Field(type = FieldType.Text)
private String healthId;
/**
* 经度
*/
@Field(type = FieldType.Text)
private String longitudeNum;
/**
* 纬度
*/
@Field(type = FieldType.Text)
private String latitudeNum;
/**
* 编码
*/
@Field(type = FieldType.Text)
private String adminDiv;
/**
* 居住地区县CODE
*/
@Field(type = FieldType.Text)
private String jzdQxCode;
/**
* 居住地街道CODE
*/
@Field(type = FieldType.Text)
private String jzdJdCode;
/**
* 居住地社区CODE
*/
@Field(type = FieldType.Text)
private String jzdSqCode;
/**
* 来源地省CODE
*/
@Field(type = FieldType.Text)
private String lydProvCode;
/**
* 来源地市CODE
*/
@Field(type = FieldType.Text)
private String lydCityCode;
/**
* 来源地区县CODE
*/
@Field(type = FieldType.Text)
private String lydQxCode;
/**
* 来源地街道CODE
*/
@Field(type = FieldType.Text)
private String lydJdCode;
/**
* 来源地社区CODE
*/
@Field(type = FieldType.Text)
private String lydSqCode;
@Field(type = FieldType.Text)
private String curHealthStatus;
@Field(type = FieldType.Text)
private String belongarea;
/**
* 是否删除 1:是 0:否
*/
@Field(type = FieldType.Text)
private String isDelete;
/**
* 居住地市级CODE
*/
@Field(type = FieldType.Text)
private String jzdCityCode;
}
3.5 Dao类
public interface EsShowHisDao extends ElasticsearchRepository<EsShowHisDto, String> {
}
3.6 Service类
查询ES数据
BoolQueryBuilder : 聚合分组查询
SortBuilder :排序,unmapped_type不设置时,如果source中不包含createTime元素,查询会返回错误信息,设置时,可以使用默认值填充
Pageable :分页
@Override
public PageResultBean<EsShowHisDto> queryFromEs(EsQueryDto esQueryDto) {
// 查询
BoolQueryBuilder query = handleParam(esQueryDto);
// 排序
SortBuilder sortBuilder = SortBuilders.fieldSort("createTime").unmappedType("long").order(SortOrder.DESC);
// 分页
int pageNum = esQueryDto.getPageNum() == null ? 0 : esQueryDto.getPageNum();
int pageSize = (esQueryDto.getPageSize() == null || esQueryDto.getPageSize()>100) ? 10 : esQueryDto.getPageSize();
Pageable pageable = PageRequest.of(pageNum, pageSize);
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(query).withSort(sortBuilder).withPageable(pageable).build();
//查询结果
Page<EsShowHisDto> searchPageResults = esShowHisDao.search(searchQuery);
return new PageResultBean<>(searchPageResults);
}
删除ES数据
批量删除ES里的数据,需要先通过条件查询出来,再进行删除操作。
ES索引有个设置max_result_window,默认是10000,最多删除一万条数据。
@Override
public String deleteFromEs(EsShowHisDto esShowHisDto, String areYouSure) {
if (esShowHisDto == null) {
return "param empty";
}
// 查询
BoolQueryBuilder query = QueryBuilders.boolQuery();
if (StringUtils.isNotEmpty(esShowHisDto.getIdCardNo())) {
query.must(QueryBuilders.termQuery("idCardNo", esShowHisDto.getIdCardNo()));
}
if (StringUtils.isNotEmpty(esShowHisDto.getId())) {
query.must(QueryBuilders.termQuery("id", esShowHisDto.getId()));
}
if (StringUtils.isNotEmpty(esShowHisDto.getBelongarea())) {
query.must(QueryBuilders.termQuery("belongarea", esShowHisDto.getBelongarea()));
}
//查询结果
Iterable<EsShowHisDto> iterable = esShowHisDao.search(query);
esShowHisDao.deleteAll(iterable);
return "success";
}
6.7 动态索引
1、创建索引模板,保证所有以akm为前缀的索引都有相同的setting。
2、索引Dto里面的indexName设置动态配置
@Document(indexName = "#{indexConfig.showIndexName}", type = "_doc")
public class EsShowHisDto {
@Id
@Field(type = FieldType.Keyword)
private String id;
@Field(type = FieldType.Text)
private String userName;
3、添加索引名的配置类,设置默认值
@Data
@Component
public class IndexConfig {
@Value("${akm.esIndex.showHis:akm_show_his}")
private String showIndexName;
@Value("${akm.esIndex.inoutHis:akm_inout_his}")
private String inoutIndexName;
@Value("${akm.esIndex.checkHis:akm_check_his}")
private String checkIndexName;
}
4、在往ES里插入数据的时候,通过set配置类IndexConfig的索引名的值,来实现动态的往不同的索引里插入数据。索引的数据结构一致,若索引在ES里不存在,则会新增。