GVKun编程网logo

如何处理Elasticsearch索引延迟(elasticsearch 索引)

14

此处将为大家介绍关于如何处理Elasticsearch索引延迟的详细内容,并且为您解答有关elasticsearch索引的相关问题,此外,我们还将为您介绍关于5-ElasticSearch索引备份、e

此处将为大家介绍关于如何处理Elasticsearch索引延迟的详细内容,并且为您解答有关elasticsearch 索引的相关问题,此外,我们还将为您介绍关于5-ElasticSearch索引备份、elasticsearch索引、ElasticSearch索引Unix时间戳、Elasticsearch索引上次更新时间的有用信息。

本文目录一览:

如何处理Elasticsearch索引延迟(elasticsearch 索引)

如何处理Elasticsearch索引延迟(elasticsearch 索引)

这是我的情况:

我有一个包含用户列表的页面。我通过Web界面创建一个新用户,并将其保存到服务器。服务器在elasticsearch中为文档建立索引并成功返回。然后,我被重定向到不包含新用户的列表页面,因为它可能需要1秒钟的时间才能使文档在Elasticsearch中可供搜索

elasticsearch中的近实时搜索。

elasticsearch指南说您可以手动刷新索引,但说在生产中不要这样做。

…不要在每次在生产环境中为文档编制索引时进行手动刷新;这会损害您的表现。相反,您的应用程序需要了解Elasticsearch的近实时性并为此留出余地。

我想知道其他人如何解决这个问题?我希望有一个事件或可以听的东西告诉我何时可以搜索该文档,但似乎没有类似的东西。仅等待1秒是合理的,但似乎是个坏主意,因为它可能花费的时间要少得多。

谢谢!

答案1

小编典典

即使可以强制ES刷新自身,您也已经正确注意到它可能会损害性能。解决此问题以及人们经常做的事情(包括我自己)的解决方案是给人一种 实时
错觉 。最后,这仅是用户体验的挑战,而不是真正的技术限制。

重定向到用户列表时,您可以人为地将刚创建的新记录包括在用户列表中,就像该记录是ES本身返回的一样。没有什么可以阻止您这样做的。而且,当您决定刷新页面时,ES会正确返回新的用户记录,并且没人在乎该记录的来源,此时用户所关心的只是他想查看新记录,他刚刚创建,只是因为我们习惯于顺序思考。

实现此目的的另一种方法是,重新加载一个空的用户列表框架,然后通过Ajax或其他异步方法,检索用户列表并显示它。

还有另一种方法是在UI上提供视觉提示/线索,表明在后台发生了某些事情,并且预计很快就会有更新。

最后,一切归结为不是让用户惊讶,而是给他们足够的线索,以了解发生了什么,正在发生什么以及他们仍应该期望发生什么。

更新

出于完整性考虑,此答案早于ES5,后者引入了一种方法,以确保在搜索索引或返回错误代码后文档可见之前,索引调用不会返回。通过?refresh=wait_for在索引数据时使用,可以确定ES响应时,新数据将被索引。

5-ElasticSearch索引备份

5-ElasticSearch索引备份

1,安装Node.js

# 解压
tar -zxvf  node-v12.18.3-linux-x64.tar.xz -C /home/install
# 配置环境变量
vi /etc/profile
# 追加如下内容
export NODEJS_HOME=/home/install/node-v12.18.3-linux-x64
export NODEJS_PATH=$NODEJS_HOME/lib/node_modules
export PATH=$NODEJS_HOME/bin:$PATH
# 刷新环境变量
source /etc/profile
# 测试
npm -v
node -v

2,安装elasticdump

具体的参数细节可以参考elasticdump官网,其实也包含详细的使用细节。
  • 在线安装
npm install elasticdump -g
  • 使用离线缓存安装的方式
# 解压缓存包,是在编写当前文档的时候保存的,如果失效了,在本地再生成一份即可
tar -xvf npm-cache.tar
# 进入node下的lib目录执行安装命令
npm install --cache /root/.npm --optional --cache-min 99999999999 --shrinkwrap false elasticdump
# 建立文件软连接到系统命令,如果elasticdump不在这个目录下,可以使用一下命令查找find / -name ''elasticdump''
ln -s /home/install/node-v12.18.3-linux-x64/node-v10.13.0-linux-x64/lib/node_modules/elasticdump/bin/elasticdump /usr/bin/elasticdump
# 验证
elasticdump --help

3,简单使用案例

