ElasticSearch入门及进阶(持续更新中)

ElasticSearch入门

1. 倒排索引

  • 正排索引:

    id 内容
    1001 my name is zhangsan
    1002 my name is lisi
  • 倒排索引

    关键字 id
    name 1001,1002
    zhangsan 1001

Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。 为了方便理解,将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比
ElasticSearch入门及进阶(持续更新中)_第1张图片
ES 里的 Index 可以看做一个库,而 Types 相当于表, Documents 则相当于表的行。这里 Types 的概念已经被逐渐弱化, Elasticsearch 6.X 中,一个 index 下已经只能包含一个type, Elasticsearch 7.X 中, Type 的概念已经被删除了。

2. 索引-增删查

2.1 添加索引

  • 对比关系型数据库,创建索引就等同于创建数据库。
  • 向ES 服务器发 PUT 请求 : http://127.0.0.1:9200/索引名
    成功后返回数据
    {
       "acknowledged": true,
       "shards_acknowledged": true,
       "index": "shopping"
    }
    

2.2 查询索引

  • 查询全部索引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
    
    
  • ES 服务器发送 GET 请求: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"
                    }
                }
            }
        }
    }
    

2.3 删除索引

向 ES 服务器发 DELETE 请求 : http://127.0.0.1:9200/shopping

{
    "acknowledged": true
}

3. 文档-增删改

3.1 创建文档

  • 假设索引已经创建好,接下来创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 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

3.3 修改文档

3.3.1 全局修改

和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖

3.3.2 局部修改
  • POST 请求 : 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
    }
    
    

3.4 删除文档

  • 删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。

  • 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
    }
    
    

4. 简单查询

4.1 查询全部及根据id查询

  • 查看文档时,需要指明文档的唯一性标识,类似于 MySQL 中数据的主键查询
  1. 查询全部文档:GET 请求 : http://127.0.0.1:9200/索引名/_search

  2. 根据id查询:GET 请求 : http://127.0.0.1:9200/索引名/_doc/id值

4.2 单条件查询

  1. url传参 查询李四的数据

    • 向服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search?q=name:李四
  2. 请求体传参,查询李四的数据

    • GET请求 http://127.0.0.1:9200/索引名/_search,请求体:
      {
      	"query":{
      		"match":{
      			"name":"李四"
      		}
      	}
      }
      

5. 复杂查询

4.2.1 查询指定字段

GET请求,http://127.0.0.1:9200/shopping/_search,请求体:

{
	"query":{
		"match_all":{} // 表示查询全部
	},
	"_source":["title"] // title:字段名称
}

4.2.2 或查询、分页、排序

  • 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 // 每页条数
    }
    
    

4.2.2 与查询

  • GET请求 : http://127.0.0.1:9200/索引名/_search,附带JSON体如下:
    // 查询李四的英语成绩
    {
        "query":{
            "bool":{
                "must":[ // must:相当于 &&(与)
                    {"match":{"title":"英语"}},
                    {"match":{"name":"张三"}}
                ]
            }
        }
    }
    

4.2.3 范围查询

  • GET请求 : http://127.0.0.1:9200/索引名/_search,附带JSON体如下:
    // 查询英语成绩大于60 的信息
    {
        "query":{
            "bool":{
                "must":[ // must:相当于 &&(与)
                    {"match":{"title":"英语"}}
                ],
                "filter":{
            	"range":{
                	"score":{
                    	"gt":60
                	}
                }
    	    }
            }
        }
    }
    

4.2.4 完全匹配

  • 在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search
    {
    	"query":{
    		"match_phrase":{
    			"title" : "英"
    		}
    	}
    }
    
    

6. 聚合操作

6.1 分组

  • GET请求 : http://127.0.0.1:9200/shopping/_search
{
    "aggs": { // 聚合操作
        "score_group": { // 分组名
            "terms": { // 分组
                "field": "score" // 分组字段 
            }
        }
    }
}

6.2 平均值

  • GET请求 : http://127.0.0.1:9200/shopping/_search
{
    "aggs": { // 聚合操作
        "score_group": { // 分组名
            "avg": { // 平均值
                "field": "score" // 分组字段 
            }
        }
    }
}

7. 映射关系

  • 有了索引库,等于有了数据库中的 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	// 不建立索引:不能根据该字段查询
            }
        }
    }
    
    

Java API

方法概览

RestHighLevelClient 的方法 功能
,indices().** 操作索引
index().** 添加文档
.update() 修改文档
get() 查询文档
delete() 删除文档
bluck() 批量操作文档

1. 环境

坐标

 <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();

    } 

2. 操作索引

1. 添加

  • @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();
        }
    
    

2. 查询

  • @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();
        }
    
    

3. 删除

  • @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();
        }
    

3. 操作文档

3.1 添加

3.2 修改

3.3 查询

你可能感兴趣的:(elasticsearch,学习,搜索引擎)