参考资料
感谢知乎上大数据梦想家分享的入门教程,很实用。教程地址:从 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