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实现一个案例代码仓库

  • 搜索提示
  • 搜索结果列表显示,并且关键字高亮
相关推荐
未 顾7 小时前
day12:版本控制器
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客13 小时前
Lucene 和 Elasticsearch 中更好的二进制量化 (BBQ)
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·lucene
报名搜谷安1 天前
CCSK:面试云计算岗的高频问题
elasticsearch·flume·memcached
CoderJia程序员甲2 天前
重学SpringBoot3-整合 Elasticsearch 8.x (三)使用Repository
java·大数据·spring boot·elasticsearch
东方巴黎~Sunsiny2 天前
如何优化Elasticsearch的查询性能?
大数据·elasticsearch·搜索引擎
NoneCoder2 天前
命令行工具进阶指南
大数据·elasticsearch·搜索引擎
许苑向上2 天前
【Elasticsearch】Elasticsearch集成Spring Boot
spring boot·elasticsearch·jenkins
东方巴黎~Sunsiny2 天前
Elasticsearch中什么是倒排索引?
大数据·elasticsearch·jenkins
qq_356408662 天前
es 数据清理delete_by_query
elasticsearch
Elastic 中国社区官方博客2 天前
AutoOps 使每个 Elasticsearch 部署都更易于管理
大数据·人工智能·elasticsearch·搜索引擎·全文检索·devops