一、前言

    Elasticsearch对外提供RESTful API,下面的演示我们主要使用Postman,进行一系列的Demo演示,这款工具方便各位前端大大或者对接口调试的神器;

安装过于简单我不做过多介绍,推荐一些文章供大家参考安装:

windows:

windows单机版内含head插件

windows集群版

Linux:

Linux单机版内含head插件

Linux集群版

另外再推荐大家阅读这篇文章:搜索引擎选择: Elasticsearch与Solr

二、简单的一些操作

  1. #创建索引
  2. PUT /test
  3. #删除索引
  4. DELETE /test
  5. #根据id创建文档
  6. #索引/type/id
  7. PUT /test/doc/1
  8. #创建文档
  9. #不带id会自动生成id
  10. #索引/type/
  11. PUT /test/doc/
  12. #查询文档
  13. #使用id查询文档
  14. GET /test/doc/1
  15. #使用另外的DSL查询方式等等下次介绍,通过JSON请求完成

_bulk批量操作:

   

  1. {"index":{"_index":"test","_type":"aaa","_id":"2"}}
  2. {"userName":"123456"}
  3. {"index":{"_index":"test","_type":"aaa","_id":"3"}}
  4. {"userName":"1234567"}
  5. {"delete":{"_index":"test","_type":"aaa","_id":"1"}}

 _mget批量查询:

 

  1. http://localhost:9200/test/_mget
  2. {
  3. "docs":[
  4. {
  5. "_type":"aaa",
  6. "_id":"2"
  7. },
  8. {
  9. "_type":"bbbbb",
  10. "_id":"1"
  11. }
  12. ]
  13. }

如果type相同的话,可以使用ids,将id放入数组当中;

批量操作这2个API还是很重要的,如果要一次性操作很多的数据一定要批量操作,尽可能减少网络开销次数,提升系统的性能;

三、倒排索引

之前我写过一篇文章由树到数据库索引,大家可以看下数据库的正排索引,这里我们在举一个例子,大家都知道书是有目录页和页码页的,其实书的目录页就是正排索引,页码页就是倒排索引;

正排索引就是文档Id到文档的内容、单词的关联关系,如下图

倒排索引就是单词到文档id的关系,如下图

这个时候当我们使用搜索引擎查询包含Elasticsearch文档的,这个时候流程可能是这样的

1.通过倒排索引获取包含Elasticsearch文档id为1;

2.通过正排索引查找id为1的文档内容;

3.拿到正确结果返回;

这个时候我们可以来思考下倒排索引的结构了,当分词以后以我们了解到的数据结构来看的话B+树是一种高效的查询方式,整好符合分词以后的结构,如下图;

当我们快速拿到我们想要的查询的分词的时候,我们这个时候就需要知道最重要的东西就是文档的id,这样确实可以拿到正确的结果,如下图

但是这个时候我们再考虑下另外的情况,当我们在淘宝搜索一个物品的时候他有一个高亮显示,这个时候我们上面的情况就满足不了我们了,我们就需要在倒排索引列表中加入分词位置信息和偏移长度,这个时候我们就可以做高亮显示;

后面又来一种情况,随着文档的扩大,我们当用搜索引擎去查询的时候会有很多结果,我们需要优先显示相近的,这个时候有需要另外一个字段就是词频,记录在文档中出现的次数,这个时候就满足可能出现的所有情况了,结构入下图

明白整体的结构,你就知道为什么搜索引擎可以快速查询出我们要想要的结果来了,是不是很满足,那就点个关注吧!!哈哈!!当然内部有很多很多优化这个我们暂时就先不要管了!!

四、分词器

 分词器组成

 分词:按照某种规则将整体变成部分,在Elasticsearch中分词的组件是分词器(Analyzer),组成如下:

1.Character Filters: 针对原始文本进行处理,有点类似正则过滤的意思;

2.Tokenizer:按照指定规则进行分词;

3.Token Filters:将分好的词再次粉装转化;

分词器API

 Elasticsearch给我们提供分词API就是_analyze,作用就是为了测试是否能按照我们想要的结果进行分词,简单的演示下怎么使用:

