一、项目概述

这是一个被我称之为“没有枪、没有炮,硬着头皮自己造”的项目。项目是和其它公司合作的三个核心模块开发。 
使用ES的目的是: 
1)、采集数据、网站数据清洗后存入ES; 
2)、对外提供精确检索、通配符检索、模糊检索、分词检索、全文检索接口等二次封装接口。

二、项目架构


如上图所示,ES作为中间层,一方面存储数据清洗后存储的数据,另一方面对外提供插入、更新、删除、检索接口的。

三、ES使用小结

3.1 ES版本选型

1.X,2.X版本有太多局限性,5.X做了较大性能提升的改进。比如:string字段类型分成了keyword和text两种类型,keyword用于精确匹配,text结合设定的分词器用于全文检索。 
选择5.X需要勇气,实践证明当时“向前一小步”的正确性。

3.2 ES安装部署

ELK都有安装。 
ES安装了head插件,用途:查看集群状态、查看索引信息、查看mapping信息、查看每个索引下数据信息、进行简单字段查询操作; 
安装了ik分词插件,用途:分词,实现全文检索。 
安装了Kibana,用途:数据对接展示;用DevTool替代postman执行DSL验证,以验证增、删、改、查功能。 
安装了logstash,用途:借助“logstash-input-jdbc”实现数据库到ES之间的同步。

3.3 ES API选型与使用

调研了ES提供的原生API以及Jest等,最终选择Jest。将Maven工程相关jar包导出到项目中使用。

3.4 后端框架选型

play new 工程名 
play eclipsify 工程名 
play clean 
play deps 
play run 测试模式 
play start release模式

3.5 ES分页处理

ES Java接口能返回的默认的最大记录数为10000行。如果想返回超过1W+条的记录,需要做如下设置:

PUT ting_index/_settings
{
"max_result_window" : 500000 }
  • 1
  • 2
  • 3
  • 4
  • 5

3.6 如何只删除数据,而不删除索引

类似Mysql等关系型数据库的delete from mtable操作,而不是drop掉表,参考如下:

POST my_store/products/_delete_by_query
{
"query": {
"match_all": {}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

参考:https://www.elastic.co/guide/en/elasticsearch/reference/master/docs-delete-by-query.html

3.7 Jest update更新操作

数据前添加doc一层,如下所示: 
strJson = “{” + ” \”doc\” :” + strJson + “}”;

3.8 集群中所有节点都安装ik分词器

集群里每一个实例都要安装ik插件。 
否则,当我们更新包含指定分词的mapping的时候会报错。

3.9 最大字节数限制

报错信息如下:“whose UTF8 encoding is longer than the max length 32766 “, 
这个问题是某个字段size过大导致lucence不能索引引起的。 
如果要存储超过32766字节的数据,那么需要在mapping中设置字段时,添加ignore_above = 256就可以了。

举例,新增Mapping的操作如下:

POST tingindex/tingtype/_mapping
{
"tingtype":{
"properties":{
"content":{
"type":"text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_max_word",
"fields":{
"keyword":{
"ignore_above":256,
"type":"keyword"
}
}
},
"publish_time":{
"type":"date",
"format":"YYYY-MM-dd HH:mm:ss"
},
"author":{
"ignore_above":256, "type":"keyword"
},
}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

参考: 
https://www.elastic.co/guide/en/elasticsearch/reference/5.5/ignore-above.html

3.10 出现未分派, elasticsearch集群,在新增节点调整分片数时,出现UNASSIGNED。

排查方案: 
GET /_cluster/allocation/explain

3.11 kibana修改时区

kibana->management->advanced setting->dateFormat:tz, 编辑,改成GMT +0。

3.12 ES检索(URL访问方式)

不指定索引的全文检索举例: 
http://192.168.11.174:9200/_search?pretty&q=北京 
指定索引的全文检索举例: 
http://192.168.11.174:9200/articles/articles_info/_search?pretty&q=北京 
指定字段检索举例: 
http://192.168.11.174:9200/articles/articles_info/_search?pretty&q=title:我爱北京天安门

3.13 ES高性能配置(from ES中文社区)

【1】分词对性能的影响: 
索引过程中,分词会对索引速度有所影响,建议你可以优化一下你的mapping,不必要的就不必分词,甚至不必设成可搜索的了。 
举例:5.X中不必要分词的设置为keyword类型。

【2】分片和副本对性能影响: 
分片和副本的设计,应该根据节点数来调整,正常情况下 节点数= (副本数+1)*分片数,若是你希望提高搜索性能,可是适当提高副本数。

【3】内存对性能的影响: 
1).节点的内存分配的不能太少了。 
ES其实很占内存,大部分的操作都是建立在内存足够的基础上。 
举例:你的数据量应该在150G-200G左右,我觉得可以把内存调整到10G左右。

2). ES的内存使用分为两部分ES缓存和Lucene通过内核缓存加速一些数据。

3). 如果服务器内存 nG > 64G,ES的内存尽量设置低于32G,建议最大31G. 
因为es使用“内存指针压缩”技术,一旦内存内存大于32G这项技术将失效,内存有效使用只有原来的60%~70%。 
你不必为内存浪费而担心,因为lucene会通过系统把一些聚合和排序的数据缓存起来方便你快速查询使用。

4) .如果服务器内存 nG < 64G,建议给ES分配 内存 (n-2)/2G. 首先2G是给系统预留,然后es和lucene。

