Elaticsearch快速入门,以及结合Next.js案例使用

Elaticsearch是什么

基础概念

Elasticsearch(简称:ES)是一个开源的分布式搜索和分析引擎,它被设计用于快速、可扩展和实时地搜索和分析大规模数据。它构建在 Apache Lucene 搜索引擎库之上,并提供了简单的 RESTful API 接口,使其易于集成和使用 -- 来自GPT的解释

ES中重要的概念--为了更好理解引入MySQL进行对比学习

MySQL Elaticsearch
Database Index
Table Type
Row Document
Column Field
Schema Mapping

基础安装

单节点

这里使用Docker安装(如需要裸机安装,可自行google相关教程)

elasticsearch.yml 复制代码
    ---
    ## Default Elasticsearch configuration from Elasticsearch base image.
    ## https://github.com/elastic/elasticsearch/blob/master/distribution/docker/src/docker/config/elasticsearch.yml
    #
    # 集群名称
    cluster.name: "docker-cluster"
    # 节点名称
    node.name: es-node-1
    # 设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址(本机ip)
    # network.publish_host: 192.168.31.138
    network.publish_host: 127.0.0.1
    # 绑定host,0.0.0.0
    network.host: 0.0.0.0
    # 设置对外服务的http端口,默认为9200
    http.port: 9200
    # 设置节点间交互的tcp端口,默认是9300
    transport.tcp.port: 9300
    # # 是否支持跨域,默认为false
    # http.cors.enabled: true
    # # 当设置允许跨域,默认为*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使用正则表达式。比如只允许本地地址。 /https?://localhost(:[0-9]+)?/
    # http.cors.allow-origin: "*"
    # # 表示这个节点是否可以充当主节点
    # node.master: true
    # # 是否充当数据节点
    # node.data: true
    # # 所有主从节点ip:port
    # #discovery.seed_hosts: ["192.168.200.135:9300"]  #本地只有一个节点,无法正常启动,先注释
    # # 这个参数决定了在选主过程中需要 有多少个节点通信  预防脑裂 N/2+1
    # discovery.zen.minimum_master_nodes: 1
    # #初始化主节点
    # #cluster.initial_master_nodes: ["es-node-1"]  #本地只有一个节点,无法正常启动,先注释
    xpack.license.self_generated.type: trial

    xpack.security.enabled: false

    xpack.monitoring.collection.enabled: false
docker-compose.yml 复制代码
version: '3.7'
services:

  elasticsearch:
    image: elasticsearch:7.17.7
    container_name: elasticsearch7.17.7
    environment:
      - bootstrap.memory_lock=true # 内存交换的选项,官网建议为true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置内存,如内存不足,可以尝试调低点
      - discovery.type=single-node # 是否启用单节点模式
      - http.cors.enabled=true
      - http.cors.allow-origin=*
    ulimits:
      # 栈内存的上限
      memlock:
        soft: -1 # 不限制
        hard: -1 # 不限制
    volumes:
      #  - ~/top/data/elasticsearch/config:/usr/share/elasticsearch/config
      # ./plugins:/usr/share/elasticsearch/plugins #插件文件挂载
      - ./data:/usr/share/elasticsearch/data #数据文件挂载
      - ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    hostname: elasticsearch
    restart: always
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - elastic

  kibana:
    image: kibana:7.17.7
    container_name: kibana7.17.7
    environment:
      - elasticsearch.hosts=http://elasticsearch:9200
    hostname: kibana
    depends_on:
      - elasticsearch
    restart: always
    ports:
      - 5601:5601
    networks:
      - elastic

volumes:
  esdata:
    driver: local

networks:
  elastic:
    driver: bridge
  • 将上面两个文件放在同一文件夹里,当前文件夹中启动 docker-compose up -d . (ps:安装 docker 环境和 docker-compose 等工具自行安装)
  • 进入容器内部安装 ik 等插件,安装结束后,一定要记得重启容器
    • ./elasticsearch-plugin install github.com/medcl/elast...
    • 注意问题:kibana 和 es 、ik 等版本号问题,一定要对应的上

基础使用

创建索引

常见索引类型

  • 文本: text : 模糊查询 keyword : 圈子匹配
  • 数值:
  • 整型: byte,short,integer,long 浮点型: float, half_float, scaled_float,double
  • 范围型:integer_range, long_range, float_range,double_range,date_range
  • 等等等...(具体用到再去查手册)
js 复制代码
# 查看存在的的索引信息 
GET _cat/indices

# 创建名叫jobs索引
PUT jobs

# 创建一个叫jobs的mapping
POST jobs/_mapping
{
  "properties": {
    "jid": {
      "type": "long"
    },
    "title": {
      "type": "text"
    },
    "company": {
      "type": "text"
    },
    "salary": {
      "type": "integer_range"
    },
    "city": {
      "type": "keyword"
    },
    "description": {
      "type": "text"
    }
  }
}

# 查询jobs索引mapping
GET jobs/_mapping

基础文档的增删改查

文档数据的添加

单条文档数据添加

特殊说明: 用下述方式操作添加文档的时(指定了文档的ID),如果文档文档存在,则为编辑文档信息;如果通过不同方式去添加和更新文档,可自行查询官方文档,这里就展开了

单条文档数据添加/修改 复制代码
# 单条文档数据添加/修改
POST jobs/_doc/1
{
  "jid": 1,
  "title": "Golang开发工程师",
  "company" : "广州xxxx科技有限公司",
  "salary" : {"gte" : 9000,"lte" : 15000},
  "city" : "北京",
  "description" : "会curd就行"
}

使用Bulk 接口批量添加数据

