简介
es 是啥(简介)
es是一个分析搜索引擎,底层用的是Apache Lucence 库实现的,为了使用方便 es通过RestFul api提供操作。
官方这样介绍:
分布式的实时文件存储,每个字段都被索引并可被搜索
分布式的实时分析搜索引擎
可以扩展到上百台服务器,处理PB级结构化或非结构化数据
就是有分是不可拓展存储量很大的搜索引擎
背景交代
shay这个程序猿,失业了,然后说是给妻子构建一个搜索引擎,然后就基于Lucene写了Compass并开源,后来找到工作了,由于工作需要一个分布式高性能搜索引擎 所以他决定重写Compass库使其成为一个独立的服务叫做Elasticsearch。然而这个牛人吧最后还是木有给他的妻子食谱搜索项目。Shay的妻子依旧等待着她的食谱搜索…… 这是一个悲伤的故事
逻辑结构vs mysql(怎么存储的)
|类型|库|表|行|列|
|–|--|–|--|
|mysql|库|表|行|列|
|es|index(名词非实际索引)|type|doc|field|
行的例子:
es的doc:
{
“name”: “John Doe”
}
转换mysql记录 name代表着列为name 这里只有一个doc就代表着一条记录
概念阐述(逻辑结构的解释)
index索引(名词):es在启动后可通过rest的形式操作api,其中index在es里代表着库的意思。
index索引(动词):代表着倒排索引,是真正的索引。
doc:在es中都是以json形式存储的 没行数据在es中以doc(文档)来表述。
field:json数据对应的key就是field,在关系型数据库中就是每一列。
安装&start
安装
命令行:
curl -L -O http://download.elasticsearch.org/PATH/TO/VERSION.zip <1>
unzip elasticsearch-$VERSION.zip
cd elasticsearch-$VERSION
界面下载:
界面下载地址 可根据不同系统下载包。
之后就是解压操作了
start
cd esdir(es目录)
./bin/elasticsearch
为了可远程访问可通过
修改 config/network.host: 0.0.0.0
network.host: 0.0.0.0 (ps:注意:后面要空一格)
操作
索引操作
创建索引
curl -X PUT "192.168.191.100:9200/customer?pretty"
如果不方便可用postman仿操作
删除索引
curl -X DELETE "192.168.191.100:9200/customer?pretty"
获取
GET /_cat/indices?v
获取索引列表
以上是索引的crd操作
doc操作(crud)
####创建(or更新)索引 (cu)
PUT ip:host/customer/doc/1?pretty
(ps:customer代表索引,doc代表类型,1代表着id,dao倒排索引需要用到,rest风格)
`{
"name": "John Doe"
}`
resp
{
"_index": "consumer",
"_type": "doc",
"_id": "1",
"_version": 2,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
获取®
GET 192.168.191.100:9200/customer/doc/1?pretty
{
"_index" : "customer",
"_type" : "doc",
"_id" : "2",
"_version" : 1,
"found" : true,
"_source" : {
"name" : "John Doe"
}
}
获取除了通过索引还可以通过搜索的形式
GET /megacorp/employee/_search (简易搜索)
GET /megacorp/employee/_search?q=name:Smith (根据字段搜索)
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"name" : "Smith"
}
}
} (表达式搜索)
删除(d)
DELETE 192.168.191.100:9200/customer/doc/1?pretty
以上是相关的doc的crud操作。
update常规操作
curl -X POST "192.168.191.100:9200/customer/doc/1/_update?pretty" -H 'Content-Type: application/json' -d'
{
"doc": { "name": "Jane Doe" }
}
'
POST /customer/doc/1/_update?pretty
{
"script" : "ctx._source.age += 5"
}
脚本更新 如果本身存在age字段可直接让age+5
批量操作
curl -X POST "localhost:9200/customer/doc/_bulk?pretty" -H 'Content-Type: application/json' -d'
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
在当前路径下组一个accouts.json的数据
数据如下格式:
{"index":{"_id":"1"}}
{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"[email protected]","city":"Brogan","state":"IL"}
{"index":{"_id":"6"}}
{"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"[email protected]","city":"Dante","state":"TN"}
{"index":{"_id":"13"}}
{"account_number":13,"balance":32838,"firstname":"Nanette","lastname":"Bates","age":28,"gender":"F","address":"789 Madison Street","employer":"Quility","email":"[email protected]","city":"Nogal","state":"VA"}
{"index":{"_id":"18"}}
{"account_number":18,"balance":4180,"firstname":"Dale","lastname":"Adams","age":33,"gender":"M","address":"467 Hutchinson Court","employer":"Boink","email":"[email protected]","city":"Orick","state":"MD"}
curl -H “Content-Type: application/json” -XPOST ‘localhost:9200/bank/account/_bulk?pretty&refresh’ --data-binary "@accounts.json
’
批量操作分割符是 \n所以需要构造如上的数据。之后再查就能查到相应的数据了。
具体的批量操作可参照 _bluk api
批量操作能大量的减少网络开销,如果数据可组装的话 建议批量操作。
doc操作的注意事项
操作数据的实时性
es可以看成是几乎实时的,但是默认情况下是更新索引到搜索期待有1s的延迟,这是与mysql等很不同的一个地方。
doc 索引生成规则
指定id没有doc存在,索引会从已存在doc指向新的doc,
id不同 如果doc相同 会生成两个doc
如果不指定id 则es随机生成字符串(不可取)
doc update操作
底层不是就地更新文档,而是删除就文档,新文档重新生成index。