1:es简介
es是一个分布式的搜索引擎,使用java开发,底层使用lucene。
特点:天生支持分布式的、为大数据而生的。基于restful接口。

2:es和solr对比
接口
solr:类似webservice的接口
es:REST风格的访问接口
分布式存储
solrCloud solr4.x才支持
es是为分布式而生的
支持的格式
solr xml json
es json
近实时搜索
都可以实现近实时搜索
3:es和mysql对比
mysql中有database(数据库)。
es中有index(索引库)。

mysql中有table(表)。
es中有type(类型)

mysql中有row(行)
es中有document(文档)

mysql中有column(列)
es中有field(字段/属性)

在es中可以有很多index索引库,每个index索引库可以有很多的type类型,
每一个type类型下面会有很多的document文档,
每一个文档会有很多field字段或者属性组成。

4:es安装,启动
下载、解压
cd /usr/local
tar -zxvf elasticsearch-1.4.4.tar.gz
cd elasticsearch-1.4.4/
bin/elasticsearch

这样就可以在前台启动了
访问:http://ip:9200

如何在后台运行
bin/elasticsearch -d
但是这样在后台运行,停止的话只能使用kill命令,所以是不合理的。

一般想要在后台运行es,都会使用一个插件实现

到github上下载插件,下载一个zip包
地址:https://github.com/elastic/elasticsearch-servicewrapper

解压插件
cd /usr/local
unzip elasticsearch-servicewrapper-master.zip

cd elasticsearch-servicewrapper-master
cp -r service ../elasticsearch-1.4.4/bin/

把serveice目录拷贝到es的bin目录下面之后就可以使用这个插件启动了

启动:bin/service/elasticsearc start
停止:bin/service/elasticsearc stop
重启:bin/service/elasticsearc restart

5:使用curl操作es
注意:在指定索引库的名称时,索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号
1):添加数据
指定ID
curl -XPOST http://localhost:9200/crxy/emp/1 -d '{"name":"zs1","age":18}'
curl -XPUT http://localhost:9200/crxy/emp/1 -d '{"name":"zs2","age":18}'
不指定ID,只能使用POST
curl -XPOST http://localhost:9200/crxy/emp -d '{"name":"zs3","age":18}'
2):查询
通过ID查
curl -XGET http://localhost:9200/crxy/emp/1
通过search查
curl -XGET http://localhost:9200/crxy/emp/_search
根据查询条件查
curl -XGET http://localhost:9200/crxy/emp/_search?q=name:zs1

通过mget查询
curl -XGET http://localhost:9200/crxy/emp/_mget -d {"docs":[{"_id":1,"_source":"name"},{"_index":"crxy","_type":"emp","_id":2}]}
curl -XGET http://localhost:9200/crxy/emp/_mget?pretty -d '{"ids":["1","2"]}'

3):更新
可以使用put或者post可以实现更新(直接覆盖了)
内部更新流程
注意:执行更新操作的时候
ES首先将旧的文档标记为删除状态
然后添加新的文档
旧的文档不会立即消失,但是你也无法访问
ES会在你继续添加更多数据的时候在后台清理已经标记为删除状态的文档

局部更新
只能使用post
curl -XPOST http://localhost:9200/crxy/emp/1/_update -d '{"doc":{"name":"aaa"}}'

4):删除
可以通过ID删除
curl -XDELETE http://localhost:9200/crxy/emp/4/

通过查询条件删除
curl -XDELETE 'http://localhost:9200/crxy/emp/_query?q=name:zs'
curl -XDELETE 'http://localhost:9200/crxy/emp,user/_query?q=name:zs'
curl -XDELETE 'http://localhost:9200/crxy,crxy1/emp,user/_query?q=name:zs'
curl -XDELETE 'http://localhost:9200/_all/_query?q=name:zs'

5):批量操作
使用bulk实现
格式如下:注意:不能放在一行。
{ action: { metadata }}
{ request body }
{ action: { metadata }}
{ request body }

action可以使用这几个值:index/create/update/delete
metadata可以使用这几个值:_index,_type,_id
request body需要指定要操作的属性:_source(删除操作不需要)

