Elasticsearch基础介绍及索引原理分析

  categories:资料  author:

最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计查询的方案设计工作,花了些时间学习Elasticsearch的基础理论知识,整理了一下,希望能对Elasticsearch感兴趣/想了解的同学有所帮助。 同时也希望有发现内容不正确或者有疑问的地方,望指明,一起探讨,学习,进步。

介绍

Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:

  • 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
  • 实时分析的分布式搜索引擎。
  • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

基本概念

先说Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:

{
    "name" :     "John",
    "sex" :      "Male",
    "age" :      25,
    "birthDate": "1990/05/01",
    "about"
阅读全文

Elasticsearch数据搜索篇

  categories:资料  author:

ES即简单又复杂,你可以快速的实现全文检索,又需要了解复杂的REST API。本篇就通过一些简单的搜索命令,帮助你理解ES的相关应用。虽然不能让你理解ES的原理设计,但是可以帮助你理解ES,探寻更多的特性。

其他相关的内容参考:Elasticsearch官方文档翻译

样例数据

为了更好的使用和理解ES,没有点样例数据还是不好模拟的。这里提供了一份官网上的数据,accounts.json。如果需要的话,也可以去这个网址玩玩,它可以帮助你自定义写随机的JSON数据。

首先开启你的ES,然后执行下面的命令,windows下需要自己安装curl、也可以使用cygwin模拟curl命令:

curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary  @accounts.json

注意:

1 需要在accounts.json所在的目录运行curl命令。

2 localhost:9200是ES得访问地址和端口

3 bank是索引的名称

4 account是类型的名称

5 索引和类型的名称在文件中如果有定义,可以省略;如果没有则必须要指定

6 _bulk是rest得命令,可以批量执行多个操作(操作是在json文件中定义的,原理可以参考之前的翻译)

7 pretty是将返回的信息以可读的JSON形式返回。

执行完上述的命令后,可以通过下面的命令查询:

curl 'localhost:9200/_cat/indices?v'
health index pri rep docs.count docs.deleted store.size pri.store.size
yellow bank    5   
阅读全文

ES中的分词器

  categories:资料  author:

一、概念介绍

    全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokenizer(分词器), 这些Token会被进一步处理, 比如转成小写等, 这些处理算法被称为Token Filter(词元处理器), 被处理后的结果被称为Term(词), 文档中包含了几个这样的Term被称为Frequency(词频)。 引擎会建立Term和原文档的Inverted Index(倒排索引), 这样就能根据Term很快到找到源文档了。 文本被Tokenizer处理前可能要做一些预处理, 比如去掉里面的HTML标记, 这些处理的算法被称为Character Filter(字符过滤器), 这整个的分析算法被称为Analyzer(分析器)

整个分析过程,如下图所示:

二、ES中的分词器

从第一部分内容可以看出:Analyzer(分析器)由Tokenizer(分词器)和Filter(过滤器)组成。

1、ES内置分析器

analyzer logical name description
阅读全文

基于海量公司分词ES中文分词插件

  categories:资料  author:

介绍

本次想和大家分享一款Elasticsearch分词插件,该插件是基于天津海量信息股份有限公司的中文分词核心开发的。海量分词针对大数据检索场景专门做了定制和优化,更贴近搜索需求,整体分词的性能也是非常高效。

本文章有广告成分。但希望将公司研究成果分享出来,给大家实际工作中多一种选择…

海量分词检索优化点

  • 地名方面海量分词5.0可以识别并检索出关于地名后缀的结果

    可以通过搜索“河南”得到“河南省”的结果,搜索“天津”得到“天津市”的搜索结果,而不是简单河南、天津的识别。

  • 著名人物的人名识别更精准,如刘翔、傅莹等

    部分分词器处理中文分词只有两种方式:一种是单字(unigrams)形式,即简单粗暴的将中文的每一个汉字作为一个词(token)分开;另一种是两字(bigrams)的,也就是任意相邻的两个汉字作为一个词分开。这种简单粗暴的切分方式无法实现时效性较新的人名识别,如刘翔、傅莹等会被识别为单字切开。

  • 外国人名识别方面海量可以将人名识别智能识别

    “玛利亚 凯利”、“乔治·史密斯”、“玛丽·戴维斯”将完整的外国人名识别出姓氏和名,如“乔治·史密斯”可以被识别为“乔治”和 “史密斯”。

  • 常见词的品牌名称识别方面,海量分词5.0识别的结果中包含实际意义的品牌名称

    如“乐高”,“吉米作为简单的词,可以被识别,但是词放在文档语境中有其品牌的属性,海量分词识别的结果中可以准确搜索出品牌的结果。

  • 机构名识别方面

    海量分词5.0可以识别完整的机构名称,如“天津海量信息技术股份有限公司”,可以完整的识别出全称。

海量分词性能评测

评测用例

本次评测选取的语料一共三个。一个是2MB的海量测试语料,一个是4MB的北大语料(新版旧版各2MB),一个是9.4GB海量的线上实际数据

评测指标

本次评测是在开源评测程序上修改而来,评测指标有分词速度、行数完美率、字数完美率(该指标仅供参考)、内存消耗

评测结果

2MB海量测试语料

分词器 分词模式 分词速度(字符/毫秒) 行数完美率 字数完美率 占用内存(MB)
海量 / 1049.0212
阅读全文

Elasticsearch之中文分词器插件es-ik

  categories:资料  author:

elasticsearch官方默认的分词插件

1、elasticsearch官方默认的分词插件,对中文分词效果不理想。

比如,我现在,拿个具体实例来展现下,验证为什么,es官网提供的分词插件对中文分词而言,效果差

[hadoop@HadoopMaster elasticsearch-2.4.3]$ jps
2044 Jps
1979 Elasticsearch
[hadoop@HadoopMaster elasticsearch-2.4.3]$ pwd
/home/hadoop/app/elasticsearch-2.4.3
[hadoop@HadoopMaster elasticsearch-2.4.3]$ curl ‘http://192.168.80.10:9200/zhouls/_analyze?pretty=true’ -d ‘{“text”:”这里是好记性不如烂笔头感叹号的博客园”}’
{
“tokens” : [ {
“token” : “这”,
“start_offset” : 0,
“end_offset” : 1,
“type” : “<IDEOGRAPHIC>”,… 阅读全文

微信小程序开发需要注意的30个坑

  categories:资料  author:

1、小程序名称可以由中文、数字、英文。长度在3-20个字符之间,一个中文字等于2个字符。

2、小程序名称不得与公众平台已有的订阅号、服务号重复。如提示重名,请更换名称进行设置。

3、小程序名称在帐号信息设置时完成,请谨慎设置,一旦设置暂不支持修改。

4、更换名称进行设置。如果企业商标,组织名称等名称被侵权,可通过公众平台侵权投诉流程发起投诉,取回名称使用权。

5、个人开发者无法申请微信小程序;目前微信仅支持企业、政府、媒体、其他组织申请。

6、一个主体可以注册30个,一个绑定身份的开发者只能创建5个微信小程序。
对于员工来说,请不要随便借给你的老板你的微信来注册微信小程序,因为你这样就没有机会了。
对于老板来说,请不要随便借给你的员工微信来注册微信小程序,因为你可能要不回来。

7、如果你不是特殊组织,你还是要花300元进行认证。

即使你对公帐号已经验证,你也需要缴纳300****元(支持微信支付)进行验证,这样才能够打开审核开关,发布小程序。
微信支付需要微信认证后才能使用。

8、服务器配置每月只有3次修改机会,省着点用,小心没机会。
没事别乱动下面的配置,一定确定了再动,并且一次性写完整,不然你改个小标点都会浪费你的一次机会。

9、你的域名、备案、https要准备好,不然做不了。(服务器域名需进过ICP备案、新备案域名需24小时候才能配置。域名格式只支持雅文大小写字母、数字及“-”,不支持IP地址及端口号)

10、小程序头像、介绍每月只能修改5次,服务范围每月只能修改1次。小程序二维码在第一个版本上线后才能获得。

11、选用模板消息时,你可用该标题的模板搭配不同的关键词使用,配置提交后关键词种类和顺序将不能修改。

12、找不到模板关键词的时候,可以进行申请添加。每月可以提交5次新关键词,通过后会被共享。(堆自家关键词的好机会呀!!)

13、一个小程序账号只有一个管理员(可修改),可以绑定10位开发者。

14、重点注意:

开发版本:使用开发者工具,可将代码上传到开发版本中。 开发版本只保留每人最新的一份上传的代码。点击提交审核,可将代码提交审核。开发版本可删除,不影响线上版本和审核中版本的代码。
审核中版本:只能有一份代码处于审核中。有审核结果后可以发布到线上,也可直接重新提交审核,覆盖原审核版本。
线上版本:线上所有用户使用的代码版本,该版本代码在新版本代码发布后被覆盖更新。
15、小程序AppSecret只有管理员才能查看,平台不会明文保存AppSecret。

16、数据分析只统计已发布线上版本使用数值,同时提供实时统计数据。

17、开发者工具目前提供windows 64 、 windows 32 、 mac版本(版本目前持续更新迭代中,可能需要常常去update)。

18、内测阶段,代码上传功能仅管理员微信号可操作。

19、书写代码后,工具会自动帮助用户保存当前的代码编辑状态,直接关闭工具或者切换到别的项目,并不会丢失已经编辑的文件状态,但需要注意的是,只有保存文件,修改内容才会真实的写到硬盘上,并触发实时预览。

20、获取用户输入:需要使用组件的属性bindchange将用户的输入内容同步到 AppService。

21、脚本内不能使用window等对象:
JsCore是一个没有窗口对象的环境,所以不能在脚本中使用window,也无法在脚本中操作组件。

22、zepto/jquery 会使用到window对象和document对象,所以无法使用。… 阅读全文

Flex 布局教程介绍

  categories:资料  author:

网页布局(layout)是 CSS 的一个重点应用。

布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。

2009年,W3C 提出了一种新的方案—-Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。

Flex 布局将成为未来布局的首选方案。本文介绍它的语法,下一篇文章给出常见布局的 Flex 写法。网友 JailBreak为本文的所有示例制作了 Demo,也可以参考。

以下内容主要参考了下面两篇文章:A Complete Guide to Flexbox 和 A Visual Guide to CSS3 Flexbox Properties。

一、Flex 布局是什么?

Flex 是 Flexible Box

阅读全文

Android应用编译时自动生成版本号

  categories:资料  author:

近期有一个工作任务:按照某个规则,给Android应用设置一个在编译时自动生成的versionCode与versionName。

这一点倒是不奇怪,很多正式的应用都有自己的一套版本号管理。市面上什么某某应用几点零,就是这样的一个产物。

我这个任务的难度除了自动生成,还有一个附加条件:在Android项目中编译(通过Android.mk)和在Android Studio中编译(通过build.gradle)时,规则要保持一致。

这样就有意思多了。

versionCode与versionName

Android的APK会自带一个版本描述,这就是versionCode和versionName。其中,versionCode是一个int,应该是一个随着开发而持续增长的值,而versionName是一个String,这是给人看的版本号。

versionName在开发过程中可以起到辨识作用,方便开发工程师与其他团队的人交流,也是用户直接可见的。比如某个问题是某某版本上出现的,某个功能是某某版本添加的。

versionCode在人的圈子里其实没太大作用,但是它是Android系统真正使用的值。在更新时,新的版本versionCode不能比原来的小,否则更新会失败。另外要注意,int是有上限的,不能太乱来。

versionCode和versionName,直接体现在APK中的AndroidManifest.xml文件中。可以通过以下命令查看:

aapt dump badging PATH/TO/YOUR.apk | grep version

aapt是Android Asset Packaging Tool,就是Android应用在命令行的打包工具,SDK里就有。主要作用是把二进制文件打包为APK,也附带了一些相关的查询功能。

修改versionCode和versionName,最简单、直观的方法,就是改源代码中的AndroidManifest.xml。但是,这样就需要频繁修改AndroidManifest.xml,每次版本更新时改一次。如果你希望每次提交的版本号都不一样,那么每次提交都需要密集地修改那两行,这显然是不可取的。

此外,实际上无论是在Android项目内编译,还是在IDE编译,最终都是用aapt来打包。打包时,可以通过设置--version-code--version-name参数,来对这两个字段设值,并且在最终打包时添加到APK的AndroidManifest.xml中。

在Android源码中编译时,如果一个模块没有指定versionCode与versionName,那么将与平台相同。比如在Android Marshmallow (API level 23)中编译,那么versionCode就是23,versionName就是PLATFORM_VERSION,比如6.0.1。

版本号规则

阅读全文


快乐成长 每天进步一点点      京ICP备18032580号-1