elasticsearch

elasticsearch

es数据迁移

Elasticsearchlaoyang360 回复了问题 • 3 人关注 • 2 个回复 • 42 次浏览 • 9 小时前 • 来自相关话题

萌新请问,elasticsearch FieldIndex的问题

回复

Elasticsearchgaomomo 发起了问题 • 1 人关注 • 0 个回复 • 25 次浏览 • 13 小时前 • 来自相关话题

_validate/query?explain解释

Elasticsearchhnj1575565068 发表了文章 • 0 个评论 • 24 次浏览 • 18 小时前 • 来自相关话题

使用_validate/query?explain API得到的结果如下,Synonym是什么意思啊?同义词吗?求解释{   "valid": true,   "_shards": {     "total": 1,     "successful": 1,     "failed": 0   },   "explanations": [     {       "index": "country",       "valid": true,       "explanation": "name:z Synonym(name:g name:zg)"     }   ] }
使用_validate/query?explain API得到的结果如下,Synonym是什么意思啊?同义词吗?求解释{   "valid": true,   "_shards": {     "total": 1,     "successful": 1,     "failed": 0   },   "explanations": [     {       "index": "country",       "valid": true,       "explanation": "name:z Synonym(name:g name:zg)"     }   ] }

倒排索引 数字和日期类型的问题

Elasticsearchcodepub 回复了问题 • 4 人关注 • 3 个回复 • 335 次浏览 • 1 天前 • 来自相关话题

GEO query 查询报错

回复

Elasticsearchxuewb_1024 发起了问题 • 1 人关注 • 0 个回复 • 43 次浏览 • 1 天前 • 来自相关话题

使用terms等bucket aggregations进行聚合后,如何看到bucket内文档的全部字段?

Elasticsearchliyh122 回复了问题 • 2 人关注 • 2 个回复 • 40 次浏览 • 1 天前 • 来自相关话题

看到一个词语提取小工具,分享给有标签、词库需求的TX们

Elasticsearchtc 发表了文章 • 0 个评论 • 53 次浏览 • 1 天前 • 来自相关话题

ES搭建失败 Kibana 没法创建mapping

回复

Kibanabeny 发起了问题 • 1 人关注 • 0 个回复 • 66 次浏览 • 2 天前 • 来自相关话题

elasticsearch创建祖孙三层数据模型,报错illegal_argument_exception

回复

ElasticsearchPhoebM 发起了问题 • 1 人关注 • 0 个回复 • 43 次浏览 • 2 天前 • 来自相关话题

ES的数据存储在服务器中超过85%

ElasticsearchJackGe 回复了问题 • 3 人关注 • 2 个回复 • 85 次浏览 • 4 天前 • 来自相关话题

es监控业务数据做时间聚合,索引方案

Elasticsearchlaoyang360 回复了问题 • 3 人关注 • 2 个回复 • 88 次浏览 • 4 天前 • 来自相关话题

索引某个shard无法恢复的问题

Elasticsearchguopeng7216 回复了问题 • 5 人关注 • 4 个回复 • 132 次浏览 • 4 天前 • 来自相关话题

10亿数据,索引分配与 搜索速度优化

回复

Elasticsearch匿名用户 发起了问题 • 1 人关注 • 0 个回复 • 117 次浏览 • 4 天前 • 来自相关话题

es集群中某一个节点忽然 bulk queue full

Elasticsearchshjdwxy 回复了问题 • 3 人关注 • 3 个回复 • 122 次浏览 • 4 天前 • 来自相关话题

Eleastic每个节点查询到的_cluster/stats[fs]的值不一样

Elasticsearchl0calh0st 回复了问题 • 3 人关注 • 5 个回复 • 197 次浏览 • 4 天前 • 来自相关话题

es数据迁移

回复

Elasticsearchlaoyang360 回复了问题 • 3 人关注 • 2 个回复 • 42 次浏览 • 9 小时前 • 来自相关话题

萌新请问,elasticsearch FieldIndex的问题

回复

Elasticsearchgaomomo 发起了问题 • 1 人关注 • 0 个回复 • 25 次浏览 • 13 小时前 • 来自相关话题

倒排索引 数字和日期类型的问题

回复

Elasticsearchcodepub 回复了问题 • 4 人关注 • 3 个回复 • 335 次浏览 • 1 天前 • 来自相关话题

GEO query 查询报错

回复

Elasticsearchxuewb_1024 发起了问题 • 1 人关注 • 0 个回复 • 43 次浏览 • 1 天前 • 来自相关话题

使用terms等bucket aggregations进行聚合后,如何看到bucket内文档的全部字段?

回复

Elasticsearchliyh122 回复了问题 • 2 人关注 • 2 个回复 • 40 次浏览 • 1 天前 • 来自相关话题

ES搭建失败 Kibana 没法创建mapping

回复

Kibanabeny 发起了问题 • 1 人关注 • 0 个回复 • 66 次浏览 • 2 天前 • 来自相关话题

elasticsearch创建祖孙三层数据模型,报错illegal_argument_exception

回复

ElasticsearchPhoebM 发起了问题 • 1 人关注 • 0 个回复 • 43 次浏览 • 2 天前 • 来自相关话题

ES的数据存储在服务器中超过85%

回复

ElasticsearchJackGe 回复了问题 • 3 人关注 • 2 个回复 • 85 次浏览 • 4 天前 • 来自相关话题

es监控业务数据做时间聚合,索引方案

回复

Elasticsearchlaoyang360 回复了问题 • 3 人关注 • 2 个回复 • 88 次浏览 • 4 天前 • 来自相关话题

索引某个shard无法恢复的问题

回复

Elasticsearchguopeng7216 回复了问题 • 5 人关注 • 4 个回复 • 132 次浏览 • 4 天前 • 来自相关话题

10亿数据,索引分配与 搜索速度优化

回复

Elasticsearch匿名用户 发起了问题 • 1 人关注 • 0 个回复 • 117 次浏览 • 4 天前 • 来自相关话题

es集群中某一个节点忽然 bulk queue full

回复

Elasticsearchshjdwxy 回复了问题 • 3 人关注 • 3 个回复 • 122 次浏览 • 4 天前 • 来自相关话题

Eleastic每个节点查询到的_cluster/stats[fs]的值不一样

回复

Elasticsearchl0calh0st 回复了问题 • 3 人关注 • 5 个回复 • 197 次浏览 • 4 天前 • 来自相关话题

elasticsearch ik 中文分词后,命中数据很诡异

回复

Elasticsearchweiwosuoai 发起了问题 • 2 人关注 • 0 个回复 • 106 次浏览 • 5 天前 • 来自相关话题

java如何创建mapping

回复

Elasticsearchxinfanwang 回复了问题 • 3 人关注 • 4 个回复 • 100 次浏览 • 5 天前 • 来自相关话题

