一、Elasticsearch 简介
Elasticsearch
基于Lucene
。
- 设计用途:用于分布式全文检索。
- 技术支持:通过
HTTP
使用JSON
进行数据索引。
1. Elasticsearch 注解
Spring Data
通过注解来声明字段的映射属性。
@Document
注解:作用在类,标记实体类为文档对象。
indexName
:对应索引库名称。type
:对应在索引库中的类型。useServerConfiguration
:使用服务器配置,不会自动建索引库。shards
:分片数量(默认5
)。replicas
:副本数量(默认1
)。refreshInterval
:indexStoreType
:createIndex
:是否自动创建索引库。
@Id
注解:作用在成员变量,标记一个字段作为Id
主键。
@Field
注解:作用在成员变量,标记为文档的字段,并指定字段映射属性。
type
:字段类型,是枚举FieldType
,可以是text、long、short、date、integer、object
等。
FieldType.Text
:存储数据时候,会自动分词,并生成索引。FieldType.Keyword
:存储数据时候,不会分词建立索引。
Numerical
:数值类型,分两类。
- 基本数据类型:
long、integer、short、byte、double、float、half_float
。- 浮点数的高精度类型:
scaled_float
。
需要指定一个精度因子,比如10
或100
,Elasticsearch
会把真实值乘以这个因子后存储,取出时再还原。
FieldType.Date
:日期类型。
Elasticsearch
可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long
节省空间。
index
:是否索引,布尔类型(默认:true
)。format
:pattern
:store
:是否存储,布尔类型(默认:false
)。fielddata
:searchAnalyzer
:分词搜索。analyzer
:分词器名称(ik_max_word
:即使用ik
分词器)。ignoreFields
:includeInParent
:
2. Elasticsearch—API
比如:方法名
findByTitle
,表示根据title
查询,然后自动完成,无需写实现类。
Keyword | Sample |
---|---|
And | findByNameAndPrice |
Or | findByNameOrPrice |
Is | findByName |
Not | findByNameNot |
Between | findByPriceBetween |
LessThanEqual | findByPriceLessThan |
GreaterThanEqual | findByPriceGreaterThan |
Before | findByPriceBefore |
After | findByPriceAfter |
Like | findByNameLike |
StartingWith | findByNameStartingWith |
EndingWith | findByNameEndingWith |
Contains/Containing | findByNameContaining |
In | findByNameIn(Collectionnames) |
NotIn | findByNameNotIn(Collectionnames) |
Near | findByStoreNear |
True | findByAvailableTrue |
False | findByAvailableFalse |
OrderBy | findByAvailableTrueOrderByNameDesc |
3. 支持 Lucene
的查询方法
// 布尔查询(可以用来组合多个查询条件)
// must 条件必须成立 and、
// must not 条件必须不成立 not、
// should 条件可以成立 or
QueryBuilders.boolQuery();
// 相似度查询
QueryBuilders.fuzzyQuery();
// 查询所有数据
QueryBuilders.matchAllQuery();
// 正则表达式查询
QueryBuilders.regexpQuery();
// 词条查询
QueryBuilders.termQuery();
// 模糊查询
QueryBuilders.wildcardQuery();
4. Elasticsearch 的查询方法
// 对所有字段进行分词查询
QueryBuilders.queryStringQuery("全面");
// 只查询 content 里包含全文的内容(模糊查询:*任意字符串、?任意单个字符)
QueryBuilders.wildcardQuery("content", "*全文*");
// 只查询 content 词条为 "搜索" 的内容
QueryBuilders.termQuery("content", "搜索");
二、Elasticsearch 命令
1. 查看索引大小
curl -X GET http://localhost:9200/_cat/indices?v
- 索引名称,索引中文档总数, 索引占用磁盘空间大小,主分片占用磁盘空间大小。
2. 删除单条数据
POST http://localhost:9200/{index_name}/_delete_by_query
# body
{
"query":{
"term":{
"_id":4043
}
}
}
3. 清空索引数据
POST http://localhost:9200/{index_name}/_delete_by_query
# body
{
"query": {
"match_all": {}
}
}
curl -XPOST -H "Content-Type: application/json" http://localhost:9200/log/_delete_by_query -d '{"query": {"match_all": {} }}'
curl -XPOST -H "Content-Type: application/json" http://localhost:9200/log/_delete_by_query?refresh&slices=10&scroll_size=10000" -d
'{"query": {"bool": {"must": [
{
"range": {
"'${daycolumn}'": { "lt": "'${savedayago}'"}
}
}
]}}}'
curl -XDELETE http://localhost:9200/*-'2022.01.01'
curl -XDELETE http://localhost:9200/log-'2022.01.01'
4. 清空多个索引数据
POST http://localhost:9200/{index1_name},{index2_name}/_delete_by_query
# body
{
"query": {
"match_all": {}
}
}
5. 设置非只读
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/log/_settings -d '{"index.blocks.read_only_allow_delete": null}'