有哪些大厂商在使用elasticsearch?
1. 维基百科使用Elasticsearch提供全文搜索并高亮关键字,以及输入实时搜索(search-as-you-type)和搜索纠错(did-youmean)
等搜索建议功能。
2. 英国卫报使用Elasticsearch结合用户日志和社交网络数据提供给他们的编辑以实时的反馈,以便及时了解公众对新发表
的文章的回应
3. StackOverflow结合全文搜索与地理位置查询,以及more-like-this功能来找到相关的问题和答案。
4. Github使用Elasticsearch检索1300亿行的代码。
为了搜索
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最
先进、性能最好的、功能最全的搜索引擎库。
安装监控工具marvel
安装方法:todo
集群和节点
节点(node)是一个运行着的Elasticsearch实例
集群(cluster)是一组具有相同 cluster.name 的节点集合
和传统关系型数据库概念对比
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
查询操作:
查询、过滤、全文搜索、短语搜索、高亮、相关性评分、分析(聚合)
集群健康状态
green 所有主要分片和复制分片都可用
yellow 所有主要分片可用,但不是所有复制分片都可用
red 不是所有的主要分片都可用
分片概念
分片就是一个Lucene实例。节点、主分片(一开始就确定)、复制分片
默认情况下,一个索引被分配5个主分片、
ES集群命令
查看集群状态:curl 'http://127.0.0.1:9200/_cluster/health?pretty'
更多命令:todo
版本控制
外部版本号与之前说的内部版本号在处理的时候有些不同。它不再检查当前最新的 _version 是否与请求中指定的一致,而是检查是否小
于指定的版本。如果请求成功,外部版本号就会被存储到 _version 中。
ES脚本
Groovy
检索多个文档
mget
批量操作
mget 允许我们一次性检索多个文档一样, bulk API允许我们使用单一请求来实现多个文档
POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title": "My first blog post" }
{ "index": { "_index": "website", "_type": "blog" }}
{ "title": "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} }
整个批量请求需要被加载到接受我们请求节点的内存里,所以请求越大,给其它请求可用的内存就越小。有一个最佳
的 bulk 请求大小。超过这个大小,性能不再提升而且可能降低。
最佳大小,当然并不是一个固定的数字。它完全取决于你的硬件、你文档的大小和复杂度以及索引和搜索的负载。幸运的
是,这个最佳点(sweetspot)还是容易找到的:
试着批量索引标准的文档,随着大小的增长,当性能开始降低,说明你每个批次的大小太大了。开始的数量可以在
1000~5000个文档之间,如果你的文档非常大,可以使用较小的批次。
通常着眼于你请求批次的物理大小是非常有用的。一千个1kB的文档和一千个1MB的文档大不相同。一个好的批次最好保持
在5-15MB大小间。