Elasticsearch入门

参考资料

感谢知乎上大数据梦想家分享的入门教程,很实用。教程地址:从 0 到 1 学习 elasticsearch ,这一篇就够了!(建议收藏)

Elasticsearch 是什么

Elasticsearch 简称 ES,是一个开源的高扩展的分布式全文检索引擎,可以近实时的存储、检索数据。ES 使用 Lucene 作为其核心来实现所有索引及搜索的功能,使用 RESTful API来隐藏 Lucene 的复杂性,从而使全文检索变得简单易用。

Elasticsearch 与 Solr 的比较

  • ES 和 Solr 都基于 Lucene。
  • ES 自带分布式协调管理功能,Solr 依赖 Zookeeper 进行分布式管理。
  • ES 只支持 json 格式,Solr 支持 json、XML、CSV 等格式。
  • ES 很多功能需要第三方插件支持,Solr 本身功能较为丰富。
  • ES 建立索引快,适用于实时性较强的场景;Solr 查询较快,但是索引更新慢,适用于电商等查询较多的场景。

Elastisearch 安装及启动

从官网 Download Elasticsearch 根据平台选择对应的版本进行下载。下载完成后将下载压缩包文件拷贝到安装路径(~/.opt/elasticsearch)并解压,在该目录下新建 data 目录用于存储索引。

修改配置文件 $ES_HOME/config/elasticsearch.yml 文件:

cluster.name: demo-elasticsearch
node.name: node01
path.data: ~/.opt/elasticsearch/data
path.logs: ~/.opt/elasticsearch/logs
network.host: 0.0.0.0
host.port: 9200
cluster.initial_master_nodes: ["node01"]
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl:
    enabled: false
    keystore.path: certs/http.p12

修改 jvm.options 文件中的配置:

-Xms1g
-Xmx1g

据说 Elasticsearch 不允许使用 root 用户操作,需要新建 elsearch 用户组及 elsearch 用户进行集群的操作,但是我在 macOS 上直接使用 admin 账号操作没遇到什么问题,并且在 macOS 上新建用户组和用户和 Linux 上的命令不通用,所以跳过新建用户这一步。

启动 es:

bin/elasticsearch

启动之后,可以访问 http://localhost:9200 查看。如果没有关闭 xpack.security.http.ssl 配置的话,需要访问 https://localhost:9200。

这个页面会返回一些集群相关的信息:

{
  "name" : "node01",
  "cluster_name" : "demo-elasticsearch",
  "cluster_uuid" : "2pFl_UiuQFSwsGD-6CTtMQ",
  "version" : {
    "number" : "9.0.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "112859b85d50de2a7e63f73c8fc70b99eea24291",
    "build_date" : "2025-04-08T15:13:46.049795831Z",
    "build_snapshot" : false,
    "lucene_version" : "10.1.0",
    "minimum_wire_compatibility_version" : "8.18.0",
    "minimum_index_compatibility_version" : "8.0.0"
  },
  "tagline" : "You Know, for Search"
}

Elasticsearch-head 安装

Elasticsearch-head 是 Elasticsearch 的一个开源的图形化界面,在 GitHub 上可以获取:https://github.com/mobz/elasticsearch-head。将源码克隆到本地,然后通过 npm 启动。

cd elasticsearch-head

npm install 

npm start

因为跨域的原因,需要在 elasticsearch.yml 中增加相关的配置:

http.cors.enabled: true
http.cors.allow-origin: "*"

修改配置后,重启 es,访问 http://localhost:9100,就能看到 es-head 页面了,可以查看索引和查询之类的功能。

kibana 安装

kibana 安装

kibana 可以将更友好的展示和分析 es 的数据。在 es 官网可以进行下载:https://www.elastic.co/cn/downloads/kibana,要注意的是,kibana 的版本需要和 es 的版本保持一致。

下载后放到指定路径 ~/.opt/kibana 并解压。

修改配置文件:~/.opt/kibana/config/kibana.yml:

server.port: 5601
server.host: 0.0.0.0
elasticsearch.hosts: ["http://localhost:9200"]
elasticsearch.username: "elsearch"
elasticsearch.password: "elsearch"

通过 bin/kibana 启动 kibana。

访问 http://localhost:5601 访问 kibana 页面。

ik 分词器安装

原下载地址:https://github.com/infinilabs/analysis-ik/releases,但是最新版本已不在 GitHub 更新,需要到 https://release.infinilabs.com/analysis-ik/stable/ 进行下载。

