ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ES elasticserch

2022-07-20 22:36:33  阅读:160  来源: 互联网

标签:elasticserch hotel client 文档 org import type ES


ES elasticserch

  • elasticserch 是一个开源的分布式搜索引擎,可以用来实现搜索,日志统计,分析,系统监控等功能

  • elastic stack (ELK)是以elasticsearch为核心的技术栈,包括beats,Logstash,kibana,elasticsearch

  • Lucene 是Apache的开源搜索引擎类库,提供了搜索引擎的核心API

正向索引和倒排索引

  • 文档和词条:

    *文档:每一条数据就是一个文档

    *词条:对文档中的内容分词,得到的词语就是词条

  • 正向索引

    *基于文档id创建索引,查询词条时必须找到文档,然后判断是否包含词条

  • 倒排索引

    *对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时现根据词条查询到文档id,而后获取到文档。

基本概念

  • 文档:一条数据就是一个文档,es中式json格式

  • 字段:json文档中的字段

  • 索引:同类型文档的集合

  • 映射:索引中文档的约束,比如字段名称,类型

  • elasticsearch与数据库的关系

    • 数据库负责事务类操作

    • elasticsearch负责海量数据的搜索,分析,计算

  • DSL 是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD,

    实现的是Rest风格接口,任何语言可以发HTTP请求,都可以接收DSL

分词器

  • 分词器的作用:

    • 创建倒排索引时对文档分词

    • 用户搜索时,对输入的内容分词

  • IK分词器有几种模式?

    • ik_smart :智能切分,粗粒度

    • ik_max_word: 最细切分,细粒度

  • Ik分词器如何扩展词条?如何停用词条

    • 利用config目录IkAnalyzer.cfg.xml文件添加扩展词典和停用词典

    • 在词典中添加扩展词和停用词条

    • 重启docker

mapping属性

  • mapping常见属性有哪些/

    • type : 数据类型

    • index : 是否索引,默认true

    • analyzer : 分词器

    • properties :子字段

  • type常见的有哪些/

    • 字符串 :text ,keyword(不需要分)

    • 数字:long,integer ,short,byte,double, float

    • 布尔 :boolean

    • 日期 :date

    • 对象 :object

索引库操作

  • 创建索引库 :PUT /索引库名

  • 查询索引库 :GET /索引库名

  • 删除索引库 : DELETE /索引库名

  • 添加索引库 : PUT /索引库名/_mapping

文档操作

  • 创建文档 :PSOT /索引库名 /_doc /文档id {json文档}

  • 查询文档 :GET /索引库名 /_doc /文档id

  • 删除文档 :DELETE /索引库名 /_doc /文档id

  • 修改文档 :

    • 全量修改 : PUT /索引库名 /_doc/文档id {json文档}

    • 增量修改:PSOT /索引库名 /_update /文档id {“doc”:{字段}}

