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

每个索引的刷新频率,刷新间隔为-1代表关闭数据刷新。

number_of_shards

总分片数,节点数乘3

translog.flush_threshold_size

当事务日志大小到达此预设值,则执行flush。(默认512mb)

translog.sync_interval

translog多久被同步到磁盘并提交一次,默认5秒。

translog.durability

是否在每次index,delete,update,bulk请求之后立即同步并提交translog:

  • request  :(默认)fsync and commit after every request。这就意味着,如果发生崩溃,那么所有只要是已经确认的写操作都已经被提交到磁盘。
  • async  :在后台每sync_interval时间进行一次fsync和commit。意味着如果发生崩溃,那么所有在上一次自动提交以后的已确认的写操作将会丢失。

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里不存在,则会新增。