5) . 如果你想继续你的实时查询,尽量不要使用swap(交换分区),建议关闭系统swap使用

【4】ES线程设置 
线程数方法:线程数:=(内核数*3)/2+1

举例:检索服务器是24核,所以:线程池的大小=(24*3)/2+1=37 。 
参考: 
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-threadpool.html

四、项目整体小结

4.1、需求要细化

切记: 
1)不要拿到合同或需求就开发。 
2)欲速则不达。 
3)需求细化后形成《需求规格说明书》,并一定邮件或电话或当面找用户确认。 
对于需求,由顶向下知道需要实现的核心功能,团队核心敲定分几个模块? 
逐个模块细化需求点。

4.2、预研要充分

对于新的技术点,在项目启动后的需求细化阶段即可同步进行。 
作为项目经理的我,没有事必躬亲,多关注预研点方案选型、预研难点、预研报告,小细节如:下载、安装部署、参数验证、英文翻译安排团队其它成员执行。

4.3、文档要跟进

需求有需求文档,设计根据项目需要和进度安排有概要设计或详细设计文档。 
设计文档千万不能少,设计的过程就是开发“路演”的过程。 
设计文档一定要梳理清楚架构图、模块图、数据流图、流程图。 
需求文档是设计的基础,需求和设计文档是开发的基础。

4.4、思维要活跃

技术方案的选型很重要,大的方面包括:

1)检索存储集群部署,集群节点个数选择等。 
2)前后端选型,前端用jquery,jsp还是js? 后端使用spring,tomcat,还是play框架? 
3)开源方案选型,要提早预研可用性、需求点覆盖程度、二次开发或封装难度等。 
4)前后端接口对接格式敲定。 
5)对外提供检索服务接口名称,参数敲定。

思维活跃主要体现在:

1)方案选型、技术调研快刀斩乱麻,时间紧,不纠结。此路不通,另寻他路。 
2)自己不能解决,不要太拖沓,及时google,stackoverflow解决或者和架构师讨论解决。

4.5、开发要同步

1)接口对接沟通要充分。 
接口提供方和接口使用方,要反复多花时间沟通业务,要定义好数据接口。 
此时的耗时,事后你会发现是好事,沟通越充分要好。

2)接口对接要实时同步。 
一方修改了,要第一时间告诉对方。

五、项目管理小结

5.1、多方沟通要邮件

邮件是证据,避免不必要赖账或扯皮。 
qq沟通和微信都不是好方式,最主要原因是不利于查看聊天记录、不利于快速检索。

5.2、进度汇报要详细

包含但不限于项目整体情况、本周已完成、下周计划、项目风险与应对。

5.3、任务分工要明确

团队成员特点不同,切记口头分工。团队人少,我用excel做了详细记录。

5.4、每周例会要及时

周例会起到承上启下的作用,有效协调控制项目进度、团队成员工作饱和度。

六、后记

1、ES要学习的东西非常多。不纠结,多去官网、官方论坛、stackoverflow、Google检索答案, 
相信我,你并不孤独。 
2、ES还有很长的路要走,继续精进阅读与思考,继续加油!

—————————————————————————————————— 
更多ES相关实战干货经验分享,请扫描下方【铭毅天下】微信公众号二维码关注。 
(每周至少更新一篇!)

 
和你一起,死磕Elasticsearch! 
——————————————————————————————————

2017年09月03日 16:09 于家中床前

作者:铭毅天下 
转载请标明出处,原文地址: 
http://blog.csdn.net/laoyang360/article/details/77623013 
如果感觉本文对您有帮助,请点击‘喜欢’支持一下,并分享出去,让更多的人受益。您的支持是我坚持写作最大的动力,谢谢!

