es初识

来源:互联网 发布:安卓手机淘宝5.6.7版本 编辑:程序博客网 时间:2024/05/18 20:33

一,es和mysql对比

二,es和solr对比

三,es搭建和启动

四,es的增删改查操作


1,mysql从宏观可以分为数据库、表、行(row)、列;

es可以进行类比,分为索引库、类型(type)、文档(document)、字段。


2,可以3个方面对比:

接口:

es是使用REST接口的访问方式;

solr是使用类似webservice的接口的访问方式

(简单理解restful风格:

通常的HTTP请求这样写:http://www.baidu.com/get?a=1

restful这样写:http://www.baidu.com/get/a/1

)

分布式存储:

es是为分布式而生的;

solr4.x才支持分布式操作

支持的数据格式:

es支持json格式

solr可以支持json、xml


这两个框架都能实现实时搜索!!


3,搭建条件:jdk不得低于1.7

零配置,开箱即用
没有繁琐的安装配置

启动:

cd /root/xtz/elasticsearch-1.4.4

./bin/elasticsearch


./bin/elasticsearch -d(表示后台启动)

安装验证:


通过9200端口访问出现该界面表示安装成功!


ES启动插件:

因为es关闭的方式不友好,我们使用的是github的一个插件(官方并不推荐)。

下载地址
https://github.com/elastic/elasticsearch-servicewrapper

安装:把server目录拷贝到ES_HOME/bin/目录下面



4,

1)创建索引库

curl -XPUT 'http://localhost:9200/index_name/'(PUT/POST都可以)

例子:

curl -XPUT http://ha1:9200/xtz

curl -XPOST http://ha1:9200/xtz

2)创建索引(put、post)

curl -XPOST http://ha1:9200/xtz/emp/1 -d '{

"name":"zhangsan",

"age":20,

instrests:["football","basketball"]

}'

注意:post和put创建索引的区别。put必须作用于某个确定的id,而post不必,它会自己产生一个随机id出来。

例子:

curl -XPUT http://ha1:9200/xtz/emp -d '{name:"zhangsan"}'是不行的,而这样是可以成功的,

curl -XPOST http://ha1:9200/xtz/emp -d '{name:"zhangsan"}'


创建es索引时的注意:索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号

如果id存在就不许添加新的操作,可以在url后面添加参数:

curl -XPUT http://ha1:9200/xtz/emp/1/_create -d '{name:"zhangsan"}'

或者curl -XPUT http://ha1:9200/xtz/emp/2?op_type=create -d '{name:"zhangsan"}' (此处两个地方使用post也可以)

如果成功创建了新的文档,Elasticsearch将会返回常见的元数据以及201 Created的HTTP反馈码。而如果存在同名文件,Elasticsearch将会返回一个409 Conflict的HTTP反馈码


3)查询索引(get)

根据id查询:curl -XGET http://ha1:9200/xtz/emp/2?pretty(在任意的查询字符串中添加pretty参数,es可以得到易于识别的json结果。)

curl后添加-i 参数,这样你就能得到反馈头文件:curl -i http://ha1:9200/xtz/emp/2?pretty


上面查询会显示所有字段,如果只需要显示指定的字段:curl -XGET http://ha1:9200/xtz/emp/5?_source=name,age&pretty

如果只需要source的数据:curl -XGET http://localhost:9200/xtz/emp/5/_source


查询所有:curl -XGET http://ha1:9200/xtz/emp/_search?pretty

(你可以在返回的 hits 中发现我们录入的文档。搜索会默认返回最前的10个数值。)


根据 条件进行查询:http://ha1:9200/xtz/emp/_search?q=name:lisi&pretty


查询不同索引库、不同类型、指定id、指定source的索引(mget):

curl -XGET http://ha1:9200/_mget?pretty -d '{"docs":[{"_index":"xtz","_type":"emp","_id":1},{"_index":"xtz","_type":"emp","_id":12,"_source":"name"}]}'