例子:
创建一个文件,把下面的内容拷贝进去,做相应的修改
cd /usr/local/
vi request

{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "index1"} }
{ "doc" : {"field2" : "value2"} }
{ "delete" : { "_index" : "test", "_type" : "type1", "_id" : "2" } }

执行命令(在bulk之前还可以指定索引库和类型。那么对应的文件中的这些属性,相同的就可以省略了、)
curl -XPOST/PUT localhost:9200/_bulk --data-binary @request

注意:create和index命令的不同,如果索引库中有对应的数据,使用create则创建失败,使用index则创建成功。

bulk一次最大处理多少数据量
bulk会把将要处理的数据载入内存中,所以数据量是有限制的
最佳的数据量不是一个确定的数值,它取决于你的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载
一般建议是1000-5000个文档,如果你的文档很大,可以适当减少队列,大小建议是5-15MB,默认不能超过100M,
可以在es的配置文件中修改这个值http.max_content_length: 100mb

6:版本控制
默认es使用乐观控制,也就是说不限制任何进程同时操作同一条数据。

我们可以通过版本号来控制,保证在并发情况下的数据安全。
1)使用内部版本号,这样就需要保证我们传递的版本号要和索引库中的版本号一致。
首先得到需要修改的文档,获取版本(_version)号
curl -XGET http://localhost:9200/crxy/emp/1
在执行更新操作的时候把版本号传过去
curl -XPUT http://localhost:9200/crxy/emp/1?version=1 -d '{"name":"crxy","age":25}'(覆盖)
curl -XPOST http://localhost:9200/crxy/emp/1/_update?version=1 -d '{"doc":{"city":"beijing","car":"BMW"}}'(部分更新)
2)使用外部版本号:这样就需要保证我们传递的外部版本号要比索引库中的版本号大才能执行更新。
并且外部版本号码必须要是大于0小于9223372036854775807(Java中long的最大正值)的整数。
curl -XPUT 'http://localhost:9200/crxy/emp/20?version=10&version_type=external' -d '{"name": "crxy"}'
注意:此处url前后的引号不能省略,否则执行的时候会报错

——————————————————————————————————————————————————————————————————————

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

————————————————————————————————————————————————————————————————————————

1:es中安装插件
bin/plugins -install 插件名称
安装完成之后在ES的根目录下面会生成一个plugins目录,里面存放的就是安装的插件

具体的插件名称需要到github上查找

例如:bigdesk
执行下面搜索
https://github.com/search?utf8=%E2%9C%93&q=bigdesk
一般是找后面五角星中值比较大的那个,选择对应的项目名称即可,lukas-vlcek/bigdesk

这样就可以在es中进行安装了
bin/plugins -install lukas-vlcek/bigdesk

访问插件
http://ip:9200/_plugin/bigdesk

2:es的配置文件讲解
参考文件<elasticsearch中文.yml>

3:es中的核心概念
集群:
针对es而言是在集群中有主从节点,对于外部使用人员而言,已经弱化了主从节点这个概念。
默认情况下,一个内网之内的多个es实例会自动组成一个es集群。

分片:

默认情况下,es中的一个索引库会有五个分片,这个数量在配置文件中可以修改,
具体属性名称为:index.number_of_shards
注意:索引库的分片数量在创建索引库之前就需要定义好,索引库创建之后就不能修改了。
可以通过下面这种方式来实现在创建索引库的时候指定分片的数量
curl -XPUT 'localhost:9200/test1/' -d'{"settings":{"number_of_shards":3}}'

副本:
默认情况下,一个分片会有一个副本,这个数量在配置文件中可以修改,
具体属性名称为:index.number_of_replicas
注意:副本数量可以随时修改。
可以通过下面命令进行修改
curl -XPUT 'localhost:9200/test2/' -d'{"settings":{"number_of_replicas":2}}'

数据重新分布机制
当es集群中新增或者删除节点的时候,会根据每个节点的负载重新对集群中的分片进行分配。

数据持久化方式
默认es中的索引文件是存储在本地的。还可以存储到分布式文件系统中,例如:hdfs