Elasticsearch全文检索实战小结的更多相关文章

  1. 干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践

    1.题记 2018年3月初,萌生了一个想法:对Elasticsearch相关的技术书籍做拆解阅读,该想法源自非计算机领域红火已久的[樊登读书会].得到的每天听本书.XX拆书帮等. 目前市面上Elast ...

  2. 《从Lucene到Elasticsearch全文检索实战》的P184页

    curl -XPOST "http://localhost:9200/_bulk?pretty" --data-binary @books.json 这句话在书中是以crul的命令 ...

  3. js中各种跨域问题实战小结(二)

    这里接上篇:js中各种跨域问题实战小结(一) 后面继续学习的过程中,对上面第一篇有稍作休整.下面继续第二部分: -->5.利用iframe和location.hash -->6.windo ...

  4. js中各种跨域问题实战小结(一)

    什么是跨域?为什么要实现跨域呢? 这是因为JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.也就是说只能访问同一个域中的资源.我觉得这就有必要了解下javascript中的同源策略 ...

  5. Elasticsearch全文检索工具入门

    Elasticsearch全文检索工具入门: 1.下载对应系统版本的文件 elasticsearch-2.4.0.zip 1.1运行elasticsearch-2.4.0\elasticsearch- ...

  6. 《从Lucene到Elasticsearch:全文检索实战》学习笔记五

    今天我给大家讲讲tf-idf权重计算 tf-idf权重计算: tf-idf(中文词频-逆文档概率)是表示计算词项对于一个文档集或语料库中的一份文件的重要程度.词项的重要性随着它在文档中出现的次数成正比 ...

  7. 《从Lucene到Elasticsearch:全文检索实战》学习笔记四

    今天我给大家讲讲布尔检索模型基本概念 布尔检索模型: 检索模型是判断文档内容与用户相关性的核心技术,以大规模网页搜索为例,在海量网页中与用户查询关键词相关的网页可能会有成千上万个,甚至耕读哦.那么信息 ...

  8. 《从Lucene到Elasticsearch:全文检索实战》学习笔记三

    今天我给大家讲讲倒排索引. 索引是构成搜索引擎的核心技术之一,它在日常生活中是非常常见的,比如我看一本书的时候,我首先会看书的目录,通过目录可以快速定位到具体章节的页码,加快对内容的查询速度. 文档通 ...

  9. 《从Lucene到Elasticsearch:全文检索实战》学习笔记二

    今天我给大家讲讲分词算法 分词算法概述:词是语义的最小单位.分词对搜索引擎的作用很大,可以促进搜索引擎程序自动识别语句的含义,可以提高搜索结果的匹配度,分析的质量也将直接影响了搜索结果的精确度.分词存 ...

随机推荐

  1. Java socket保存示例(不使用base64)解决中文乱码问题

    MultiThreadServer.java package com.my.nubase64; import java.io.BufferedReader; import java.io.Buffer ...

  2. java 代码的良好习惯

    有很多书籍提到了代码开发的良好习惯,但是自己看过后,在开发中并不能每次都想起来.在此处开贴做笔记,以后自己开发的代码,必须符合. 不要在一个代码块的开头把局部变量一次性都声明了(这是c语言的做法),而 ...

  3. 2D空间中求两圆的交点

    出处:https://stackoverflow.com/questions/19916880/sphere-sphere-intersection-c-3d-coordinates-of-colli ...

  4. linux 重启和关机

    重启命令有:reboot,  shutdown -ry 0关机命令有:poweroff, shutdown -hy 0

  5. Ramda函数式编程之PHP

    0x00 何为函数式编程 网上已经有好多详细的接受了,我认为比较重要的有: 函数是"第一等公民",即函数和其它数据类型一样处于平等地位 使用"表达式"(指一个单 ...

  6. Login failed for user 'IIS APPPOOL\ASP.NET v4.0'

    Looks like it's failing trying to open a connection to SQL Server. You need to add a login to SQL Se ...

  7. org.apache.http.TruncatedChunkException: Truncated chunk ( expected size: 47956; actual size: 35656)

    在使用httpcomponents-client-4.2.1时,任务运行一段时间就抛出以下一场 下面是异常的堆栈信息: org.apache.http.TruncatedChunkException: ...

  8. Go指南练习_Reader

    https://tour.go-zh.org/methods/22 一.题目描述 实现一个 Reader 类型,它产生一个 ASCII 字符 'A' 的无限流. 二.题目分析 io 包指定了 io.R ...

  9. [Algorithm] *String Matching and Hashing

    Link: Computer Algorithms: Rabin-Karp String Searching 为了避免挨个字符对文本和模式串进行比较,我们可以尝试一次性判断两者是否相等. 因此,我们需 ...

  10. fs项目---->cron框架的学习(一)

    Cron是一种允许您按计划执行某些内容的工具.这通常使用cron语法来完成.我们允许您在计划作业触发时执行函数.我们还允许您使用子进程执行javascript进程外部的作业.此外,这个库超出了基本的c ...