_validate/query?explain解释

Elasticsearchhnj1575565068 发表了文章 • 0 个评论 • 24 次浏览 • 18 小时前 • 来自相关话题

使用_validate/query?explain API得到的结果如下,Synonym是什么意思啊?同义词吗?求解释{   "valid": true,   "_shards": {     "total": 1,     "successful": 1,     "failed": 0   },   "explanations": [     {       "index": "country",       "valid": true,       "explanation": "name:z Synonym(name:g name:zg)"     }   ] }
使用_validate/query?explain API得到的结果如下,Synonym是什么意思啊?同义词吗?求解释{   "valid": true,   "_shards": {     "total": 1,     "successful": 1,     "failed": 0   },   "explanations": [     {       "index": "country",       "valid": true,       "explanation": "name:z Synonym(name:g name:zg)"     }   ] }

看到一个词语提取小工具,分享给有标签、词库需求的TX们

Elasticsearchtc 发表了文章 • 0 个评论 • 53 次浏览 • 1 天前 • 来自相关话题

【东家·守艺人】ElasticSearch (ELK) 资深开发工程师(杭州)

求职招聘惜朝 发表了文章 • 0 个评论 • 101 次浏览 • 5 天前 • 来自相关话题

职位描述

  1. 构建基于ElasticSearch(ES)的实时数据分析平台;
  2. 负责个性化搜索、个性化推荐系统的架构和服务;

岗位要求

  1. 熟悉Java开发,包括常用中间件:Dubbo、Zookeeper、MySQL、Redis、MongoDB等;
  2. 熟悉ElasticSearch(ES)/Solr/Lucence原理;
  3. 有ElasticSearch(ES)/Solr/Lucence 工程应用经验丰富;
  4. 有搜索相关功能性能调优优先;

工作地址

杭州 - 西湖区 - 文一西路崇义路口公元里13幢2楼

联系我

职位描述

  1. 构建基于ElasticSearch(ES)的实时数据分析平台;
  2. 负责个性化搜索、个性化推荐系统的架构和服务;

岗位要求

  1. 熟悉Java开发,包括常用中间件:Dubbo、Zookeeper、MySQL、Redis、MongoDB等;
  2. 熟悉ElasticSearch(ES)/Solr/Lucence原理;
  3. 有ElasticSearch(ES)/Solr/Lucence 工程应用经验丰富;
  4. 有搜索相关功能性能调优优先;

工作地址

杭州 - 西湖区 - 文一西路崇义路口公元里13幢2楼

联系我

《死磕 Elasticsearch 方法论》:普通程序员高效精进的 10 大狠招!(完整版)

Elasticsearchlaoyang360 发表了文章 • 0 个评论 • 3185 次浏览 • 2018-04-05 00:01 • 来自相关话题

0、授人以渔,少走半年弯路!

死磕 Elasticsearch 方法论:普通程序员高效精进的 10 大狠招!

一、Elasitcsearch基础篇

1.1 Elasitcsearch基础认知

1、Elasticsearch学习,请先看这一篇!
2、Elasticsearch增、删、改、查操作深入详解
3、Elasticsearch 索引存储深入详解

1.2 Elasticsearch集群部署

4、Elasticsearch安装与测试验证详解
5、Elasticsearch windows下一键安装实现深入详解
6、Elasticsearch集群部署详解
7、Elasticsearch5.4.0(head/kibana/logstash)安装部署深入详解

1.3 Elasticsearch 插件安装

8、Elasticsearch插件一——-head插件安装详解
9、Elasticsearch插件二—— kibana插件安装详解
10、Elasticsearch插件三—— Marvel插件安装详解
11、Elasticsearch插件四—— logstash插件安装详解
12、Elasticsearch插件五—— graph插件安装详解
13、Elasticsearch插件六—— 分词 IK analyzer插件安装详解
14、Elasticsearch5.4.0 IK分词插件安装详解

1.4 Elasticsearch小试牛刀

15、ES技术团队划重点 | ES5.X,你必须知道的API和相关技巧
16、Elasticsearch检索分类深入详解—基础篇
17、上线必备 | 高性能ES5.X部署配置清单
18、 Elasticsearch究竟要设置多少分片数?
19、深究|Elasticsearch单字段支持的最大字符数?
20、Elasticsearch6.X 新类型Join深入详解

二、Elasticsearch进阶篇

2.1 Elasitcsearch数据同步

2.1.1 ES与关系型数据库同步
21、logstash-input-jdbc实现mysql 与elasticsearch实时同步深入详解
22、elasticsearch-jdbc实现MySQL同步到ElasticSearch深入详解
23、go-mysql-elasticsearch实现mysql 与elasticsearch实时同步深入详解
24、mysql 与elasticsearch实时同步常用插件及优缺点对比
25、logstash-input-jdbc 同步原理及相关问题解读
26、 logstash-input-jdbc实现oracle 与elasticsearch实时同步详解
27、logstash一次同步Mysql多张表到ES深入详解
2.1.2 ES与非关系型数据库同步
28、 logstash_output_mongodb插件用途及安装详解
29、 logstash-output-mongodb实现Mysql到Mongodb数据同步
30、logstash-out-mongodb实现elasticsearch到Mongodb的数据同步
31、mongo-connector实现MongoDB与elasticsearch实时同步深入详解
2.1.3 ES与Kafka同步
32、kafka数据同步Elasticsearch深入详解
2.1.4 ES文件同步
33、 Elasticsearch批量导入本地Json文件Java实现
34、logstash实现日志文件同步到elasticsearch深入详解
2.1.5 ES同步小结
35、如何将不同类型数据导入Elaticsearch中?
36、一张图理清楚关系型/非关系型数据库与Elasticsearch同步

2.2 Elasticsearch检索进阶

37、你必须知道的23个最有用的Elasticseaerch检索技巧
38、Elasticsearch实战 | match_phrase搜不出来,怎么办?

2.3 Elasitcsearch聚合进阶

39、 Elasticsearch聚合深入详解——对比Mysql实现
40、Elasticsearch聚合后分页深入详解
41、Elasticsearch聚合优化 | 聚合速度提升5倍

2.4 Elasticsearch Java API 详解

42、 Elasticsearch Java API深入详解
43、Elasticsearch Jest实战深入详解

2.5 Elasitcsearch数据迁移

44、Elasticsearch索引迁移的四种方式

2.6 Elasticsearch性能测试

45、 Elasticsearch自定义脚本完成性能测试
46、Elasticsearch性能测试工具rally深入详解
47、esrally性能分析结果图形化展示深入详解
48、esrally性能测试原理

2.7 Elasitcsearch安全监控

49、Elasticsearch6.2.2 X-Pack部署及使用详解

