ElasticSearch搜索引擎

101 阅读6分钟

起步

es的数据传输格式为json,

创建索引

利用postman等工具,发送put请求,并遵守restful风格

http://ip/shopping,其中shopping即为创建的索引,请求方式为PUT

  • es支持的请求方式有[GET,DELETE,PUT,HEAD],POST请求方式不具有幂等性,不能使用
  • GET请求获取索引信息http://ip/shopping
  • 查看索引的具体信息 http://ip/shopping/_cat/indcies?v
  • DELETE删除索引http://ip/shopping

创建文档

利用POST请求在索引中创建文档

  • http://ip/shopping/_doc,并且请求题体格式为Raw,数据格式为Json
  • 也可以后面跟上文档的id: http://ip/shopping/_doc/id,PUT请求可采取此方式创建文档

查询文档

  • 采用GET请求获取单个文档,http://ip/shopping/_doc/id
  • 利用GET请求获取某索引下的全部文档,http://ip/shopping/_search

更新文档

  • 利用post请求更新文档,可更新局部
http://ip:port/index/_update/id

# 请求体
{
"doc":{
"name":"ymj",
"age":"20"
}
}
  • 利用put请求更新文档,可进行全局更新
http://ip:port/index/_doc/id
# 请求体
{
"adress":"jiangxi",
"area":"china"
}

查询文档

  • 条件查询通过路径
http://ip:port/test/_search?q=address:jiangxi

q=key:value

​ 对象形式可通过object.key:value进行匹配

  • 条件查询通过请求体
http://ip:port/test/_search

请求体

//查询部分doc,只显示单条数据
{
  "query":{
      "match":{
          "address":"jiangxi"
      }
  }
}
//查询全部doc
{
  "query":{
      "match_all":{//匹配全部
      }
      },
      "from":0,//分页查询的起始页
      "size":2,//每页的显示条数
      "_source":["address","area"],//显示的内容key
      "sort":{//进行排序
          "area":{//排序的字段
              "order":"desc"//排序的方式,采用降序
          }
      }
}	

条件匹配查询

{
  "query":{
    "bool":{//可设置多个匹配条件
        "must":[
            {
                "match":{//一个match只能添加一个条件
                    "address":"jiangxi"
                }
            }
        ],
        "filter":{//过滤器
            "range":{
                "price":{
                    "gt":5000//gt大于,lt小于
                }
            }
        }
    }
  }
}    

聚合查询

//分组
{
    "aggs":{//聚合操作
    "price_group":{//名称,可任意
    "terms":{//分组
    "field":"price" //分组字段
}
}
}
}

//平均值
{
   "aggs":{//聚合值
 	"price_avg":{//任意名称
        "avg":{//平均值
            field:"price"//分组字段
        }
    }
}
}

映射关系_mapper

请求方式

http:/ip:port/index/_mapping-GET

json
{
    "properties":{
        "name":{
            "type":"text",//设置为文本,可被拆分
            "index":true//设置为可被检索
        },
        "sex":{
            "type":"keyword",
            "index":true
        },
        "tel":{
            "type":"keyword",//设置为关键词,不可被拆分
            "index":"false"//设置不被索引
        }
    }
}

java客户端API

引入依赖Maven

		<!--  导入elasticsearch低级客户端依赖  -->
        <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.12.1</version>
        </dependency>
        <!--    elasticsearch高级客户端依赖    -->
        <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.12.1</version>
        </dependency>

        <!--   jackson依赖    -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>
        <!-- 日志依赖 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

索引

索引创建

 		//创建高级es客户端对象
        RestHighLevelClient restHighLevelClient =
                new RestHighLevelClient(RestClient.builder(new HttpHost("ip", 9200)));
        //创建索引请求对象
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("user");
        //创建索引响应对象
        CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
        //获取响应结果
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println(acknowledged ? "操作成功!" : "操作失败!");

查看索引

		//创建高级es客户端对象
        RestHighLevelClient restHighLevelClient =
                new RestHighLevelClient(RestClient.builder(new HttpHost("ip", 9200)));
        //创建索引删除请求对象
        GetIndexRequest request = new GetIndexRequest("user");
        //创建删除索引响应对象
        GetIndexResponse getIndexResponse = restHighLevelClient.indices().get(request, RequestOptions.DEFAULT);
        //获取删除缩印响应结果
        System.out.println(getIndexResponse.getAliases());
        System.out.println(getIndexResponse.getSettings());
        System.out.println(Arrays.toString(getIndexResponse.getIndices()));

删除索引

		//创建高级es客户端对象
        RestHighLevelClient restHighLevelClient =
                new RestHighLevelClient(RestClient.builder(new HttpHost("ip", 9200)));
        //创建索引删除请求对象
        DeleteIndexRequest DeleteUser = new DeleteIndexRequest("user");
        //创建删除索引响应对象
        AcknowledgedResponse delete = restHighLevelClient.indices().delete(DeleteUser, RequestOptions.DEFAULT);
        //获取删除缩印响应结果
        boolean acknowledged = delete.isAcknowledged();
        System.out.println(acknowledged ? "操作成功!" : "操作失败!");

文档doc

  • 文档的单个创建使用IndexRequest,客户端对象采用index方法。批量插入可使用BulkRequest添加IndexRequest对象,客户端采用bulk方法,注意source的使用,要求键值对
  • 文档的修改使用updateRequest,客户端对象采用update方法。
  • 文档的删除使用deleteRequest,客户端采用delete方法。批量删除可使用BulkRequest添加deleteRequest对象,客户端采用bulk方法
  • 文档的查询使用GetRequest,客户端采用get方法。