下载后拷贝到 $ES_HOME/plugins/ik 路径下,重启 kibana。

测试分词器(最少切分):梦想家

GET _analyze
{
    "analyzer": "ik_smart",
    "text": "梦想家"
}

最细粒度切分:梦想家、梦想、想家

GET _analyze
{
    "analyzer": "ik_max_word",
    "text": "梦想家"
}

分词器自定义词典:

在 $ES_HOME/plugins/ik/config 路径下新建文件 my.dic,写入需要被识别成一个词的词。

修改 IKAnalyzer.cfg.xml 文件:

<properties>
   <comment>IK Analyzer 扩展配置</comment> <!-- 用户可以在这里配置自己的扩展字典 -->
   <entry key="ext_dict">my.dic</entry> <!-- 用户可以在这里配置自己的扩展停止词字典 -->
   <entry key="ext_stopwords"></entry>
</properties>

修改完成保存并重启 es,此时 my.dic 中的词就不会再被切分。

Elasticsearch 基本操作

创建文档:

PUT /test1/_doc/1
{
  "name": "大数据梦想家",
  "age": 24
}

创建成功后可在 es-head 页面浏览数据标签页中看到对应的索引 test1。

创建索引并指定字段类型:

PUT /test2
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "long"
      },
      "birthday": {
        "type": "date"
      }
    }
  }
}

查看刚才创建的索引:

GET /test2

向该索引增加数据:

PUT /test2/_doc/1
{
  "name": "大数据梦想家",
  "age": 21,
  "birthday": "2020-01-01"
}

查看文档信息:

GET /test2/_doc/1

修改文档:

PUT /test2/_update/1
{
  "doc": {
    "name": "大数据梦想家1"
  }
}

修改文档也可以使用和新增同样的方式进行,但是会覆盖元来的数据,不推荐使用。

删除文档:

DELETE /test2/_doc/1

删除索引:

DELETE /test2

查找

先增加几条测试数据:

PUT /demo/_doc/1
{
    "name": "爱丽丝",
    "age": 21,
    "desc": "在最美的年华,做最好的自己",
    "tags": ["技术宅", "温暖", "思维活跃"]
}

PUT /demo/_doc/2
{
    "name": "鲍勃",
    "age": 25,
    "desc": "逍遥自在",
    "tags": ["交友", "理性"]
}

PUT /demo/_doc/3
{
    "name": "露西",
    "age": 30,
    "desc": "人越讨厌明天,就睡得越晚",
    "tags": ["社会", "科学"]
}

PUT /demo/_doc/4
{
    "name": "Alice爱学Python",
    "age": 21,
    "desc": "人生苦短,我用Python",
    "tags": ["好学", "勤奋刻苦"]
}

PUT /demo/_doc/5
{
    "name": "Alice爱学Java",
    "age": 18,
    "desc": "技术成就自我",
    "tags": ["思维敏捷", "喜欢学习"]
}

按 name 查找,返回 name、age、desc 列,结果按 age 升序排序,从第二个结果开始返回1个结果:

GET /demo/_search
{
  "query": {
    "match": {
      "name": "爱丽丝"
    },
    "_source": ["name", "age", "desc"],
    "sort": [{
        "age": {
          "order": "asc"
        }
      }],
    "from": 1,
    "size": 1
  }
}

OR:

GET /demo/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "爱丽丝"
          }
        },
        {
          "match": {
            "age": 25
          }
        }
      ]
    }
  }
}

AND:

GET /demo/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "爱丽丝"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "age": {
              "lte": 18
            }
          }
        }
      ]
    }
  }
}

按多个值查找:

GET /demo/_search
{
  "query": {
    "match": {
      "tags": "男 学习"
    }
  }
}

text 字段在查找时会被先被分词然后再进行查找,keyword 类型的字段会进行精确查找,不会被分词。

对结果进行高亮显示:

GET /demo/_search
{
  "query": {
    "match": {
      "name": "鲍勃"
    }
  },
  "highlight": {
    "pre_tags": "<b class='key' style='color: red'>",
    "post_tags": "</b>",
    "fields": {
      "name": {}
    }
  }
}

关于分词:

  • term:不经过分词,直接查询精确的值
  • match:会使用分词器解析
GET /demo/_search
{
  "query": {
    "term": {
      "name": "爱"
    }
  }
}

查看健康信息

GET _cat/health
GET _cat/indicies?v