三、Elasticsearch实战篇

3.1 Elasticsearch应用场景

50、Elasticsearch的使用场景深入详解
51、 Elasticsearch全文检索实战小结

3.2 Elasticsearch架构设计

52、 Elasticsearch实战——全文检索架构设计
53、干货 |《深入理解Elasticsearch》读书笔记

3.3 Elasticsearch项目实战

54、Elasticsearch全文检索系统实现深入详解
55、 Elasticsearch大文件检索性能提升20倍实践(干货)
56、刨根问底 | Elasticsearch 5.X集群多节点角色配置深入详解
57、干货 | Elasticsearch5.X Mapping万能模板
58、干货 | Elasticsearch 集群健康值红色终极解决方案
59、 实战 | Elasticsearch打造知识库检索系统
60、Elasticsearch实战 | 必要的时候,还得空间换时间!
61、 Elasticsearch全量数据增量遍历实现原理
62、 Elasticsearch索引增量统计及定时邮件实现

更多干货,持续更新中..... 更新地址:http://t.cn/Rmwzx9t

和你一起,死磕ELK Stack!

ES数据备份和清理-快照

Elasticsearchziyou 发表了文章 • 0 个评论 • 84 次浏览 • 2018-04-04 17:41 • 来自相关话题

        这两天在看ES数据备份方面的事情,因为我们ES集群的存储空间有限,需要定时对ES的数据进行备份和清理,把备份的数据存储到其他地方去,然后在ES集群中释放掉。         看大家好多是主要考虑数据的安全性才做的数据的备份,我们就比较low了,我们就是因硬盘不够,要删数据。上个项目是因为日志数据重要程度一般般,就保留了一个月的量,然后也没有做数据的备份转储。这次上线的项目要求就高点了,需要删除的数据存储到其他地方,但是硬盘的容量更低了。所以就需要做ES数据备份和转储,转储完了就清掉。         这里是用ES官方推荐的数据快照方案,这个方案可以完全通过ES API进行操作,比价方便、快捷,在数据恢复方面也是方便的。 先上ES官方的链接,大家看看:https://www.elastic.co/guide/e ... .html         然后就是步骤了: 执行过程分为两部分: 一、准备过程 1、添加ES备份存储目录 在集群的每台机器上进行目录创建 mkdir /home/esdata 2、挂载共享文件存储目录 在集群的每台机器上目录挂载 mount -t nfs 10.70.61.80:/home/apmtest /home/esdata 3、修改ES集群配置 在ES集群的每台机器上都添加path.repo属性 path.repo: ["/home/esdata"] 4、重启ES集群 ES集群重启必须是关闭所有机器后,再启动。 5、建立备份仓库 PUT /_snapshot/my_backup    {      "type": "fs",        "settings": {          "location": "/home/esdata"        }  } 二、备份数据快照 1、通过API执行备份 PUT /_snapshot/my_backup/snapshot_2018.03.01?wait_for_completion=true  {      "indices": "filebeat-2018.03.01"  }           快照仓库需要注意的地方就是需要在整个集群的每一台机器上挂载相同的共享文件存储目录,保证在集群里做的操作是输出到相同的地方的。   下面来一份shell脚本,可以定时执行,是做ES数据的定时转储和清理的,大家可以借鉴一下
#!/bin/bash
ESIP=127.0.0.1
DATE=`date -d '-2 days' +'%Y.%m.%d'`
 
echo "begin to backup ES LOG..."
 
curl -XPUT "http://$ESIP:9200/_snapshot/my_backup/snapshot_$DATE?wait_for_completion=true" -d '{ "indices": "filebeat-$DATE" }'
 
echo "----------------------------------------------------------------------------"
 
echo "begin to clean ES LOG..."
 
URL1="http://$ESIP:9200/filebeat-$DATE"
 
curl -XDELETE $URL1

 
echo "TRANSFER AND CLEAN ES LOG END!"

php的操作类库,通过写sql来转化dsl来查询elasticsearch

Elasticsearchqieangel2013 发表了文章 • 1 个评论 • 545 次浏览 • 2018-03-21 15:44 • 来自相关话题

EsParser

php的操作类库,通过写sql来转化dsl来查询elasticsearch

composer使用

{
    "require": {
        "qieangel2013/esparser": "dev-master"
    }
}
composer install
require __DIR__.'/vendor/autoload.php';
$sql = 'select * from alp_dish_sales_saas where sid in(994,290) limit 1,10';
//$sql='update alp_dish_sales_saas set mid=3  where adsid=15125110';
//$sql='delete from alp_dish_sales_saas where adsid=15546509';
$es_config=array(
    'index' =>"alp_dish_sales_saas",
    'type'  =>"alp_dish_sales_saas",
    'url'   =>"http://127.0.0.1:9200",
    'version' =>"5.x" //1.x 2.x 5.x 6.x,可以不配置,系统会请求获取版本,这样会多一次请求,建议配置一下
 );
$parser = new EsParser($sql, true,$es_config);//第三个参数是es的配置参数,一定要配置
print_r($parser->result);//打印结果
//print_r($parser->explain());//打印dsl

普通调用

require_once dirname(__FILE__) . '/src/library/EsParser.php';
$sql = 'select * from alp_dish_sales_saas where sid in(994,290) limit 1,10';
//$sql='update alp_dish_sales_saas set mid=3  where adsid=15125110';
//$sql='delete from alp_dish_sales_saas where adsid=15546509';
$es_config=array(
        'index' =>"alp_dish_sales_saas",
        'type'  =>"alp_dish_sales_saas",
        'url'   =>"http://127.0.0.1:9200",
        'version' =>"5.x" //1.x 2.x 5.x 6.x,可以不配置,系统会请求获取版本,这样会多一次请求,建议配置一下
    );
$parser = new EsParser($sql, true,$es_config);//第三个参数是es的配置参数,一定要配置
print_r($parser->result);//打印结果
//print_r($parser->explain()); //打印dsl

目前支持的sql函数

*  SQL Select
*  SQL Delete
*  SQL Update
*  SQL Where
*  SQL Order By
*  SQL Group By
*  SQL AND & OR 
*  SQL Like
*  SQL COUNT distinct
*  SQL In
*  SQL avg()
*  SQL count()
*  SQL max()
*  SQL min()
*  SQL sum()
*  SQL Between
*  SQL Aliases

使用注意事项

请在配置项填写es的版本,这样系统不会请求获取版本,这样不会多一次请求,建议配置一下

交流使用

qq群:578276199

项目地址

github:https://github.com/qieangel2013/EsParser
oschina:https://gitee.com/qieangel2013/EsParser

elasticsearch分词检索的match-query匹配过程分析

Elasticsearch夏李俊 发表了文章 • 3 个评论 • 292 次浏览 • 2018-03-14 12:00 • 来自相关话题