创建

		//创建高级es客户端对象
        RestHighLevelClient restHighLevelClient =
                new RestHighLevelClient(RestClient.builder(new HttpHost("ip", 9200)));
        //创建索引请求对象
        IndexRequest request = new IndexRequest();
        request.index("user").id("21112135");//设置索引和id
        //获取ObjectMapper序列化工具-jackson依赖
        ObjectMapper objectMapper = new ObjectMapper();
        student student = new student();
        student.setAge(21);
        student.setName("tangzhifeng");
        String studentJson = objectMapper.writeValueAsString(student);//将对象序列化为json对象
        request.source(studentJson, XContentType.JSON);//设置请求体和内容
        IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);
        System.out.println(indexResponse.getResult());
批量插入
//创建高级es客户端对象
        RestHighLevelClient restHighLevelClient =
                new RestHighLevelClient(RestClient.builder(new HttpHost("ip", 9200)));
        //批量插入文档
        BulkRequest request = new BulkRequest();
        //进行批量插入
        //数据填入键值对,需两两配对,键key为String,键值value为Object
        request.add(new IndexRequest().index("user").id("200").source(XContentType.JSON, "name", "tzf", "age", 21));
        request.add(new IndexRequest().index("user").id("201").source(XContentType.JSON, "name", "dmc", "age", 22));
        request.add(new IndexRequest().index("user").id("202").source(XContentType.JSON, "name", "zh", "age", 21));
        request.add(new IndexRequest().index("user").id("203").source(XContentType.JSON, "name", "fgy", "age", 22));
        request.add(new IndexRequest().index("user").id("204").source(XContentType.JSON, "name", "mother", "age", 18));
        //注入
        BulkResponse bulk = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(bulk.hasFailures());//输出批量插入的结果
        //释放资源
        restHighLevelClient.close();

修改

		//创建高级es客户端对象
        RestHighLevelClient restHighLevelClient =
                new RestHighLevelClient(RestClient.builder(new HttpHost("ip", 9200)));
        //创建修改请求对象
        UpdateRequest request = new UpdateRequest();
        request.index("user").id("21112135");//设置索引和id
        //修改文档,设置修改信息
        request.doc(XContentType.JSON, "name", "ymj", "age", 20);
        UpdateResponse update = restHighLevelClient.update(request, RequestOptions.DEFAULT);//注入至es客户端
        DocWriteResponse.Result result = update.getResult();//获取修改结果
        System.out.println(result);//响应成功!

删除

		//创建高级es客户端对象
        RestHighLevelClient restHighLevelClient =
                new RestHighLevelClient(RestClient.builder(new HttpHost("ip", 9200)));
        //创建修改请求对象
        DeleteRequest request = new DeleteRequest();
        request.index("user").id("21112135");//设置索引和id
        //删除文档
        DeleteResponse delete = restHighLevelClient.delete(request, RequestOptions.DEFAULT);//注入request
        System.out.println(delete.toString());
批量删除
		//创建高级es客户端对象
        RestHighLevelClient restHighLevelClient =
                new RestHighLevelClient(RestClient.builder(new HttpHost("ip", 9200)));
        //创建批量化请求对象
        BulkRequest request = new BulkRequest();
        request.add(new DeleteRequest().index("user").id("200"));//添加删除request
        request.add(new DeleteRequest().index("user").id("201"));
        BulkResponse bulk = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(bulk.getTook());//删除所花费的时间
        System.out.println(bulk.hasFailures());//判断是否删除失败
        restHighLevelClient.close();//资源释放

获取查询

高级查询:

024-入门-JavaAPI-文档-高级查询-全量查询_哔哩哔哩_bilibili

		//创建高级es客户端对象
        RestHighLevelClient restHighLevelClient =
                new RestHighLevelClient(RestClient.builder(new HttpHost("ip", 9200)));
        //创建get请求对象
        GetRequest request = new GetRequest();
        request.index("user").id("21112135");//设置查询的索引和id
        //查询文档
        GetResponse getResponse = restHighLevelClient.get(request, RequestOptions.DEFAULT);//注入request
        System.out.println(getResponse.getSourceAsString());

启动es服务

切记,不要使用windows的docker桌面工具启动容器 ,通过命令行启动

如果启动成功后,无法访问页面:

请找/usr/share/elasticsearch/config/elasticsearch.yml该配置文件

修改如下配置:改为false

Snipaste_2023-07-14_11-19-03.png

首先先创建专有网络

docker network create esnet
# 在启动服务
docker run --name es  -p 9200:9200 -p 9300:9300  --network esnet -e "discovery.type=single-node" 8552a239ee1e

挂载数据卷

先创建好如下文件,用于挂载

安装分词器

# 进入容器内部
docker exec -it elasticsearch /bin/bash

# 在线下载并安装
./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

#退出
exit
#重启容器
docker restart elasticsearch

es集群

030-环境-Windows集群部署_哔哩哔哩_bilibili

官网文档

restful的api文档

[REST APIs | Elasticsearch Guide 8.8] | Elastic,整个restful的request文档

[搜索接口 |弹性搜索指南 8.8] |弹性的 (elastic.co) [Document APIs | Elasticsearch Guide 8.8] | Elastic,请求文档,包括创建索引,文档等request