如果你需要的文档在同一个_index或者同一个_type中,你就可以在URL中指定一个默认的/_index或者/_index/_type:

curl -XGET http://ha1:9200/xtz/_mget?pretty -d '{"docs":[{"_type":"emp","_id":1},{"_type":"emp1","_id":1}]}'

如果所有的文档拥有相同的_index 以及 _type,直接在请求中添加ids的数组即可
curl -XGET http://ha1:9200/xtz/emp/_mget?pretty -d '{"ids":[1,2]}'

等同于:

curl -XGET http://ha1:9200/xtz/emp/_mget?pretty -d '{"docs":[{"_id":1},{"_id":2}]}'

查询文档是否存在(head):

如果只想检查一下文档是否存在,你可以使用HEAD来替代GET方法,这样就只会返回HTTP头文件
curl -i  -XHEAD http://ha1:9200/xtz/emp/1

4)更新操作

覆盖操作,使用post或者put。

注意:执行更新操作的时候
ES首先将旧的文档标记为删除状态
然后添加新的文档
旧的文档不会立即消失,但是你也无法访问
ES会在你继续添加更多数据的时候在后台清理已经标记为删除状态的文档

curl -XPOST http://ha1:9200/xtz/emp/1 -d '{"name":"zhangsan",age:20}'  (其实和新增操作一样,只不过如果是id已经存在,就会覆盖操作)


局部更新(必须使用POST,接口调用_update):

curl -XPOST http://ha1:9200/xtz/emp/1/_update -d '{"doc":{"name":"lisi"}}'


5)删除操作(delete)

a,根据id删除

curl -XDELETE http://ha1:9200/xtz/emp/1/
如果文档存在,es会返回200 ok的状态码,found属性值为true,_version属性的值+1
如果文档不存在,es会返回404 Not Found的状态码,found属性值为false,但是_version属性的值依然会+1,这个就是内部管理的一部分,它保证了我们在多个节点间的不同操作的顺序都被正确标记了
注意:删除一个文档也不会立即生效,它只是被标记成已删除。Elasticsearch将会在你之后添加更多索引的时候才会在后台进行删除内容的清理

b,根据查询条件删除:

curl -XDELETE http://ha1:9200/xtz/emp/_query?q=name:"zhangsan"

c,通过查询API删除指定索引库下多种类型下的数据
curl -XDELETE http://ha1:9200/xtz/emp,emp1/_query?q=name:"lisi"

d,通过查询API删除多个索引库下多种类型下的数据
curl -XDELETE http://ha1:9200/xtz,xtz1/emp,emp1/_query?q=name:"zhangsan"
或者删除所有索引库中的匹配的数据
curl -XDELETE http://ha1:9200/_all/_query?q=name:"zhangsan"


6)批量操作(bulk)

作用:通常我们初始化一批数据,往往把数据写在一个文件里面,然后批量导入到ES中。

(写入)文件的格式:

{action:{metadata}}

{json数据信息}

其中

action:index/create/update/delete
metadata:_index,_type,_id

例子:

a)

{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }

b)
{ "delete" : { "_index" : "test", "_type" : "type1", "_id" : "2" } }

c)
{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } }
{ "field1" : "value3" }

d)
{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "index1"} }
{ "doc" : {"field2" : "value2"} }


过程:

创建文件:vi requests 
执行脚本:curl  -XPOST/PUT localhost:9200/_bulk --data-binary @request;


注意点:

create 和index的区别
如果数据存在,使用create操作失败,会提示文档已经存在,使用index则可以成功执行

bulk请求可以在URL中声明/_index 或者/_index/_type
bulk一次最大处理多少数据量
bulk会把将要处理的数据载入内存中,所以数据量是有限制的
最佳的数据量不是一个确定的数值,它取决于你的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载
一般建议是1000-5000个文档,如果你的文档很大,可以适当减少队列,大小建议是5-15MB,默认不能超过100M





























0 0