1. 模拟字符串数据存储
localhost:9200/yigo-redist.1/_analyze?analyzer=default&text=全能片(前)---TRW-GDB7891AT刹车片自带报警线,无单独报警线号码,卡仕欧,卡仕欧,乘用车,刹车片
上面的url表示
  •     索引为`yigo-redist.1`
  •     使用了索引`yigo-redist.1`中的分词器(`analyzer`) `default`
  •     解析的字符串(`text`)为"全能片(前)---TRW-GDB7891AT刹车片自带报警线,无单独报警线号码,卡仕欧,卡仕欧,乘用车,刹车片"
如果结果为:
{
  "tokens" : [ {
    "token" : "全能",
    "start_offset" : 0,
    "end_offset" : 2,
    "type" : "CN_WORD",
    "position" : 1
  }, {
    "token" : "片",
    "start_offset" : 2,
    "end_offset" : 3,
    "type" : "CN_CHAR",
    "position" : 2
  }, {
    "token" : "前",
    "start_offset" : 4,
    "end_offset" : 5,
    "type" : "CN_CHAR",
    "position" : 3
  }, {
    "token" : "trw-gdb7891at",
    "start_offset" : 9,
    "end_offset" : 22,
    "type" : "LETTER",
    "position" : 4
  }, {
    "token" : "刹车片",
    "start_offset" : 22,
    "end_offset" : 25,
    "type" : "CN_WORD",
    "position" : 5
  }, {
    "token" : "自带",
    "start_offset" : 25,
    "end_offset" : 27,
    "type" : "CN_WORD",
    "position" : 6
  }, {
    "token" : "报警",
    "start_offset" : 27,
    "end_offset" : 29,
    "type" : "CN_WORD",
    "position" : 7
  }, {
    "token" : "线",
    "start_offset" : 29,
    "end_offset" : 30,
    "type" : "CN_CHAR",
    "position" : 8
  }, {
    "token" : "无",
    "start_offset" : 31,
    "end_offset" : 32,
    "type" : "CN_WORD",
    "position" : 9
  }, {
    "token" : "单独",
    "start_offset" : 32,
    "end_offset" : 34,
    "type" : "CN_WORD",
    "position" : 10
  }, {
    "token" : "报警",
    "start_offset" : 34,
    "end_offset" : 36,
    "type" : "CN_WORD",
    "position" : 11
  }, {
    "token" : "线",
    "start_offset" : 36,
    "end_offset" : 37,
    "type" : "CN_CHAR",
    "position" : 12
  }, {
    "token" : "号码",
    "start_offset" : 37,
    "end_offset" : 39,
    "type" : "CN_WORD",
    "position" : 13
  }, {
    "token" : "卡",
    "start_offset" : 40,
    "end_offset" : 41,
    "type" : "CN_CHAR",
    "position" : 14
  }, {
    "token" : "仕",
    "start_offset" : 41,
    "end_offset" : 42,
    "type" : "CN_WORD",
    "position" : 15
  }, {
    "token" : "欧",
    "start_offset" : 42,
    "end_offset" : 43,
    "type" : "CN_WORD",
    "position" : 16
  }, {
    "token" : "卡",
    "start_offset" : 44,
    "end_offset" : 45,
    "type" : "CN_CHAR",
    "position" : 17
  }, {
    "token" : "仕",
    "start_offset" : 45,
    "end_offset" : 46,
    "type" : "CN_WORD",
    "position" : 18
  }, {
    "token" : "欧",
    "start_offset" : 46,
    "end_offset" : 47,
    "type" : "CN_WORD",
    "position" : 19
  }, {
    "token" : "乘用车",
    "start_offset" : 48,
    "end_offset" : 51,
    "type" : "CN_WORD",
    "position" : 20
  }, {
    "token" : "刹车片",
    "start_offset" : 52,
    "end_offset" : 55,
    "type" : "CN_WORD",
    "position" : 21
  } ]
}
2. 关键词查询
localhost:9200//yigo-redist.1/_analyze?analyzer=default_search&text=gdb7891
  •     索引为`yigo-redist.1`
  •     使用了索引`yigo-redist.1`中的分词器(`analyzer`) `default_search`
  •     解析的字符串(`text`)为"gdb7891"
返回结果:
{
  "tokens" : [ {
    "token" : "gdb7891",
    "start_offset" : 0,
    "end_offset" : 7,
    "type" : "LETTER",
    "position" : 1
  } ]
}
3. 关键词使用存储的分词器查询
localhost:9200//yigo-redist.1/_analyze?analyzer=default&text=gdb7891
  •     索引为`yigo-redist.1`
  •     使用了索引`yigo-redist.1`中的分词器(`analyzer`) `default_search`
  •     解析的字符串(`text`)为"gdb7891"
返回结果:
{
  "tokens" : [ {
    "token" : "gdb7891",
    "start_offset" : 0,
    "end_offset" : 7,
    "type" : "LETTER",
    "position" : 1
  }, {
    "token" : "",
    "start_offset" : 0,
    "end_offset" : 7,
    "type" : "LETTER",
    "position" : 1
  }, {
    "token" : "gdb7891",
    "start_offset" : 0,
    "end_offset" : 7,
    "type" : "LETTER",
    "position" : 1
  }, {
    "token" : "",
    "start_offset" : 0,
    "end_offset" : 3,
    "type" : "ENGLISH",
    "position" : 2
  }, {
    "token" : "gdb",
    "start_offset" : 0,
    "end_offset" : 3,
    "type" : "ENGLISH",
    "position" : 2
  }, {
    "token" : "gdb",
    "start_offset" : 0,
    "end_offset" : 3,
    "type" : "ENGLISH",
    "position" : 2
  }, {
    "token" : "7891",
    "start_offset" : 3,
    "end_offset" : 7,
    "type" : "ARABIC",
    "position" : 3
  }, {
    "token" : "7891",
    "start_offset" : 3,
    "end_offset" : 7,
    "type" : "ARABIC",
    "position" : 3
  }, {
    "token" : "",
    "start_offset" : 3,
    "end_offset" : 7,
    "type" : "ARABIC",
    "position" : 3
  } ]
}
总结
  •     通过步骤1可以看出,存储的数据"全能片(前)---TRW-GDB7891AT刹车片自带报警线,无单独报警线号码,卡仕欧,卡仕欧,乘用车,刹车片",被拆分成了很多词组碎片,然后存储在了索引数据中
  •     通过步骤2可以看出,当关键词输入"gdb7891",这个在检索分词器(`default_search`)下,没有拆分,只一个可供查询的碎片就是"gdb7891",但是步骤1,拆分的碎片里不存在"gb7891"的词组碎片,唯一相近的就是"trw-gdb7891at",所以使用普通的match-query是无法匹配步骤1输入的索引数据
  •     通过步骤3,可以看出如果使用相同的分词器,"gdb7891"能够拆分成"gdb","7891"等等,通过这2个碎片都能找到步骤1输入的索引数据,但是因为关键词被拆分了,所以会查询到更多的匹配的数据,比如:与"gdb"匹配的,与"7891"匹配的,与"gdb7891"匹配的
  •     如果说想通过分词器(`default_search`)检索出步骤1的数据,需要使用wildcard-query,使用"*gdb7891*",就可以匹配
      {      "query": {          "wildcard" : { "description" : "*gdb7891*" }      }  }
  