# 备份索引
elasticdump --input=http://192.168.73.156:9200/item  --output=/home/elasticsearch/bakDemo/item_mapping.json --type=mapping 
# 备份数据
elasticdump --input=http://192.168.73.156:9200/item  --output=/home/elasticsearch/bakDemo/item_data.json --type=data

# 还原索引
elasticdump --input=/home/elasticsearch/bakDemo/item_mapping.json --output=http://192.168.73.156:9200/item --type=mapping
# 还原数据
elasticdump --input=/home/elasticsearch/bakDemo/item_data.json --output=http://192.168.73.156:9200/item --type=data

4,全量备份与还原

# 创建导出的目录,需要保持为空
mkdir /home/es_backup
# 执行导出命令
# 注意"--ignoreChildError"参数:ignoreChildError allows multi-elasticdump to continue if a child throws an error.
multielasticdump \
  --direction=dump \
  --match=''^.*$'' \
  --ignoreChildError \
  --input=http://192.168.73.156:9200 \
  --output=/home/es_backup 
# 执行还原命令
# 注意:这里测试还原的版本是5.6.14,所以还是需要template的,但是本身在导出的文件中不包含template文件,所以这里使用ignoreType选项在导入的时候忽略掉
multielasticdump \
  --direction=load \
  --ignoreChildError \
  --input=/home/es_backup \
  --ignoreType=''template'' \
  --output=http://192.168.73.156:9200

elasticsearch索引

elasticsearch索引

elasticsearch索引


为了将数据添加到ES,我们需要索引,索引是一个存储关联数据的地方。实际上,索引只是一个用来指定一个或多个分片的“逻辑命名空间”,可以理解为MySQL中的一个数据库的概念。 

ElasticSearch索引Unix时间戳

ElasticSearch索引Unix时间戳

我必须索引包含“时间”字段的文档,该字段的值是一个整数,表示自纪元以来的秒数(又称为Unix时间戳)。

我一直在阅读ES文档,发现了这一点:

http://www.elasticsearch.org/guide/reference/mapping/date-
format.html

但是似乎如果我要提交unix时间戳并将其存储在“日期”字段中(整数字段对我没有用),我只有两个选择:

  • 实施我自己的日期格式
  • 在发送方转换为支持的格式

我还有其他选择吗?

谢谢!

答案1

小编典典

如果您提供一个映射来告诉ES字段是一个日期,则可以使用纪元毫秒作为输入。如果要ES自动检测,则必须提供ISO8601或其他可发现的格式。

更新:我还应该注意,您可以影响ES在映射中将哪些字符串识别为日期。http://www.elastic.co/guide/zh-
CN/elasticsearch/reference/current/mapping-date-
format.html

Elasticsearch索引上次更新时间

Elasticsearch索引上次更新时间

有没有一种方法可以从ElasticSearch中检索有关特定索引的最新更新时间的信息?我的目标是能够知道什么时候是最后一次在索引中插入/更新/删除任何文档。如果无法做到这一点,是否可以在索引修改请求中添加一些内容,以便稍后提供此信息?

答案1

小编典典

您可以从_timestamp获取修改时间

为了更轻松地返回时间戳,您可以设置Elasticsearch来存储它:

curl -XPUT "http://localhost:9200/myindex/mytype/_mapping" -d''{  "mytype": {      "_timestamp": {          "enabled": "true",          "store": "yes"      }  }}''

如果插入文档然后对其进行查询,则会得到时间戳记:

 curl -XGET ''http://localhost:9200/myindex/mytype/_search?pretty'' -d ''{>  fields : ["_timestamp"],>    "query": {>     "query_string": { "query":"*"}>    }> }''{   "took" : 7,  "timed_out" : false,  "_shards" : {    "total" : 5,    "successful" : 5,    "failed" : 0  },  "hits" : {     "total" : 1,     "max_score" : 1.0,     "hits" : [ {       "_index" : "myindex",       "_type" : "mytype",       "_id" : "1",       "_score" : 1.0,       "fields" : {        "_timestamp" : 1417599223918      }    } ]  }}

更新现有文档:

curl -XPOST "http://localhost:9200/myindex/mytype/1/_update" -d''{  "doc" : {      "field1": "data",      "field2": "more data"  },  "doc_as_upsert" : true}''

重新运行上一个查询将向我显示一个更新的时间戳:

  "fields" : {    "_timestamp" : 1417599620167  }

今天的关于如何处理Elasticsearch索引延迟elasticsearch 索引的分享已经结束,谢谢您的关注,如果想了解更多关于5-ElasticSearch索引备份、elasticsearch索引、ElasticSearch索引Unix时间戳、Elasticsearch索引上次更新时间的相关知识,请在本站进行查询。

本文标签: