本文作者:陈进坚
个人博客:https://jian1098.github.io
CSDN博客:https://blog.csdn.net/c_jian
:https://www.jianshu.com/u/8ba9ac5706b6
联系方式:[email protected]
简介
Elasticsearch
是一个基于Lucene
的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎。全文搜索属于最常见的需求,开源的 Elasticsearch 是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。由于Elasticsearch基于RESTful web接口,所以所有支持http请求
访问的编程语言都可以直接对接Elasticsearch。
安装
根据自己的系统类型按官方文档安装即可
https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html
启动与停止
Elastic 需要 Java 8 环境。如果你的机器还没安装 Java请先安装。
以zip
包方式安装为例,进入elasticsearch-7.10.0/目录,执行启动命令
.\bin\elasticsearch.bat # Windows系统
./bin/elasticsearch # Linux系统
启动成功后在另一个终端中访问9200
端口会返回信息
$ curl localhost:9200
{
"name" : "DESKTOP-R3EDI39",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "Ek4sDY1ZTzig_sNpzJnFaA",
"version" : {
"number" : "7.10.0",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "51e9d6f22758d0374a0f3f5c6e8f3a7997850f96",
"build_date" : "2020-11-09T21:30:33.964949Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
按Ctrl + C
,Elastic 就会停止运行。
注意
:默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以修改 Elastic 安装目录的config/elasticsearch.yml
文件,去掉network.host
的注释,将它的值改成0.0.0.0
,然后重新启动 Elastic。
基本概念
节点和集群
Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
索引
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
文档
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
Document 使用 JSON 格式表示,下面是一个例子。
{
"user": "张三",
"title": "工程师",
"desc": "数据库管理"
}
同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。
分组
Document 可以分组,比如weather这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。
不同的 Type 应该有相似的结构(schema),举例来说,id字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如products和logs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。
下面的命令可以列出每个 Index 所包含的 Type。
$ curl 'localhost:9200/_mapping?pretty=true'
索引操作
新增索引
向服务器发送PUT
请求即可新增索引,例:新增索引dog
curl -X PUT "localhost:9200/dog"
服务器返回一个 JSON 对象,里面的acknowledged
字段表示操作成功
{"acknowledged":true,"shards_acknowledged":true,"index":"dog"}
删除索引
向服务器发送DELETE
请求即可新增索引,例:删除索引dog
curl -X DELETE "localhost:9200/dog"
返回结果
{"acknowledged":true}
数据操作
新增记录
向服务器发送PUT
请求的json
数据即可新增记录,需要向指定的 /Index/Type
发送 PUT 请求
curl -H "Content-Type: application/json" -X PUT "localhost:9200/person/student/1" -d "{"""user""": """tom""","""sex""": """m""","""age""":12}"
这里本人是在windos系统下运行,所以对json中的"
做了处理,其中/person/student/1
中的person是index,服务器中没有这个索引也不会报错,新增记录的时候会自动生成;student是type;1是改天记录的id,id不一定是数字,也可以是字符串,服务器会返回下面的结果:
{
"_index":"person",
"_type":"student",
"_id":"1",
"_version":1,
"result":"created",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":0,
"_primary_term":1
}
会给出 Index、Type、Id、Version 等信息。
新增记录时也可以不指定id,但是要将PUT
请求改为POST
请求,服务器返回的 JSON 对象里面,_id
字段就是一个类似AV3qGfrC6jMbsbXb6k1p
这样的随机字符串。
查询记录
带上索引和id,用GET
请求服务器即可,后面的?pretty=true
可以使返回的json格式化以增加可读性
curl "localhost:9200/person/student/1?pretty=true"
返回结果:
{
"_index" : "person",
"_type" : "student",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"user" : "tom",
"sex" : "m",
"age" : 12
}
}
如果索引不存在会报错,如果id不存在返回的json数据中found
为false
{
"_index" : "person",
"_type" : "student",
"_id" : "2",
"found" : false
}
删除记录
删除记录就是发出 DELETE 请求
curl -X DELETE "localhost:9200/person/student/1"
返回结果:
{
"_index":"person",
"_type":"student",
"_id":"1",
"_version":2,
"result":"deleted",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":1,
"_primary_term":1
}
更新记录
按照新增记录的方法,用同一个index/type/id带上数据以PUT
请求即可覆盖原来的记录,但是返回的数据中记录的 Id 没变,但是版本(version)从1
变成2
,操作类型(result)从created
变成updated
,created
字段变成false
{
"_index":"person",
"_type":"student",
"_id":"1",
"_version":2,
"result":"updated",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":3,
"_primary_term":1
}
查询所有记录
使用 GET 方法,直接请求/Index/Type/_search
,就会返回所有记录。
curl "localhost:9200/person/student/_search?pretty=true"
返回结果:
{
"took" : 240,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "person",
"_type" : "student",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"user" : "john",
"sex" : "f",
"age" : 15
}
},
{
"_index" : "person",
"_type" : "student",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"user" : "tom",
"sex" : "m",
"age" : 12
}
}
]
}
}
全文搜索
带指定格式的json参数用GET
请求Index/Type/_search
即可
curl -H "Content-Type: application/json" "localhost:9200/person/student/_search" -d "{"""query""" : { """match""" : { """user""" : """tom""" }},"""size""": 1,"""from""":0}"
其中user
为搜索字段名,tom
为搜索关键字,size
为记录数量,默认10条,from
为位移,默认是从位置0开始,可用于分页处理
逻辑搜索
OR
如果有多个搜索关键字,并且关键字用空格分开,系统默认为OR
条件查询
AND
如果多个搜索关键字是and
关系,需要在请求参数中指定must
,例如
curl 'localhost:9200/person/student/_search' -d '
{
"query": {
"bool": {
"must": [
{ "match": { "user": "tom" } },
{ "match": { "user": "john" } }
]
}
}
}'
大于小于
{
"query":{
"range":{
"age":{
"gte":18,
"lte":60
}
}
}
}
参考文档
http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html
https://www.elastic.co/guide/en/elasticsearch/reference/6.0/getting-started.html