正排索引:
id | 内容 |
---|---|
1001 | my name is zhangsan |
1002 | my name is lisi |
倒排索引
关键字 | id |
---|---|
name | 1001,1002 |
zhangsan | 1001 |
Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。 为了方便理解,将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比
ES 里的 Index 可以看做一个库,而 Types 相当于表, Documents 则相当于表的行。这里 Types 的概念已经被逐渐弱化, Elasticsearch 6.X 中,一个 index 下已经只能包含一个type, Elasticsearch 7.X 中, Type 的概念已经被删除了。
http://127.0.0.1:9200/索引名
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "shopping"
}
http://127.0.0.1:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open shopping 69i42NtGSj6-XodFEpLSRA 1 1 0 0 225b 225b
http://127.0.0.1:9200/索引名
{
"shopping": {
"aliases": {},
"mappings": {},
"settings": {
"index": {
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_content"
}
}
},
"number_of_shards": "1",
"provided_name": "shopping",
"creation_date": "1652604498474",
"number_of_replicas": "1",
"uuid": "69i42NtGSj6-XodFEpLSRA",
"version": {
"created": "8020099"
}
}
}
}
}
向 ES 服务器发 DELETE 请求 : http://127.0.0.1:9200/shopping
{
"acknowledged": true
}
假设索引已经创建好,接下来创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式
向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/索引名/_doc,请求体JSON内容为:
{
"title":"数学",
"name":"张三",
"score":87.5
}
返回数据:
{
"_index": "shopping",
"_id": "fYH3xoABWQ3IY6RmLqXh",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
上面的数据创建后,由于没有指定数据唯一性标识(ID),默认情况下, ES 服务器会随机生成一个。
如果想要自定义唯一性标识,需要在创建时指定: http://127.0.0.1:9200/索引名/_doc/id值
,请求体JSON内容为:
{
"_index": "shopping",
"_id": "2",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
注意:如果增加数据时明确数据主键,那么请求方式也可以为 PUT
和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖
http://127.0.0.1:9200/索引名/_update/id值
{
"doc": {
要修改的内容
}
}
响应结果:{
"_index": "shopping",
"_type": "_doc",
"_id": "1",
"_version": 3,
"result": "updated",//<-----------updated 表示数据被更新
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。
DELETE 请求 : http://127.0.0.1:9200/索引名/_doc/id值
{
"_index": "shopping",
"_type": "_doc",
"_id": "1",
"_version": 4,
"result": "deleted",//<---删除成功
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4,
"_primary_term": 1
}
查询全部文档:GET 请求 : http://127.0.0.1:9200/索引名/_search
根据id查询:GET 请求 : http://127.0.0.1:9200/索引名/_doc/id值
url传参 查询李四的数据
http://127.0.0.1:9200/shopping/_search?q=name:李四
请求体传参,查询李四的数据
http://127.0.0.1:9200/索引名/_search
,请求体:{
"query":{
"match":{
"name":"李四"
}
}
}
GET请求,http://127.0.0.1:9200/shopping/_search
,请求体:
{
"query":{
"match_all":{} // 表示查询全部
},
"_source":["title"] // title:字段名称
}
GET请求 : http://127.0.0.1:9200/索引名/_search
,附带JSON体如下:
// 查询数学英语成绩,每页2条,根据成绩排序
{
"query": {
//"match_all":{}, // 表示查询全部
"bool": {
"should": [// should 相当于数据库中的 || (或)
{
"match": {"title": "数学"}
},
{
"match": {"title": "英语"}
}
]
}
},
"sort": {
"score": { // 字段名
"order": "desc" // 降序
}
},
"from": 0, // 第几页
"size": 2 // 每页条数
}
http://127.0.0.1:9200/索引名/_search
,附带JSON体如下:// 查询李四的英语成绩
{
"query":{
"bool":{
"must":[ // must:相当于 &&(与)
{"match":{"title":"英语"}},
{"match":{"name":"张三"}}
]
}
}
}
http://127.0.0.1:9200/索引名/_search
,附带JSON体如下:// 查询英语成绩大于60 的信息
{
"query":{
"bool":{
"must":[ // must:相当于 &&(与)
{"match":{"title":"英语"}}
],
"filter":{
"range":{
"score":{
"gt":60
}
}
}
}
}
}
http://127.0.0.1:9200/shopping/_search
,{
"query":{
"match_phrase":{
"title" : "英"
}
}
}
http://127.0.0.1:9200/shopping/_search
{
"aggs": { // 聚合操作
"score_group": { // 分组名
"terms": { // 分组
"field": "score" // 分组字段
}
}
}
}
http://127.0.0.1:9200/shopping/_search
{
"aggs": { // 聚合操作
"score_group": { // 分组名
"avg": { // 平均值
"field": "score" // 分组字段
}
}
}
}
有了索引库,等于有了数据库中的 database。
接下来就需要建索引库(index)中的映射了,类似于数据库(database)中的表结构(table)。
创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)。
创建一个索引: http://127.0.0.1:9200/user
创建映射
{
"properties": {
"name":{
"type": "text",
"index": true // 存在索引:可全文检索
},
"sex":{
"type": "keyword", // 关键字:查询时不允许分割
"index": true
},
"tel":{
"type": "keyword",
"index": false // 不建立索引:不能根据该字段查询
}
}
}
RestHighLevelClient 的方法 | 功能 |
---|---|
,indices().** | 操作索引 |
index().** | 添加文档 |
.update() | 修改文档 |
get() | 查询文档 |
delete() | 删除文档 |
bluck() | 批量操作文档 |
坐标
<dependencies>
<dependency>
<groupId>org.elasticsearchgroupId>
<artifactId>elasticsearchartifactId>
<version>7.8.0version>
dependency>
<dependency>
<groupId>org.elasticsearch.clientgroupId>
<artifactId>elasticsearch-rest-high-level-clientartifactId>
<version>7.8.0version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-apiartifactId>
<version>2.8.2version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-coreartifactId>
<version>2.8.2version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.9version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
测试链接
@Test
void test1() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
System.out.println(client); // 连接成功
client.close();
}
@Test
void testCreateIndex() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
CreateIndexRequest request = new CreateIndexRequest("user3"); //索引名
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT); // 创建
boolean acknowledged = response.isAcknowledged();
System.out.println("操作状态:"+acknowledged);
client.close();
}
@Test
void testGetIndex() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
GetIndexResponse response = client.indices().get(new GetIndexRequest("user"), RequestOptions.DEFAULT);
client.close();
}
@Test
void testDelIndex() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
AcknowledgedResponse response = client.indices().delete(new DeleteIndexRequest("user3"), RequestOptions.DEFAULT);
System.out.println("删除结果:"+response.isAcknowledged());
client.close();
}