尚未秃顶的程序员 2019-02-22 10:37:22
Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。
它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合。
Elasticsearch是一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎,可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架。但是Lucene只是一个框架,要充分利用它的功能,需要使用JAVA,并且在程序中集成Lucene。需要很多的学习了解,才能明白它是如何运行的,Lucene确实非常复杂。
Elasticsearch和solr比较:
Elasticsearch优点:
可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上
将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES;
开箱即用的,部署简单
全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理
Elasticsearch缺点:开发者少
solr优点:
Solr有一个更大、更成熟的用户、开发和贡献者社区。
支持添加多种格式的索引,如:HTML、PDF、微软 Office 系列软件格式以及 JSON、XML、CSV 等纯文本格式。
Solr比较成熟、稳定。
不考虑建索引的同时进行搜索,速度更快。
Solr缺点:
建立索引时,搜索效率下降,实时索引搜索效率不高。
Elasticsearch的特点:
(1)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公
司;也可以运行在单机上
(2)将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES;
(3)开箱即用的,部署简单
(4)全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理
Elasticearch的体系结构:
索引(index)
Elasticsearch里的索引概念是名词而不是动词,在elasticsearch里它支持多个索引。有点类似于关系数据库里面每一个服务器可以支持多个数据库是一个道理,在每一索引下面又可以支持多种类型,这又类似于关系数据库里面的一个数据库可以有多张表一样。但是本质上和关系数据库还是有很大的区别,我们这里暂时可以这么理解。
映射(mapping)
在有关全文搜索基础知识部分,我们提到了分析的过程:为建索引和搜索准备输入文本
文档类型(type)
在Elasticsearch中,一个索引对象可以存储很多不同用途的对象。例如,一个博客应用程序
可以保存文章和评论。文档类型让我们轻易地区分单个索引中的不同对象
文档(document)
存储在Elasticsearch中的主要实体叫文档(document)。用关系型数据库来类比的话,一个文
档相当于数据库表中的一行记录。
1.执行命令创建head
docker run -di --name=tensquareEshead -p 9100:9100 mobz/elasticsearch-head:5
2.出现的问题,启动后无法连接es服务器,我们没有设置es的配置文件,设置跨域访问
如何的解决问题的:进入容器内部
docker exec -it tensquareES /bin/bash
执行命令apt-get update
执行命令安装: apt-get install -y vim 安装vim
进入es的目录下conf配置文件目录打开 elasticsearch.yml配置文件中增加以下配置,添加如下
http.cors.enabled: true #允许跨域访问
http.cors.allow-origin: "*" #指定允许访问的ip,*代表所有ip均可访问
重新启动容器后测试
windows环境下安装:
1、找到资料中ik分词器压缩包,将压缩包解压,将解压文件夹拷贝到/ES_HOME/plugins/下
2、重启ElasticSearch服务-
3、两种分词策略:ik_smart ik_max_word
4、扩展自定义字典。新建自定义词典文件 xx.dic 添加扩展词组 在ik分词器配置文件中加载
docker环境下安装:
1、将ik分词器压缩包上传到服务器、解压、重命名 mv
2、目标:宿主机跟容器进行文件拷贝
**在宿主机执行命令:docker cp 源文件 目标文件夹
**进入容器获取es存放插件目录:1a4bf55d4c9d:/usr/share/elasticsearch/plugins
注意出现问题: 无法安装vim命令
如何解决: 用docker cp 源 目的 这个命令docker 的拷贝命令
可以从容器拷贝到宿主机
也可以从宿主机拷贝到容器
就是注意两个目的源的位置
3aa7ac37d605:/usr/share/elasticsearch/config
3aa7ac37d605:/usr/share/elasticsearch/plugins
最小切分:
http://192.168.72.135:9200/_analyze?analyzer=ik_smart&pretty=true&text=%E6%88%91%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%91%98
最大切分:
http://192.168.72.135:9200/_analyze?analyzer=ik_max_word&pretty=true&text=%E6%88%91%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%91%98
elasticsearch和solr的搜索比较:
https://www.cnblogs.com/chowmin/articles/4629220.html
需求分析:完成首页的搜索功能,可以通过标题或者内容进行进行搜索
创建项目tensquare_search
编写启动类
pojo编写
@Document(indexName = "tensquare",type = "article") public class Article implements Serializable { @Id private String id;//ID private String columnid;//专栏ID private String userid;//用户ID @Field(index = true, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word") private String title;//标题 @Field(index = true, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word") private String content;//文章正文 private String image;//文章封面 private java.util.Date createtime;//发表日期 private java.util.Date updatetime;//修改日期 private String ispublic;//是否公开 private String istop;//是否置顶 private Integer visits;//浏览量 private Integer thumbup;//点赞数 private Integer comment;//评论数 private String state;//审核状态 private String channelid;//所属频道 private String url;//URL private String type;//类型
dao编写
public interface ArticleIndexDao extends ElasticsearchRepository{ /** * 检索 */ public Page findByTitleOrContentLike(String title, String content, Pageable pageable); }
service编写
@Service public class ArticleService { @Autowired private ArticleIndexDao articleIndexDao; @Autowired private IdWorker idWorker; //保存文章 public void add(Article article){ article.setId(idWorker.nextId()+""); articleIndexDao.save(article); } /** * 搜索 */ public PagefindByTitleLike(String keywords, int page, int size){ PageRequest pageRequest = PageRequest.of(page - 1, size); return articleIndexDao.findByTitleOrContentLike(keywords,keywords,pageRequest); } }
controller 层编写
@RestController @CrossOrigin @RequestMapping("/article") public class ArticleController { @Autowired private ArticleService articleService; /** * 添加文章 */ @PostMapping public Result add(@RequestBody Article article){ articleService.add(article); return new Result(true, StatusCode.OK,"添加成功"); } /** * 搜索服务的开发 */ @GetMapping("/search/{keywords}/{page}/{size}") public Result findByTitleLike(@PathVariable String keywords,@PathVariable int page,@PathVariable int size){ PagearticlePage = articleService.findByTitleLike(keywords, page, size); return new Result(true,StatusCode.OK,"查询成功",new PageResult (articlePage.getTotalElements(),articlePage.getContent())); } }
test类
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = SearchApplication.class) public class ESTest { @Autowired private ElasticsearchTemplate elasticsearchTemplate; /** * 创建索引 */ @Test public void test(){ boolean index = elasticsearchTemplate.createIndex(Article.class); System.out.println(index); } /** * 添加内容 */ @Test public void testSave(){ Article article = new Article(); article.setTitle("我是标题"); article.setContent("我是内容"); IndexQuery indexQuery = new IndexQuery(); indexQuery.setObject(article); ArrayListlist = new ArrayList<>(); list.add(indexQuery); elasticsearchTemplate.bulkIndex(list); } }
2.Elasticsearch和mysql数据库同步
logstash 的介绍:
Logstash 是一个开源的数据收集引擎,它具有备实时数据传输能力。它可以统一过滤来自不同源的数据,并按照开发者的制定的规范输出到目的地。
顾名思义,Logstash 收集数据对象就是日志文件。由于日志文件来源多(如:系统日志、服务器 日志等),且内容杂乱,不便于人类进行观察。因此,我们可以使用 Logstash 对日志文件进行收集和统一过滤,变成可读性高的内容,方便开发者或运维人员观察,从而有效的分析系统/项目运行的性能,做好监控和预警的准备工作等。
1、全量数据同步-先清空索引库,将所有记录全部新增
2、增量数据同步-如果数据没有被改变不同步数据
原理:logstash通过配置记录标记(updatetime是否被修改过)
record_last_run => true use_column_value => true tracking_column => "updatetime" sql:select * from tb_article where updatetime > :sql_last_value
3.面试常问
1.项目 如何开发搜索模块
elasticsearch spring data elasticsearch
2.如何实现数据库与索引库的同步
通过logstash
3.如何实现索引库的分词
IK分词器 两种算法 最少切分 最细切分
4.solr和elasticsearch的性能区分