elasticsearch参考手册 (译文)

Elasticsearchcode4j 发表了文章 • 2 个评论 • 780 次浏览 • 2018-03-14 00:29 • 来自相关话题

一直以来官方手册都是零散的阅读,没有完整的看过,导致对es很多功能还有使用细节并不是非常了解。   然后最近也是在debug 看源码,顺便想把官方文档也刷了,决定开始自己翻译 elasticsearch 官方参考手册。看到之前网上有人在翻译但是没有翻译完,自己也尝试一下。   公司用的是2.2版本的所以我就从这个版本开始翻译了,译文中会有一些批注,后续会持续关注高版本并把特性以批注的方式补上说明。   在线阅读: www.code4j.tech   github地址:https://github.com/rpgmakervx/ ... ation   掘金翻译计划:https://github.com/xitu/gold-miner   计划每周翻译两三篇吧,看情况。   英语只有六级啦,有些地方翻译起来也很笨拙,有翻译不恰当之处大家可以提issue呀!
一直以来官方手册都是零散的阅读,没有完整的看过,导致对es很多功能还有使用细节并不是非常了解。   然后最近也是在debug 看源码,顺便想把官方文档也刷了,决定开始自己翻译 elasticsearch 官方参考手册。看到之前网上有人在翻译但是没有翻译完,自己也尝试一下。   公司用的是2.2版本的所以我就从这个版本开始翻译了,译文中会有一些批注,后续会持续关注高版本并把特性以批注的方式补上说明。   在线阅读: www.code4j.tech   github地址:https://github.com/rpgmakervx/ ... ation   掘金翻译计划:https://github.com/xitu/gold-miner   计划每周翻译两三篇吧,看情况。   英语只有六级啦,有些地方翻译起来也很笨拙,有翻译不恰当之处大家可以提issue呀!

Elastic日报 第189期 (2018-02-14)

Elastic日报elk123 发表了文章 • 0 个评论 • 266 次浏览 • 2018-02-14 22:41 • 来自相关话题

1. 日志收集工具fluentd与logstash比较。  http://t.cn/RR9sgLX 2. 如何通过logstash将csv数据导入到elasticsearch。 http://t.cn/RCGeeJK 3. 搜索引擎选择:Elasticsearch与Solr http://t.cn/RUncwIu   编辑:wt 归档:https://elasticsearch.cn/article/503 订阅:https://tinyletter.com/elastic-daily
1. 日志收集工具fluentd与logstash比较。  http://t.cn/RR9sgLX 2. 如何通过logstash将csv数据导入到elasticsearch。 http://t.cn/RCGeeJK 3. 搜索引擎选择:Elasticsearch与Solr http://t.cn/RUncwIu   编辑:wt 归档:https://elasticsearch.cn/article/503 订阅:https://tinyletter.com/elastic-daily

Elastic日报 第185期 (2018-02-10)

Elastic日报elk123 发表了文章 • 0 个评论 • 234 次浏览 • 2018-02-10 11:29 • 来自相关话题

  1. Elasticsearch与Hbase特性对比。 http://t.cn/RRyM1vm
  2. 将Elasticsearch作为Hive的存储? http://t.cn/RRyxDNZ
  3. 基于Elasticsearch实现搜索推荐 http://t.cn/RRyJiHx
  1. Elasticsearch与Hbase特性对比。 http://t.cn/RRyM1vm
  2. 将Elasticsearch作为Hive的存储? http://t.cn/RRyxDNZ
  3. 基于Elasticsearch实现搜索推荐 http://t.cn/RRyJiHx

Elasticsearch mapping 配置个人解读

Elasticsearch夏李俊 发表了文章 • 0 个评论 • 532 次浏览 • 2018-02-09 15:47 • 来自相关话题

配置详解 文件中"mapping":{}中的内容,即为创建索引的mappingsource 如:
"mappings": {
    "_default_" : {    //@1
        "_all" : {"enabled" : true},    //@2
        "properties" : {    //@3
            "tableType" : {"type" : "string", "index" : "no", "include_in_all" : false, "store": true},    //@4
            "caption" : {"type" : "string", "index" : "no", "include_in_all" : false, "store": true},
            "code" : {"type" : "string", "index" : "no", "include_in_all" : false, "store": true},
            "description" : {"type" : "string", "index" : "no", "include_in_all" : false, "store": true},
            "perm" : {"type" : "string", "index" : "not_analyzed", "include_in_all" : false}
		}
	},
	"ec02_goodsinfo" : {    //@5
	    "_all" : {"enabled" : true},    //@6
		"properties" : {    //@7
			"tableType" : {"type" : "string", "index" : "no", "include_in_all" : false, "store": true},
			"caption" : {"type" : "string", "index" : "no", "include_in_all" : false, "store": true},
			"code" : {"type" : "string", "index" : "no", "include_in_all" : false, "store": true},
			"description" : {"type" : "string", "index" : "no", "include_in_all" : false, "store": true},
			"perm" : {"type" : "string", "index" : "not_analyzed", "include_in_all" : false},
			"bill":{    //@8
				properties" : {
		                       "CreateYear" : {"type" : "string", "index" : "not_analyzed", "include_in_all" : true}    //@9
				}
			}
		}
	}
}
  • @1 _default_所有单据默认的创建索引的配置
  • @2 _all{} 每个单据下所有的字段配置,"enabled" : true 所有字段创建索引,false 所有字段禁止创建索引,[*注意]除非properties指定的字段,默认字段类型将自动匹配
  • @3 properties {},每个单据下字段或者properties的指定配置
  • @4 properties {}中指定了属性(properties):"tableType"的检索配置,type:string > 类型字符串,include_in_all:false > 改字段或者属性不包含在单据的所有字段中,"store": true > 储存在数据库中
  • @5 ec02_goodsinfo 表示对单据 "ec02_goodsinfo" 的特定检索配置
  • @6 _all{} 只对"ec02_goodsinfo"单据下所有的字段配置
  • @7 properties {},只对"ec02_goodsinfo"单据下字段或者properties的指定配置
  • [*注意]@8,@9 bill在单据中额字段都会包括一层bill,所以如果要对单据中某个字段指定需要套一层bill{}
