注:本文内容均来自《Elasticsearch权威指南》,是做读书笔记,同时做一个总结。
Elasticsearch是使用基于http的RestFul来实现和使用的,因此使用curl来测试。如果不使用curl,使用各种语言的对应http请求即可使用。
集群包含索引,索引包含类型,类型存储文档,文档具有属性
高可拓展、全文搜索、分析、存储
放入数据
curl -X PUT "localhost:9200/megacorp/employee/1" -H 'Content-Type: application/json' -d'
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
'
读取数据
curl -X GET "localhost:9200/megacorp/employee/1"
简单搜索
curl -X GET "localhost:9200/megacorp/employee/_search"
带参数简单搜索
curl -X GET "localhost:9200/megacorp/employee/_search?q=last_name:Smith"
查询表达式搜索
curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
带过滤器的搜索
curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
"query" : {
"bool": {
"must": {
"match" : {
"last_name" : "smith"
}
},
"filter": {
"range" : {
"age" : { "gt" : 30 }
}
}
}
}
}
'
全文搜索
此功能即可实现相关性搜索
curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
"query" : {
"match" : {
"about" : "rock climbing"
}
}
}
'
短语搜索
即精确搜索,使用此搜索模式将返回精确结果。
curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
'
高亮搜索
高亮显示搜索结果,会在搜索结果的匹配部分以封装。
curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
},
"highlight": {
"fields" : {
"about" : {}
}
}
}
'
分析
curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}
'
分析的同时搜索
这种方式会匹配match字段内的值,然后再进行分析。
curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"last_name": "smith"
}
},
"aggs": {
"all_interests": {
"terms": {
"field": "interests"
}
}
}
}
'
聚合分级汇总
按照排序进行分级分析并汇总。
curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
"aggs" : {
"all_interests" : {
"terms" : { "field" : "interests" },
"aggs" : {
"avg_age" : {
"avg" : { "field" : "age" }
}
}
}
}
}
'
放入文档
其中的website是索引,blog是类型,123是id。
使用此功能也能更新文档。
curl -X PUT "localhost:9200/website/blog/123" -H 'Content-Type: application/json' -d'
{
"title": "My first blog entry",
"text": "Just trying this out...",
"date": "2014/01/01"
}
'
因为使用上述方法,会对文档造成更新,而有时候我们并不想更新文档。所以也可以使用以下两种方法来进行创建:
第一种方法使用 op_type 查询 -字符串参数:
PUT /website/blog/123?op_type=create
{ ... }
第二种方法是在 URL 末端使用 /_create :
PUT /website/blog/123/_create
{ ... }
这样,在成功创建时,返回201,否则返回409冲突响应码。
自动生成id
curl -X POST "localhost:9200/website/blog/" -H 'Content-Type: application/json' -d'
{
"title": "My second blog entry",
"text": "Still trying this out...",
"date": "2014/01/01"
}
'
取回文档
curl -X GET "localhost:9200/website/blog/123?pretty"
检查文档是否存在
curl -i -XHEAD http://localhost:9200/website/blog/123
删除文档
curl -X DELETE "localhost:9200/website/blog/123"
对于并发有两种方式:
悲观并发控制
这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放置锁的线程能够对这行数据进行修改。乐观并发控制
Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关情况报告给用户。
乐观并发控制
指定版本号来修改应用。
curl -X PUT "localhost:9200/website/blog/1?version=1" -H 'Content-Type: application/json' -d'
{
"title": "My first blog entry",
"text": "Starting to get the hang of this..."
}
'
通过外部系统使用版本控制
curl -X PUT "localhost:9200/website/blog/2?version=5&version_type=external" -H 'Content-Type: application/json' -d'
{
"title": "My first external blog entry",
"text": "Starting to get the hang of this..."
}
'
文档的部分更新
curl -X POST "localhost:9200/website/blog/1/_update" -H 'Content-Type: application/json' -d'
{
"doc" : {
"tags" : [ "testing" ],
"views": 0
}
}
'
批量取回文档
curl -X GET "localhost:9200/_mget" -H 'Content-Type: application/json' -d'
{
"docs" : [
{
"_index" : "website",
"_type" : "blog",
"_id" : 2
},
{
"_index" : "website",
"_type" : "pageviews",
"_id" : 1,
"_source": "views"
}
]
}
'
使用默认的索引值甚至类型值,可以覆盖
curl -X GET "localhost:9200/website/blog/_mget" -H 'Content-Type: application/json' -d'
{
"docs" : [
{ "_id" : 2 },
{ "_type" : "pageviews", "_id" : 1 }
]
}
'
Elasticsearch使用十分简单方便,对于应用开发者,只需在Elasticsearch的基础上再集成自己的应用框架,即可轻松使用Elasticsearch,同时Elasticsearch也可作为NoSQL的存储方式来使用,即可以使用Elasticsearch来做存储和数据分析、检索等功能,实现上也非常强大。