RestClient操作索引库

  • 官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html

  • 导包

        //要指定版本号,因为springBoot 中指定的版本不一致
      <properties>
          <elasticsearch.version>7.12.1</elasticsearch.version>
      </properties>

          <!--elasticsearch :client-->
          <dependency>
              <groupId>org.elasticsearch.client</groupId>
              <artifactId>elasticsearch-rest-high-level-client</artifactId>
          </dependency>
  • 索引表

    package cn.itcast.hotel.constants;

    public class HotelIndexConstants {
       public static final String MAPPING_TEMPLATE =
               "{\n" +
               " \"mappings\": {\n" +
               "   \"properties\": {\n" +
               "     \"id\": {\n" +
               "       \"type\": \"keyword\"\n" +
               "     },\n" +
               "     \"name\": {\n" +
               "       \"type\": \"text\",\n" +
               "       \"analyzer\": \"ik_max_word\",\n" +
               "       \"copy_to\": \"all\"\n" +
               "     },\n" +
               "     \"address\": {\n" +
               "       \"type\": \"keyword\",\n" +
               "       \"index\": false\n" +
               "     },\n" +
               "     \"price\": {\n" +
               "       \"type\": \"integer\"\n" +
               "     },\n" +
               "     \"score\": {\n" +
               "       \"type\": \"integer\"\n" +
               "     },\n" +
               "     \"brand\": {\n" +
               "       \"type\": \"keyword\",\n" +
               "       \"copy_to\": \"all\"\n" +
               "     },\n" +
               "     \"city\": {\n" +
               "       \"type\": \"keyword\"\n" +
               "     },\n" +
               "     \"starName\": {\n" +
               "       \"type\": \"keyword\"\n" +
               "     },\n" +
               "     \"business\": {\n" +
               "       \"type\": \"keyword\",\n" +
               "       \"copy_to\": \"all\"\n" +
               "     },\n" +
               "     \"pic\": {\n" +
               "       \"type\": \"keyword\",\n" +
               "       \"index\": false\n" +
               "     },\n" +
               "     \"location\": {\n" +
               "       \"type\": \"geo_point\"\n" +
               "     },\n" +
               "     \"all\": {\n" +
               "       \"type\": \"text\",\n" +
               "       \"analyzer\": \"ik_max_word\"\n" +
               "     }\n" +
               "   }\n" +
               " }\n" +
               "}";
    }

 