----------------------------------------------------------------------------------------------------------------------------------------- 属性解说 版本5.X以前
  • index 可选值为analyzed(默认)和not_analyzed,如果是字段是字符串类型的,则可以是not_analyzed
  • store 可选值为yes或no,指定该字段的原始值是否被写入索引中,默认为no,即结果中不能返回该字段。
  • boost默认为1,定义了文档中该字段的重要性,越高越重要
  • null_value 如果一个字段为null值(空数组或者数组都是null值)的话不会被索引及搜索到,null_value参数可以显示替代null values为指定值,这样使得字段可以被搜索到。
  • include_in_all 指定该字段是否应该包括在_all字段里头,默认情况下都会包含。
  • type 可以指定String,long,int,doulbe,floot,boolean,等
版本5.X以后
  • 原本type string,其index 可选值为analyzed(默认)和not_analyzed,现在直接拆违type text( index analyzed),type keyword(index not_analyzed)
  • store 可选值为enable或false,指定该字段的原始值是否被写入索引中,默认为enable,即结果中不能返回该字段。
  • index 表示是否用于检索默认enable,可选false
------------------------------------------------------------------------------------------------------------------------------- 字段的数据类型
  • 简单类型string(指定分词器)
  • date(默认使用UTC保持,也可以使用format指定格式)
  • 数值类型(byte,short,integer,long,float,double)
  • boolean
  • binary(存储在索引中的二进制数据的base64表示,比如图像,只存储不索引)
  • ip(以数字形式简化IPV4地址的使用,可以被索引、排序并使用IP值做范围查询)注意string是5.x以前的,5.x之后被分裂为text,keyword
有层级结构的类型,比如object 或者 nested. 特殊类型
  • geo_point
  • geo_shape
  • completion
 

【阿里云】专访阿里云 MVP & Elastic中文社区发起人 曾勇—— 做你想做的事情,培养解决问题的能力

Elasticsearchfeil 发表了文章 • 1 个评论 • 328 次浏览 • 2018-02-06 13:45 • 来自相关话题

本期邀请阿里云MVP & Elastic中文社区发起人曾勇进行专访! 详细专访请戳这里或扫描下图中二维码查看,谢谢! 曾勇用专业传递技术能量,分享自身技术发展之路,从技术人转型到技术管理者的历程,创新的技术能量希望对你有所启发!
封面-曾勇.jpg
 
本期邀请阿里云MVP & Elastic中文社区发起人曾勇进行专访! 详细专访请戳这里或扫描下图中二维码查看,谢谢! 曾勇用专业传递技术能量,分享自身技术发展之路,从技术人转型到技术管理者的历程,创新的技术能量希望对你有所启发!
封面-曾勇.jpg
 

java 客户端 获取 termvectors

ElasticsearchJiaShiwen 发表了文章 • 0 个评论 • 526 次浏览 • 2018-01-19 15:56 • 来自相关话题

elasticsearch的termvectors包括了term的位置、词频等信息。这些信息用于相应的数据统计或开发其他功能,本文介绍termvecters如何使用,如何通过java客户端获取termvectors相关信息。

要使用termvctor首先要配置mapping中field的"term_vector"属性,默认状态es不开启termvector,因为这样会增加索引的体积,毕竟多存了不少元数据。

PUT test
{
  "mappings": {
    "qa_test": {
      "dynamic": "strict",
      "_all": {
        "enabled": false
      },
      "properties": {
        "question": {
          "properties": {
            "cate": {
              "type": "keyword"
            },
            "desc": {
              "type": "text",
              "store": true,
              "term_vector": "with_positions_offsets_payloads",
              "analyzer": "ik_smart"
            },
            "time": {
              "type": "date",
              "store": true,
              "format": "strict_date_optional_time||epoch_millis||yyyy-MM-dd HH:mm:ss"
            },
            "title": {
              "type": "text",
              "store": true,
              "term_vector": "with_positions_offsets_payloads",
              "analyzer": "ik_smart"
            }
          }
        },
        "updatetime": {
          "type": "date",
          "store": true,
          "format": "strict_date_optional_time||epoch_millis||yyyy-MM-dd HH:mm:ss"
        }
      }
    }
  },
  "settings": {
    "index": {
      "number_of_shards": "1",
      "requests": {
        "cache": {
          "enable": "true"
        }
      },
      "number_of_replicas": "1"
    }
  }
}

注意示例中的"title"的"term_vector"属性。

接下来为索引创建一条数据

PUT qa_test_02/qa_test/1
{
  "question": {
    "cate": [
      "装修流程",
      "其它"
    ],
    "desc": "筒灯,大洋和索正这两个牌子,哪个好?希望内行的朋友告知一下,谢谢!",
    "time": "2016-07-02 19:59:00",
    "title": "筒灯大洋和索正这两个牌子哪个好"
  },
  "updatetime": 1467503940000
}

下面我们看看这条数据上question.title字段的termvector信息

GET qa_test_02/qa_test/1/_termvectors
{
  "fields": [
    "question.title"
  ],
  "offsets": true,
  "payloads": true,
  "positions": true,
  "term_statistics": true,
  "field_statistics": true
}

结果大概这个样子

{
  "_index": "qa_test_02",
  "_type": "qa_test",
  "_id": "1",
  "_version": 1,
  "found": true,
  "took": 0,
  "term_vectors": {
    "question.title": {
      "field_statistics": {
        "sum_doc_freq": 9,
        "doc_count": 1,
        "sum_ttf": 9
      },
      "terms": {
        "和": {
          "doc_freq": 1,
          "ttf": 1,
          "term_freq": 1,
          "tokens": [
            {
              "position": 2,
              "start_offset": 4,
              "end_offset": 5
            }
          ]
        },
        "哪个": {
          "doc_freq": 1,
          "ttf": 1,
          "term_freq": 1,
          "tokens": [
            {
              "position": 7,
              "start_offset": 12,
              "end_offset": 14
            }
          ]
        },
        "大洋": {
          "doc_freq": 1,
          "ttf": 1,
          "term_freq": 1,
          "tokens": [
            {
              "position": 1,
              "start_offset": 2,
              "end_offset": 4
            }
          ]
        },
        "好": {
          "doc_freq": 1,
          "ttf": 1,
          "term_freq": 1,
          "tokens": [
            {
              "position": 8,
              "start_offset": 14,
              "end_offset": 15
            }
          ]
        },
        "正": {
          "doc_freq": 1,
          "ttf": 1,
          "term_freq": 1,
          "tokens": [
            {
              "position": 4,
              "start_offset": 6,
              "end_offset": 7
            }
          ]
        },
        "牌子": {
          "doc_freq": 1,
          "ttf": 1,
          "term_freq": 1,
          "tokens": [
            {
              "position": 6,
              "start_offset": 10,
              "end_offset": 12
            }
          ]
        },
        "筒灯": {
          "doc_freq": 1,
          "ttf": 1,
          "term_freq": 1,
          "tokens": [
            {
              "position": 0,
              "start_offset": 0,
              "end_offset": 2
            }
          ]
        },
        "索": {
          "doc_freq": 1,
          "ttf": 1,
          "term_freq": 1,
          "tokens": [
            {
              "position": 3,
              "start_offset": 5,
              "end_offset": 6
            }
          ]
        },
        "这两个": {
          "doc_freq": 1,
          "ttf": 1,
          "term_freq": 1,
          "tokens": [
            {
              "position": 5,
              "start_offset": 7,
              "end_offset": 10
            }
          ]
        }
      }
    }
  }
}