看一下返回结果,每个token里面都包含我们说的倒排索引内所有字段,这个type含义我不是很清楚,但是无伤大雅,另外还可以指定索引进行分词,默认为standard分词器:

分词器类型

1.standard

默认分词器,按词切分,支持多语言,字母转化为小写,分词效果太多JSON返回的过长不方便截图,总体来说对中文支持不是很好,分成一个字一个字,毕竟老外写的;

2.simple

按照非字母切分,字母转化为小写;

3.whitespace

按照空格切分;

4.stop

与simple相比增加了语气助词区分,例如then、an、的、得等;

5.keyword

不分词;

6.pattern

通过正则表达式自定义分割符,默认\W+,非兹磁的符号作为分隔符;

7.language

语言分词器,内置多种语言;

以上都是自带分词器,对中文的支持都不是很好,接下来我们看下有哪些中文分词器:

1.IK

用法参考下Github,实现中英文分词,支持ik_smart,ik_max_word等,支持自定义词库、更新分词词库;

  1. #url
  2. http://localhost:9200/_analyze
  3. #json体
  4. {
  5. "analyzer":"ik_max_word",
  6. "text":"今天是个好天气,我是中国人"
  7. }
  8. #ik_max_word分词结果
  9. {
  10. "tokens": [
  11. {
  12. "token": "今天是",
  13. "start_offset": 0,
  14. "end_offset": 3,
  15. "type": "CN_WORD",
  16. "position": 0
  17. },
  18. {
  19. "token": "今天",
  20. "start_offset": 0,
  21. "end_offset": 2,
  22. "type": "CN_WORD",
  23. "position": 1
  24. },
  25. {
  26. "token": "是",
  27. "start_offset": 2,
  28. "end_offset": 3,
  29. "type": "CN_CHAR",
  30. "position": 2
  31. },
  32. {
  33. "token": "个",
  34. "start_offset": 3,
  35. "end_offset": 4,
  36. "type": "CN_CHAR",
  37. "position": 3
  38. },
  39. {
  40. "token": "好天气",
  41. "start_offset": 4,
  42. "end_offset": 7,
  43. "type": "CN_WORD",
  44. "position": 4
  45. },
  46. {
  47. "token": "好天",
  48. "start_offset": 4,
  49. "end_offset": 6,
  50. "type": "CN_WORD",
  51. "position": 5
  52. },
  53. {
  54. "token": "天气",
  55. "start_offset": 5,
  56. "end_offset": 7,
  57. "type": "CN_WORD",
  58. "position": 6
  59. },
  60. {
  61. "token": "我",
  62. "start_offset": 8,
  63. "end_offset": 9,
  64. "type": "CN_CHAR",
  65. "position": 7
  66. },
  67. {
  68. "token": "是",
  69. "start_offset": 9,
  70. "end_offset": 10,
  71. "type": "CN_CHAR",
  72. "position": 8
  73. },
  74. {
  75. "token": "中国人",
  76. "start_offset": 10,
  77. "end_offset": 13,
  78. "type": "CN_WORD",
  79. "position": 9
  80. },
  81. {
  82. "token": "中国",
  83. "start_offset": 10,
  84. "end_offset": 12,
  85. "type": "CN_WORD",
  86. "position": 10
  87. },
  88. {
  89. "token": "国人",
  90. "start_offset": 11,
  91. "end_offset": 13,
  92. "type": "CN_WORD",
  93. "position": 11
  94. }
  95. ]
  96. }
  97. #ik_smart分词结果
  98. {
  99. "tokens": [
  100. {
  101. "token": "今天是",
  102. "start_offset": 0,
  103. "end_offset": 3,
  104. "type": "CN_WORD",
  105. "position": 0
  106. },
  107. {
  108. "token": "个",
  109. "start_offset": 3,
  110. "end_offset": 4,
  111. "type": "CN_CHAR",
  112. "position": 1
  113. },
  114. {
  115. "token": "好天气",
  116. "start_offset": 4,
  117. "end_offset": 7,
  118. "type": "CN_WORD",
  119. "position": 2
  120. },
  121. {
  122. "token": "我",
  123. "start_offset": 8,
  124. "end_offset": 9,
  125. "type": "CN_CHAR",
  126. "position": 3
  127. },
  128. {
  129. "token": "是",
  130. "start_offset": 9,
  131. "end_offset": 10,
  132. "type": "CN_CHAR",
  133. "position": 4
  134. },
  135. {
  136. "token": "中国人",
  137. "start_offset": 10,
  138. "end_offset": 13,
  139. "type": "CN_WORD",
  140. "position": 5
  141. }
  142. ]
  143. }