```file
PUT /hotel
{
  "mappings": {
      "properties": {
          "id": {
              "type": "keyword"
              },
          "name": {
              "type": "text",
              "analyzer": "ik_max_word",
              "copy_to": "all"
              },
          "address": {
                "type": "keyword",
                "index": "false"
              },
          "price": {
                "type": "integer"
              },
          "score": {
                "type": "integer"
              },
          "brand": {
                "type": "keyword",
                "copy_to": "all"
              },
          "city": {
                "type": "keyword"
              },
          "starName": {
                  "type": "keyword"
              },
          "business": {
                  "type": "keyword",
                  "copy_to":"all"
              },
          "pic": {
                  "type": "keyword",
                  "index": "false"
              },
          "location": {
                  "type": "geo_point"
            },
          "all": {
                  "type": "text",
                  "analyzer": "ik_max_word"
                }
          }
     
    }
     
}

 

  • Test

    package cn.itcast.hotel;

    import org.apache.http.HttpHost;
    import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.client.indices.CreateIndexRequest;
    import org.elasticsearch.client.indices.GetIndexRequest;
    import org.elasticsearch.common.xcontent.XContentType;
    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;

    import java.io.IOException;

    import static cn.itcast.hotel.constants.HotelIndexConstants.MAPPING_TEMPLATE;

    public class HotelIndexTest {
       //先要初始化
       private RestHighLevelClient client;
       
       @BeforeEach
       void setUp(){
           //初始化
           this.client = new RestHighLevelClient(RestClient.builder(

                   HttpHost.create("http://192.168.142.130:9200")//指定虚拟机的端口号
          ));
      }

       @AfterEach
       void deadDown() throws IOException {

           this.client.close();//关闭
      }
       
       @Test
       void initTest(){
           System.out.println(client);
      }
       @Test
       void createIndexTest() throws IOException {
           //创建索引对象,并指定索引名
           CreateIndexRequest request = new CreateIndexRequest("hotel");
           //加载创建索引的表
           request.source(MAPPING_TEMPLATE, XContentType.JSON);
           //执行:indices()封装了所有的索引API
           client.indices().create(request,RequestOptions.DEFAULT);
      }
       //删除索引
       @Test
       void deleteIndexTest() throws IOException {

           DeleteIndexRequest request = new DeleteIndexRequest("hotel");

           client.indices().delete(request,RequestOptions.DEFAULT);
      }
       //判断索引是否存在
       @Test
       void existIndexTest() throws IOException {

           GetIndexRequest request = new GetIndexRequest("hotel");

           boolean flag = client.indices().exists(request, RequestOptions.DEFAULT);
           System.out.println(flag ? "存在":"不存在");
      }

    }

操作文档

  • test

package cn.itcast.hotel;

import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;

import static cn.itcast.hotel.constants.HotelIndexConstants.MAPPING_TEMPLATE;
@SpringBootTest
public class HotelIndexDocumentTest {

   @Autowired
   private IHotelService hotelService;

   private RestHighLevelClient client;
   //操作文档
   @Test
   void selectIndexDocument() throws IOException {
       //查询hotel 对象
       Hotel hotel = hotelService.getById(36934L);
       //对象转换location
       HotelDoc hotelDoc = new HotelDoc(hotel);
       //正确的转json:toJSONString
       String json = JSON.toJSONString(hotelDoc);
       //创建文档对象
       IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());
       //将对象转化为json
       //request.source(JSON.toJSON(hotelDoc),XContentType.JSON);
       request.source(json,XContentType.JSON);
       //发送
       client.index(request,RequestOptions.DEFAULT);
  }
   @BeforeEach
   void setUp(){
       //初始化
       this.client = new RestHighLevelClient(RestClient.builder(
               HttpHost.create("http://192.168.142.130:9200")
      ));
  }

   @AfterEach
   void deadDown() throws IOException {

       this.client.close();//关闭
  }
}
  • pojo

package cn.itcast.hotel.pojo;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class HotelDoc {
   private Long id;
   private String name;
   private String address;
   private Integer price;
   private Integer score;
   private String brand;
   private String city;
   private String starName;
   private String business;
   private String location;
   private String pic;

   public HotelDoc(Hotel hotel) {
       this.id = hotel.getId();
       this.name = hotel.getName();
       this.address = hotel.getAddress();
       this.price = hotel.getPrice();
       this.score = hotel.getScore();
       this.brand = hotel.getBrand();
       this.city = hotel.getCity();
       this.starName = hotel.getStarName();
       this.business = hotel.getBusiness();
       this.location = hotel.getLatitude() + ", " + hotel.getLongitude(); //这里进行了转换
       this.pic = hotel.getPic();
  }
}

查删改

//查询
   @Test
   void getDocumentByIdTest() throws IOException {
       
       //创建获取对象:指定索引和id
       GetRequest request = new GetRequest("hotel", "36934");
       //获取响应结果
       GetResponse response = client.get(request,RequestOptions.DEFAULT);
       //得到source:json原数据
       String json = response.getSourceAsString();
       //将字符串转换成对象
       HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);

       System.out.println(hotelDoc);
  }
   //更新
   @Test
   void updateDocument() throws IOException {
       //创建对象
       UpdateRequest request = new UpdateRequest("hotel", "36934");
       //准备请求参数
       request.doc(
               "starName","四钻",
               "price","1314"
      );
       //发送请求
       client.update(request,RequestOptions.DEFAULT);
  }
   //删除
   @Test
   void deleteDocument() throws IOException {
       DeleteRequest request = new DeleteRequest("hotel", "36934");
       client.delete(request,RequestOptions.DEFAULT);
  }

批量插入

@Test
   void bulkRequest() throws IOException {

       //数据库查询
       List<Hotel> hotels = hotelService.list();

       BulkRequest request = new BulkRequest();
       for (Hotel hotel : hotels) {
           //转换
           HotelDoc hotelDoc = new HotelDoc(hotel);
           //正确的转Json
           String json = JSON.toJSONString(hotelDoc);
           //批量添加数据
           request.add(new IndexRequest("hotel")
                  .id(hotel.getId().toString())
                  .source(json, XContentType.JSON));
      }
       //发送
       client.bulk(request, RequestOptions.DEFAULT);
  }
 

 

标签:elasticserch,hotel,client,文档,org,import,type,ES
来源: https://www.cnblogs.com/yzlworld/p/16500088.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有