下面我们说说如何通过java代码实现termvector的获取,不说废话直接上代码

            TermVectorsResponse     termVectorResponse = client.prepareTermVectors().setIndex(sourceindexname).setType(sourceindextype)
                        .setId(id).setSelectedFields(fieldname).setTermStatistics(true).execute()
                        .actionGet();
                XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON);
                termVectorResponse.toXContent(builder, null);
                System.out.println(builder.string());
                Fields fields = termVectorResponse.getFields();
                Iterator<String> iterator = fields.iterator();
                while (iterator.hasNext()) {
                    String field = iterator.next();
                    Terms terms = fields.terms(field);
                    TermsEnum termsEnum = terms.iterator();
                    while (termsEnum.next() != null) {
                        BytesRef term = termsEnum.term();
                        if (term != null) {
                            System.out.println(term.utf8ToString() + termsEnum.totalTermFreq());
                        }
                    }
                }

获取TermVectorsResponse的代码很好理解,主要是设置索引名称、索引type、索引id以及需要展示的若干属性。

接下来是如何获取某一term的termvector,有两种方案第一种是通过TermVectorsResponse的toXContent方法直接生成XContentBuilder,这种方法可以直接获取和上面通过DSL查询一样的json结果;第二种是通过Fields的iterator遍历fields,获取TermsEnum,熟悉lucene的同学应会更熟悉第二种方法。

elasticsearch java原生打分插件开发

ElasticsearchJiaShiwen 发表了文章 • 0 个评论 • 888 次浏览 • 2018-01-10 16:34 • 来自相关话题

能有影响elasticsearch score的方法有很多,官方推荐的是使用内置的painless脚本语言结合function_score来重新定义score。由于本人开发的项目其算法是由java语言开发的,于是决定尝试原生脚本开发。 elasticsearch脚本由plugin-descriptor.properties文件以及运行jar包组成,plugin-descriptor.properties主要用来定义版本信息、对应es的版本信息等属性。

官方的例子

public class ExpertScriptPlugin extends Plugin implements ScriptPlugin {
    @Override
    public ScriptEngineService getScriptEngineService(Settings settings) {
        return new MyExpertScriptEngine();
    }
    /** An example {@link ScriptEngineService} that uses Lucene segment details to implement pure document frequency scoring. */
    // tag::expert_engine
    private static class MyExpertScriptEngine implements ScriptEngineService {
        @Override
        public String getType() {
            return "expert_scripts";
        }
        @Override
        public Function<Map<String,Object>,SearchScript> compile(String scriptName, String scriptSource, Map<String, String> params) {
            // we use the script "source" as the script identifier
            if ("pure_df".equals(scriptSource)) {
                return p -> new SearchScript() {
                    final String field;
                    final String term;
                    {
                        if (p.containsKey("field") == false) {
                            throw new IllegalArgumentException("Missing parameter [field]");
                        }
                        if (p.containsKey("term") == false) {
                            throw new IllegalArgumentException("Missing parameter [term]");
                        }
                        field = p.get("field").toString();
                        term = p.get("term").toString();
                    }
                    @Override
                    public LeafSearchScript getLeafSearchScript(LeafReaderContext context) throws IOException {
                        PostingsEnum postings = context.reader().postings(new Term(field, term));
                        if (postings == null) {
                            // the field and/or term don't exist in this segment, so always return 0
                            return () -> 0.0d;
                        }
                        return new LeafSearchScript() {
                            int currentDocid = -1;
                            @Override
                            public void setDocument(int docid) {
                                // advance has undefined behavior calling with a docid <= its current docid
                                if (postings.docID() < docid) {
                                    try {
                                        postings.advance(docid);
                                    } catch (IOException e) {
                                        throw new UncheckedIOException(e);
                                    }
                                }
                                currentDocid = docid;
                            }
                            @Override
                            public double runAsDouble() {
                                if (postings.docID() != currentDocid) {
                                    // advance moved past the current doc, so this doc has no occurrences of the term
                                    return 0.0d;
                                }
                                try {
                                    return postings.freq();
                                } catch (IOException e) {
                                    throw new UncheckedIOException(e);
                                }
                            }
                        };
                    }
                    @Override
                    public boolean needsScores() {
                        return false;
                    }
                };
            }
            throw new IllegalArgumentException("Unknown script name " + scriptSource);
        }

        @Override
        @SuppressWarnings("unchecked")
        public SearchScript search(CompiledScript compiledScript, SearchLookup lookup, @Nullable Map<String, Object> params) {
          Function<Map<String,Object>,SearchScript> scriptFactory = (Function<Map<String,Object>,SearchScript>) compiledScript.compiled();
          return scriptFactory.apply(params);
        }

        @Override
        public ExecutableScript executable(CompiledScript compiledScript, @Nullable Map<String, Object> params) {
            throw new UnsupportedOperationException();
        }

        @Override
        public boolean isInlineScriptEnabled() {
            return true;
        }

        @Override
        public void close() {}
    }
}

代码解读: 本例在elasticsearch源码中,https://github.com/elastic/elasticsearch/tree/master/plugins/examples/script-expert-scoring

MyExpertScriptEngine类是其中最重要的类,用于实现脚本参数定义,编译,以及打分机制的实现。其中compile方法返回我们定义好打分逻辑的java function。search方法用于我们在搜索过程中实施定义好的打分逻辑。 怎奈笔者对于函数式编程知道的不多(后续需要补课),其实评分逻辑也可以在search方法中实现,于是有了下面的一段代码。

public class fieldaddScriptPlugin extends Plugin implements ScriptPlugin {
    @Override
    public ScriptEngineService getScriptEngineService(Settings settings) {
        return new MyExpertScriptEngine();
    }
    private static class MyExpertScriptEngine implements ScriptEngineService {
        @Override
        public String getType() {
            return "expert_scripts";
        }