2.jieba

python中流行的分词系统,玩Py的朋友看下GitHub;

以上基本满足我们日常开发了,有兴趣的可以查看下HanLPTHULAC等等;

自定义分词器

如果以上这些还满足不了你的需求,那么你可以进行自定义分词,自定义的分词的流程就是上面我们介绍分词器的组成的流程;

1.Character Filters

在tokenizer之前对原始文本进行处理 ,会影响在Tokenizer解析position和offset的信息,在这个里面我们可以做如下事情:

html_strip 取出html标签中的内容;

mapping进行字符串替换;

pattern_replace进行正则替换;

写了一个简单的demo,剩下大家可以参考下官方文档

2.Tokenizer

Tokenizer将原始文本按照一定规则切分为单词,大概分成3类:

按照字符为导向分割(Word Oriented Tokenizers):Standard Tokenizer、Letter Tokenizer、Whitespace Tokenizer等等;

部分单词匹配(Partial Word Tokenizers):类似于ik_max_word;

按照某种结构进行分割(Structured Text Tokenizers):Path Tokenizer、Keyword Tokenizer等等;

详细介绍查看官方文档;

3.Token Filter

tokenizer输出的单词进行增加、删除、修改等操作,tokenizer filter是可以有多个的,自带类型有好多大家可以查看官方文档

  1. #url
  2. http://localhost:9200/_analyze
  3. #post请求体
  4. {
  5. "tokenizer":"standard",
  6. "text": "I'm LuFei wo will haizheiwang ",
  7. "filter":[
  8. "stop",
  9. "lowercase",
  10. {
  11. "type":"ngram",
  12. "min_gram":5,
  13. "max_gram":8
  14. }
  15. ]
  16. }
  17. #返回分词结果
  18. {
  19. "tokens": [
  20. {
  21. "token": "lufei",
  22. "start_offset": 4,
  23. "end_offset": 9,
  24. "type": "<ALPHANUM>",
  25. "position": 1
  26. },
  27. {
  28. "token": "haizh",
  29. "start_offset": 18,
  30. "end_offset": 29,
  31. "type": "<ALPHANUM>",
  32. "position": 4
  33. },
  34. {
  35. "token": "haizhe",
  36. "start_offset": 18,
  37. "end_offset": 29,
  38. "type": "<ALPHANUM>",
  39. "position": 4
  40. },
  41. {
  42. "token": "haizhei",
  43. "start_offset": 18,
  44. "end_offset": 29,
  45. "type": "<ALPHANUM>",
  46. "position": 4
  47. },
  48. {
  49. "token": "haizheiw",
  50. "start_offset": 18,
  51. "end_offset": 29,
  52. "type": "<ALPHANUM>",
  53. "position": 4
  54. },
  55. {
  56. "token": "aizhe",
  57. "start_offset": 18,
  58. "end_offset": 29,
  59. "type": "<ALPHANUM>",
  60. "position": 4
  61. },
  62. {
  63. "token": "aizhei",
  64. "start_offset": 18,
  65. "end_offset": 29,
  66. "type": "<ALPHANUM>",
  67. "position": 4
  68. },
  69. {
  70. "token": "aizheiw",
  71. "start_offset": 18,
  72. "end_offset": 29,
  73. "type": "<ALPHANUM>",
  74. "position": 4
  75. },
  76. {
  77. "token": "aizheiwa",
  78. "start_offset": 18,
  79. "end_offset": 29,
  80. "type": "<ALPHANUM>",
  81. "position": 4
  82. },
  83. {
  84. "token": "izhei",
  85. "start_offset": 18,
  86. "end_offset": 29,
  87. "type": "<ALPHANUM>",
  88. "position": 4
  89. },
  90. {
  91. "token": "izheiw",
  92. "start_offset": 18,
  93. "end_offset": 29,
  94. "type": "<ALPHANUM>",
  95. "position": 4
  96. },
  97. {
  98. "token": "izheiwa",
  99. "start_offset": 18,
  100. "end_offset": 29,
  101. "type": "<ALPHANUM>",
  102. "position": 4
  103. },
  104. {
  105. "token": "izheiwan",
  106. "start_offset": 18,
  107. "end_offset": 29,
  108. "type": "<ALPHANUM>",
  109. "position": 4
  110. },
  111. {
  112. "token": "zheiw",
  113. "start_offset": 18,
  114. "end_offset": 29,
  115. "type": "<ALPHANUM>",
  116. "position": 4
  117. },
  118. {
  119. "token": "zheiwa",
  120. "start_offset": 18,
  121. "end_offset": 29,
  122. "type": "<ALPHANUM>",
  123. "position": 4
  124. },
  125. {
  126. "token": "zheiwan",
  127. "start_offset": 18,
  128. "end_offset": 29,
  129. "type": "<ALPHANUM>",
  130. "position": 4
  131. },
  132. {
  133. "token": "zheiwang",
  134. "start_offset": 18,
  135. "end_offset": 29,
  136. "type": "<ALPHANUM>",
  137. "position": 4
  138. },
  139. {
  140. "token": "heiwa",
  141. "start_offset": 18,
  142. "end_offset": 29,
  143. "type": "<ALPHANUM>",
  144. "position": 4
  145. },
  146. {
  147. "token": "heiwan",
  148. "start_offset": 18,
  149. "end_offset": 29,
  150. "type": "<ALPHANUM>",
  151. "position": 4
  152. },
  153. {
  154. "token": "heiwang",
  155. "start_offset": 18,
  156. "end_offset": 29,
  157. "type": "<ALPHANUM>",
  158. "position": 4
  159. },
  160. {
  161. "token": "eiwan",
  162. "start_offset": 18,
  163. "end_offset": 29,
  164. "type": "<ALPHANUM>",
  165. "position": 4
  166. },
  167. {
  168. "token": "eiwang",
  169. "start_offset": 18,
  170. "end_offset": 29,
  171. "type": "<ALPHANUM>",
  172. "position": 4
  173. },
  174. {
  175. "token": "iwang",
  176. "start_offset": 18,
  177. "end_offset": 29,
  178. "type": "<ALPHANUM>",
  179. "position": 4
  180. }
  181. ]
  182. }