批量导入文档数据 复制代码
# 批量导入文档数据 _buik
POST _bulk
{ "index":  { "_index": "jobs", "_type": "_doc", "_id": "2" }}
{"jid":15707,"title":"php开发工程师","salary":{"gte":9000,"lte":15000},"city":"北京","company":"xxxx有限公司","description":"高级Curd"}
{ "index":  { "_index": "jobs", "_type": "_doc", "_id": "3" }}
{"jid":15708,"title":"Node工程师","salary":{"gte":1500,"lte":30000},"city":"北京","company":"aaaaa有限公司","description":"高级运维"}

特殊参数refresh说明
#默认,等待所有数据导入再刷新索引,即对查询暴露
POST http://localhost:9200/_bulk

# 每发生一条数据变化,立即刷新索引,对外暴露会影响性能
POST http://localhost:9200/_bulk?refresh

#默认每一秒刷新一次索引,将最近一秒产生的数据刷新到索引
#可以通过设置index.refresh_interval修改刷新间隔
POST http://localhost:9200/_bulk?refresh=wait_for

删除文档

bash 复制代码
# 删除ID=1的文档
DELETE jobs/_doc/1

查询/搜索文档

  • 通过URI
js 复制代码
q:查询的内容,使用Query String syntax表达。
df:指定默认字段,不指定时对所有字段进行查询。
sort:排序字段,格式:字段名:desc|asc。
from/size:分页的起始行号与每页记录数。

GET jobs/_search?q=golang&sort=jid:desc&from=0&size=2&df=title
  • Request body 常用查询
js 复制代码
GET jobs/_search
{
  "from": 0, # 从哪里开始
  "size": 10, # 限制多少条
  "sort": [ # 排序
    {
      "jid": "asc"
    }
  ],
  "_source": [ # 过滤字段
    "jid",
    "title",
    "salary"
  ],
  "query": { 
    "match_all": {} # 查询所有
  }
}

GET jobs/_search
{
  "query": {
    "term": { # 精准匹配(单个值)
      "jid": 1
    }
  }
}

GET jobs/_search
{
  "query": {
    "terms": { # 精准匹配(多个值)
      "jid": [1,2,3]
    }
  }
}

GET jobs/_search
{
  "query": {
    "match": { # 全文索引
      "description": "java"
    }
  }
}

GET jobs/_search
{
  "query": {
    "multi_match": { # 多字段查询
      "query": "java",
      "fields": ["company","description"]
    }
  }
}

GET jobs/_search
{
  "query": {
    "match_phrase": { # 短语查询
      "description": {
        "query": "golang php", # 按golang php 的顺序查询短语
        "slop": 1 # 允许两个短语之间最多出现其他词的个数
      }
    }
  }
}

拓展功能

ik分词器

  • 安装方式

    • 进入es实战中:运行elasticsearch-plugin install github.com/medcl/elast...
    • 重启实例:elasticsearch-plugin list 可看到相关的拓展插件
    • 注意问题:kibana 和 es 、ik 等版本号问题,一定要对应的上
  • ik分词器的两种分词模式

    • ik_max_word:最细粒度的拆分
    • ik_smart:最粗粒度的拆分
  • 执行分词预览

智能提示

  • 智能提示也叫查询建议,是为了给用户提供更好的搜索体验。包括,词条检查,自动补全等。如下图所示
  • es中常见三种提示
    • Term Suggester(词项建议器)
    • Phrase Suggester(短语建议器)
    • Completion Suggester(自动完成建议器)
  • 这里以Completion Suggester为例,其他两个自行查询学习
js 复制代码
GET job1/_search
{
    "suggest": {
        "title‐suggest": {
            "prefix": "java 工程师",
            "completion": {
                "field": "title_completion",
                "analyzer": "ik_max_word",
                "size": 10
            }
        }
    }
}

高亮显示

  • 有时候在google等搜索时,会对查询结果中的关键字标红的方式称作高亮显示,目的是让用户快速看到文档内容的匹配情况。如下图所示
  • 查询操作
bash 复制代码
GET kibana_sample_data_ecommerce/_search
{
  "size": 1,
  "query": {
    "match": {
      "category": "Clothing"
    }
  },
  "highlight": {
    "fields": {
      "category": {
        "pre_tags": [
          "<h1>"
        ],
        "post_tags": [
          "</h1>"
        ]
      }
    }
  }
}

实战demo

使用Next.js 13集成Ant Design,并使用Elasticsearch实现一个案例代码仓库

  • 搜索提示
  • 搜索结果列表显示,并且关键字高亮
相关推荐
傻啦嘿哟11 小时前
Flask项目中PostgreSQL与Elasticsearch的批量更新
elasticsearch·postgresql·flask
java1234_小锋14 小时前
Elasticsearch在部署时,对Linux的设置有哪些优化方法?
大数据·elasticsearch·搜索引擎
疯狂吧小飞牛14 小时前
elasticsearch单节点模式部署
运维·elasticsearch
白衣神棍17 小时前
ES更新问题 Failed to close the XContentBuilder异常
java·elasticsearch
Java 第一深情1 天前
Linux上安装单机版Kibana6.8.1
elasticsearch·kibana
LeonNo111 天前
ElasticSearch学习了解笔记
笔记·学习·elasticsearch
iPrologue1 天前
自己记录docker和ES集群
elasticsearch·docker·容器
Evenurs1 天前
【git】取消一个已提交的文件或路径的追踪
大数据·git·elasticsearch
farewell-Calm1 天前
分布式搜索引擎之elasticsearch单机部署与测试
大数据·分布式·elasticsearch
Elastic 中国社区官方博客1 天前
使用 Elastic 收集 Windows 遥测数据:ETW Filebeat 输入简介
大数据·windows·elasticsearch·搜索引擎·全文检索·可用性测试