        @Override
        public Object compile(String scriptName, String scriptSource, Map<String, String> params) {
            if ("example_add".equals(scriptSource)) {
                return scriptSource;
            }
            throw new IllegalArgumentException("Unknown script name " + scriptSource);
        }

        @Override
        @SuppressWarnings("unchecked")
        public SearchScript search(CompiledScript compiledScript, SearchLookup lookup, @Nullable Map<String, Object> vars) {

            /**
             * 校验输入参数,DSL中params 参数列表
             */
            final long inc;
            final String fieldname;
            if (vars == null || vars.containsKey("inc") == false) {
                inc = 0;
            } else {
                inc = ((Number) vars.get("inc")).longValue();
            }

            if (vars == null || vars.containsKey("fieldname") == false) {
                throw new IllegalArgumentException("Missing parameter [fieldname]");
            } else {
                fieldname = (String) vars.get("fieldname");
            }

            return new SearchScript() {
                @Override
                public LeafSearchScript getLeafSearchScript(LeafReaderContext context) throws IOException {
                    final LeafSearchLookup leafLookup = lookup.getLeafSearchLookup(context);

                    return new LeafSearchScript() {
                        @Override
                        public void setDocument(int doc) {
                            if (leafLookup != null) {
                                leafLookup.setDocument(doc);
                            }
                        }

                        @Override
                        public double runAsDouble() {
                            long values = 0;
                            /**
                             * 获取document中字段内容
                             */
                            for (Object v : (List<?>) leafLookup.doc().get(fieldname)) {
                                values = ((Number) v).longValue() + values;
                            }
                            return values + inc;
                        }
                    };
                }

                @Override
                public boolean needsScores() {
                    return false;
                }
            };
        }
     这段代码的逻辑是把给定的字段(字段类型long)的每个元素相加后再加上给定的增量参数最后形成score分值。为了实现上述逻辑需要实现参数获取、根据给定的字段名获取内容列表量的关键件。下面结合代码说说这两个步骤如何实现的。

search方法中Map<String, Object> vars参数对应DSL中"params"参数,用于接受实际给定的运行时参数。SearchLookup lookup参数由系统传入,通过lookup.getLeafSearchLookup(context)获取LeafSearchLookup通过该对象可以获取给定字段的值。

对于elasticsearch 2.x以前的版本可以通过NativeScriptFactory实现原生脚本。

public class MyNativeScriptPlugin extends Plugin implements ScriptPlugin {
    private final static Logger LOGGER = LogManager.getLogger(MyFirstPlugin.class);

    public MyNativeScriptPlugin() {
        super();
        LOGGER.warn("This is MyNativeScriptPlugin");
    }

    @Override
    public List<NativeScriptFactory> getNativeScripts() {
        return Collections.singletonList(new MyNativeScriptFactory());
    }

    public static class MyNativeScriptFactory implements NativeScriptFactory {
        @Override
        public ExecutableScript newScript(@Nullable Map<String, Object> params) {

//            return new MyNativeScript();
            return new AbstractDoubleSearchScript(){

                @Override
                public double runAsDouble() {
                    int b=0;
                    if(params.get("add")!=null){
                        b= (int) params.get("add");
                    }

                    String s =  source().get("last").toString();
                    double a = s.length()+b;
                    return a;                }
            };
        }

        @Override
        public boolean needsScores() {
            return false;
        }

        @Override
        public String getName() {
            return "my_script";
        }
    }
}

工程组织 elasticsearch工程使用gradle进行依赖管理和生命周期管理,为此es项目自己也开发了esplugin的gradle插件,但不兼容gradle4.2以上的版本。参考github中的成熟插件,使用maven组织工程。

主要涉及两个文件 pom.xml plugin.xml 工程利用maven-assembly-plugin打包jar。

本例github地址:https://github.com/jiashiwen/elasticsearchpluginsample 欢迎点赞或拍砖

elasticsearch批量导入数据注意事项

Elasticsearchwj86611199 发表了文章 • 0 个评论 • 936 次浏览 • 2017-12-16 23:55 • 来自相关话题

刚刚初始化启动kiabna后是没有索引的,当然,如果elasticsearch中导入过数据那么kibana会自动匹配索引 现在按照官方例子开始批量给elasticsearch导入数据 链接如下https://www.elastic.co/guide/e ... .html 我们会依次导入如下 三块数据  1.The Shakespeare data 莎士比亚文集的数据结构 {     "line_id": INT,     "play_name": "String",     "speech_number": INT,     "line_number": "String",     "speaker": "String",     "text_entry": "String", } 2.The accounts data  账户数据结构 {     "account_number": INT,     "balance": INT,     "firstname": "String",     "lastname": "String",     "age": INT,     "gender": "M or F",     "address": "String",     "employer": "String",     "email": "String",     "city": "String",     "state": "String" } 3.The schema for the logs data 日志数据 {     "memory": INT,     "geo.coordinates": "geo_point"     "@timestamp": "date" } 然后向elasticsearch设置字段映射 Use the following command in a terminal (eg bash) to set up a mapping for the Shakespeare data set: 以下是莎士比亚的字段映射 可以用postman或者curl等发出请求~完整的url应该是localhost:9200/shakespear PUT /shakespeare {  "mappings": {   "doc": {    "properties": {     "speaker": {"type": "keyword"},     "play_name": {"type": "keyword"},     "line_id": {"type": "integer"},     "speech_number": {"type": "integer"}    }   }  } } Use the following commands to establish geo_point mapping for the logs: 这是 logs的字段映射 PUT /logstash-2015.05.18 {   "mappings": {     "log": {       "properties": {         "geo": {           "properties": {             "coordinates": {               "type": "geo_point"             }           }         }       }     }   } }   PUT /logstash-2015.05.19 {   "mappings": {     "log": {       "properties": {         "geo": {           "properties": {             "coordinates": {               "type": "geo_point"             }           }         }       }     }   } } COPY AS CURLVIEW IN CONSOLE  PUT /logstash-2015.05.20 {   "mappings": {     "log": {       "properties": {         "geo": {           "properties": {             "coordinates": {               "type": "geo_point"             }           }         }       }     }   } } 账户信息没有字段映射。。。 现在批量导入 curl -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json curl -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/shakespeare/doc/_bulk?pretty' --data-binary @shakespeare_6.0.json curl -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/_bulk?pretty' --data-binary @logs.jsonl windows下的curl命令可以到https://curl.haxx.se/download.html#Win64下载,解压后设置环境变量即可 这里要注意的是 @accounts.json,@shakespeare_6.0.json,@logs.json这些文件的位置应该是你所在的当前目录, 如果你当前位置是D盘~那么这些文件位置就要放在D盘下,否则读不到 还有一点~~~windows下要把命令行中的单引号换成双引号,,。。。否则会报 curl: (6) Could not resolve host: application这样的错误