4.在索引中自定义分词器

五、结束

下一篇介绍Mapping、Search Api,欢迎大家点赞,欢迎大家加群438836709,欢迎大家关注公众号

Elastic Stack-Elasticsearch使用介绍(一)的更多相关文章

  1. Elastic Stack之ElasticSearch分布式集群二进制方式部署

    Elastic Stack之ElasticSearch分布式集群二进制方式部署 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家都知道ELK其实就是Elasticsearc ...

  2. ES 集中式日志分析平台 Elastic Stack(介绍)

    一.ELK 介绍 ELK 构建在开源基础之上,让您能够安全可靠地获取任何来源.任何格式的数据,并且能够实时地对数据进行搜索.分析和可视化. 最近查看 ELK 官方网站,发现新一代的日志采集器 File ...

  3. 集中式日志分析平台 Elastic Stack(介绍)

    一.ELK 介绍 二.ELK的几种常见架构 >>ELK 介绍<< ELK 构建在开源基础之上,让您能够安全可靠地获取任何来源.任何格式的数据,并且能够实时地对数据进行搜索.分析 ...

  4. Elastic Stack之ElasticSearch分布式集群yum方式搭建

    Elastic Stack之ElasticSearch分布式集群yum方式搭建 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.搜索引擎及Lucene基本概念 1>.什么 ...

  5. Elastic Stack核心产品介绍-Elasticsearch、Logstash和Kibana

    Elastic Stack 是一系列开源产品的合集,包括 Elasticsearch.Kibana.Logstash 以及 Beats 等等,能够安全可靠地获取任何来源.任何格式的数据,并且能够实时地 ...

  6. 浅尝 Elastic Stack (一) Elasticsearch、Kibana、Beats 安装

    Elastic Stack 包括 Elasticsearch.Kibana.Beats 和 Logstash,也称为 ELK Stack.能够安全可靠地获取任何来源.任何格式的数据,然后实时地对数据进 ...

  7. Elastic Stack(ElasticSearch 、 Kibana 和 Logstash) 实现日志的自动采集、搜索和分析

    Elastic Stack 包括 Elasticsearch.Kibana.Beats 和 Logstash(也称为 ELK Stack).能够安全可靠地获取任何来源.任何格式的数据,然后实时地对数据 ...

  8. ELK stack elasticsearch/logstash/kibana 关系和介绍

    ELK stack elasticsearch 后续简称ES logstack 简称LS kibana 简称K 日志分析利器 elasticsearch 是索引集群系统 logstash 是日志归集集 ...

  9. Elastic stack ——X-Pack安装

    X-Pack是一个Elastic Stack的扩展,将安全,警报,监视,报告和图形功能包含在一个易于安装的软件包中.在Elasticsearch 5.0.0之前,您必须安装单独的Shield,Watc ...

  10. Spring Boot + Elastic stack 记录日志

    原文链接:https://piotrminkowski.wordpress.com/2019/05/07/logging-with-spring-boot-and-elastic-stack/ 作者: ...