自动发现机制
es默认会把一个网段内的es实例组成一个集群,是通过多播协议,把一个网段之内的节点组成集群。

如何把不同网段的es实例组成一个es集群(修改ES_HOME/conf/elasticsearch.yml文件)
1:首先禁用自动发现机制
discovery.zen.ping.multicast.enabled: false
2:给新启动的节点指定能够发现的主节点的IP,在这可以指定IP,也可以指定IP+端口,
如果端口是默认值9300的话,可以省略。
discovery.zen.ping.unicast.hosts: ["10.11.52.131", "10.11.52.134:9300"]

通信协议
默认es各个节点之间通信是使用9300端口,使用http方式访问es的话需要使用9200端口

4:通过java代码操作es
首先需要添加es的maven依赖
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>1.4.4</version>
</dependency>

在建立索引的时候,如果使用了bean(对象)的方式,需要添加下面的依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.1.3</version>
</dependency>

具体的增删改查参考<EsTest.java>

查询类型-searchType
query_then_fetch:
默认es使用query_then_fetch,这种方式返回的数据量是正确的,但是,数据的相关性可能不是最准确的。
query_and_fetch
这种查询类型执行的速度是最快的,但是,返回的数据可能是需要的N倍,并且返回的数据相关性也不准确
dfs_query_then_fetch
这种查询速度相对来说是最慢的一个,但是,返回的数据量和数据相关性是最高的。
dfs_query_and_fetch
这种查询返回的数据量可能是需要的N倍,但是数据的相关性是准确的。

dfs:表示初始化散发的意思
具体意思就是在查询之前会多一个收集词频和文档频率的过程。这样可以保证查询的数据相关性是最高的。

总结一下,
从性能考虑QUERY_AND_FETCH是最快的,DFS_QUERY_THEN_FETCH是最慢的。
从搜索的准确度来说,DFS要比非DFS的准确度更高。

es的查询操作
主要是分页,排序,过滤,高亮,统计
这些参考代码<EsTest.java>

http://www.cnblogs.com/cxzdy/p/5127522.html

ElasticSearch0910学习的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

随机推荐

  1. iptalbes -F

    iptalbes -F -F, --flush [chain] Flush the selected chain (all the chains in the table if none is giv ...

  2. tcp流协议产生的粘包问题和解决方案

    我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体 ...

  3. cocos2dx 3.3 场景切出时RenderTexture crash

    在cocos2dx 3.3中下面myScene在切出时会存在概率性崩溃(代码作了最大程度简化,仅为说明问题): class CmyLayer:public Layer{ public: CmyLaye ...

  4. Kafka剖析:Kafka背景及架构介绍

    <Kafka剖析:Kafka背景及架构介绍> <Kafka设计解析:Kafka High Availability(上)> <Kafka设计解析:Kafka High A ...

  5. 【JavaWeb】(10)微信公众号开发进阶

    因为普通开发会有很多的权限限制,所以我们能够申请一个測试账号来开发体验一下微信公众号的其它接口功能. 申请測试号我就不介绍了.非常easy.申请成功后,还须要配置Url地址和token,和我们普通公众 ...

  6. JBoss DataGrid的集群部署与訪问

    集群部署 JDG的缓存模式包含本地(Local)模式和集群(Clustered)模式.本项目採用多节点的Clustered模式部署.数据在多个节点的子集间进行复制.而不是同步拷贝到全部的节点. 使用子 ...

  7. 并行开发系列 Plinq等

    http://www.cnblogs.com/huangxincheng/archive/2012/04/03/2430638.html

  8. static_cast、dynamic_cast、reinterpret_cast、和const_cast

    关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的<C++ 的设计和演化>.最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_ ...

  9. 每日英语:Best Ways to Ramp Up to A Marathon

    For the record number of American runners who completed an official race event last year, the questi ...

  10. python(28)获得网卡的IP地址,如何在其他文件夹中导入python模块

    获得第几块网卡的ip地址: 如何在其他文件夹中导入模块 import sys sys.path.append('/search/chen/tool')#你的代码存放的目录 from Get_Ip im ...