发布网友
共2个回答
懂视网
Elasticsearch简介 ElasticSearch是一个开源的分布式搜索引擎,具备高可靠性,支持非常多的企业级搜索用例。是基于Lucene构建的。 支持时间时间索引和全文检索。它对外提供一系列基于java和http的api,用于索引、检索、修改大多数配置。 ElasticSearch是基于
Elasticsearch简介
ElasticSearch是一个开源的分布式搜索引擎,具备高可靠性,支持非常多的企业级搜索用例。是基于Lucene构建的。
支持时间时间索引和全文检索。它对外提供一系列基于java和http的api,用于索引、检索、修改大多数配置。
ElasticSearch是基于lucence开发的,也就是运行需要java jdk支持。所以需要配置好java的环境变量
Elasticsearch启动
1.视窗7版桌面环境,运行命令行,进入 cd D:elasticsearchin 目录。
2.这时运行 elasticsearch.bat(或者直接双击elasticsearch.bat运行)
3.上面在本机启动了一个ElasticSearch节点。 会看到下面的记录提示
4. 现在在浏览器里测试一下
如果你得到的status是200那它意味着所有的事情都没问题
让我们看看JSON的每个字段代表的含义:
Ok:当为true时,意味着请求成功。
Status:发出请求后的HTTP的错误代码。200表示一切正常。
Name:我们Elasticsearch实例的名字。在默认情况下,它将从一个巨长的名字列表中随机选择一个。
Version:这个对象有一个number字段,代表了当前运行的Elasticsearch版本号,和一个Snapshot_build字段,代表了你当前运行的版本是否是从源代码构建而来。
Tagline:包含了Elasticsearch的第一个tagline: "You Know, for Search."
5. 现在让我们从http://mobz.github.io/elasticsearch-head/ 安装ElasticSearch Head插件
安装方法非常简单
plugin -install mobz/elasticsearch-head
上面的命令会把 elasticsearch-head插件装到你的环境里,并且会下载文件,如图所示:
进入http://localhost:9200/_plugin/head/ 如下图:
热心网友
今天细说一下elasticsearch的update更新功能,以及如何利用script脚本更新数据。
想要使用script脚本功能,需要在配置文件elasticsearch.yml里设置
Python
script.disable_dynamic: false
关于elasticsearch script的文章,总是会没完没了的修改
ES支持更新,但是更新的方式是通过一个提供的脚本进行的。ES的做法是,通过
index找到相应的存放记录的节点,然后执行脚本,执行完之后,返回新的索引。实际上执行的是一个get和reindex的过程,在这个过程中,通过
versioning来控制没有其它的更新操作(这个功能是0.19后可用的)。具体实现的原理应该和elasticsearch
Versioning相关。
get,reindex的含义是,ES先取出这条记录,然后根据新数据生成新记录,然后在把新记录放回到ES中(并不会覆盖老的记录)。
现在没有数据,首先我们需要创建一条记录
Python
$ curl -XPUT localhost:9200/xiaorui.cc/blog/1 -d '{
"counter" : 1,
"tags" : ["red"]
}'
$ curl -XPUT localhost:9200/xiaorui.cc/blog/1 -d '{
"counter" : 1,
"tags" : ["red"]
}'
直接修改数据,一定要注意,直接update的化,会覆盖以前的数据,另外update的时候,需要/index/type/id ,一定要带着id。 elasticsearch 应该不支持搜索query方式update修改数据。
Python
curl -XPUT 'localhost:9200/xiaorui.cc/blog/1?pretty' -d '
{
"name": "xiaorui.cc"
}'
curl -XPUT 'localhost:9200/xiaorui.cc/blog/1?pretty' -d '
{
"name": "xiaorui.cc"
}'
elasticsearch提供了doc这个局部更新参数,他可以局部修改,而不会直接覆盖以前的数据,这会针对特定的k v,字段修改。
Python
curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update?pretty' -d '
{
"doc": { "name": "ruifengyun" }
}'
curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update?pretty' -d '
{
"doc": { "name": "ruifengyun" }
}'
当Elasticsearch API不能满足要求时,Elasticsearch允许你使用脚本实现自己的逻辑。脚本支持非常多的API,例如搜索、排序、聚合和文档更新。脚本可以通过请求的一部分、检索特殊的.scripts索引或者从磁盘加载方式执行。
下面是es script的用法,这些脚本是groovy开发的。 下面的语句的意思是说,将counter的值加4
Python
$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{
"script" : "ctx._source.counter += count",
"params" : {
"count" : 4
}
}'
$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{
"script" : "ctx._source.counter += count",
"params" : {
"count" : 4
}
}'
通过上面的例子,我们知道tags是个列表,如果用doc局部更新的语法,他是无法做到append的,还是会覆盖tags这个字段。 那么怎么实现列表扩展? 请使用elasticsearch script实现。
Python
$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{
"script" : "ctx._source.tags += tag",
"params" : {
"tag" : "white"
}
}'
$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{
"script" : "ctx._source.tags += tag",
"params" : {
"tag" : "white"
}
}'
_update也支持upsert功能,没有这个字段或者key,也会添加这个记录。下面是一个例子,如果没有counter字段,则插入该字段:
Python
$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{
"script" : "ctx._source.counter += count",
"params" : {
"count" : 4
},
"upsert" : {
"counter" : 1
}
}'
$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{
"script" : "ctx._source.counter += count",
"params" : {
"count" : 4
},
"upsert" : {
"counter" : 1
}
}'
下面我们来复杂点的groovy script脚本用法. 当你的source没有china这个key,那么我会增加一个kv
Python
curl -XPOST "" -d'
{
"script": "if (!ctx._source.containsKey(\"china\")) { ctx._source.attending = newField }",
"params" : {"newField" : "blue" },
"myfield": "data"
}'
curl -XPOST "" -d'
{
"script": "if (!ctx._source.containsKey(\"china\")) { ctx._source.attending = newField }",
"params" : {"newField" : "blue" },
"myfield": "data"
}'
下面的script语法相对复杂的,会遍历一组字典,然后进行判断赋值。
{
“55555″: 22,
“name”: “lisi”,
“distr_pan”: [
{
“k”: 15,
“v”: 15
},
{
“k”: 20,
“v”: 20
}
]
}
Python
$ curl -XPUT 'localhost:9200/xiaorui.cc/blog/9123/_update' -d '
{
"script" : "def x = false;ctx._source.distr_pan.each({if(it.get('k')==target){x=true}});if(x){ctx._source.distr_pan +=v}",
"params":{
"v":{"k":nlp, "v":35},
"target":15
}
}
$ curl -XPUT 'localhost:9200/xiaorui.cc/blog/9123/_update' -d '
{
"script" : "def x = false;ctx._source.distr_pan.each({if(it.get('k')==target){x=true}});if(x){ctx._source.distr_pan +=v}",
"params":{
"v":{"k":nlp, "v":35},
"target":15
}
}
elasticsearch script就讲解到这里了,很多例子已经简单明了…
script貌似不是很安全,最少远程代码执行的漏洞暴露过几次了. 下次把python版的script走一遍试试.
貌似对于我们你者来说,不管是groovy python,没什么太大却别,语法看起来都一个模子。