随机推荐

  1. Python2 编码问题分析

    本文浅显易懂,绿色纯天然,手工制作,请放心阅读. 编码问题是一个很大很杂的话题,要向彻底的讲明白可以写一本书了.导致乱码的原因很多,系统平台.编程语言.多国语言.软件程序支持.用户选择等都可能导致无法 ...

  2. [总结] NOIP 前的考试记录

    sb博主又犯sb错误了! 他觉得以往模拟赛因为犯sb错误扔的分足足有1k分了! 于是他想记录一下自己犯的sb错误看看自己到底有多sb! 嗯就从今天开始吧 2018.9.28 1. 二分边界写错.骚什么 ...

  3. (摘)linux下yum安装redis以及使用

    1.yum install redis      --查看是否有redis   yum 源 2.yum install epel-release    --下载fedora的epel仓库 3.yum ...

  4. react中的路由配置踩坑记

    react 路由配置中,如果根路由(/)匹配一个组件,另一个路由(/list)在进行匹配的时候也会匹配到根路由(/),即在 /list 页面展示的时候 / 页面总是展示在上方. 此时如果想进行严格匹配 ...

  5. Python爬取地图瓦片

    由于要在内网开发地图项目,不能访问在线的地图服务了,就想把地图瓦片下载下来,网上找了一些下载器都是需要注册及收费的,否则下载到的图都是打水印的,如下: 因为地图瓦片就是按照层级.行.列规则组织的一张张 ...

  6. Vue介绍

    1.Vue的简介 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架. Vue 只关注视图层, 采用自底向上增量开发的设计. Vue 的目标是通过尽可能简单的 AP ...

  7. 将Dynamics 365中的用户及其角色、角色导出到Excel中

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复240或者20161204可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  8. 无依赖简单易用的Dynamics 365公共视图克隆工具

    本人微信公众号:微软动态CRM专家罗勇 ,回复279或者20180818可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . Dy ...

  9. 在 Apex 中得到 sObject 的信息

    Salesforce 的数据模型是基于 sObject 的.在 Apex 中,所有的标准对象.自定义对象都是继承自 sObject 的. 关于在 Apex 中得到 sObject 的信息,我们要基于两 ...

  10. Activity的启动流程

    前言:新启动一个activity分为两种情况,第一种是在Launcher的桌面点击icon图标启动一个新的应用,第二种是在应用启动的情况下从OneActivity->TwoActivity 其实 ...