美文网首页
分布式搜索引擎ElasticSearch

分布式搜索引擎ElasticSearch

作者: 過眼云烟 | 来源:发表于2019-06-08 17:25 被阅读0次
    下表是Elasticsearch与MySQL数据库逻辑结构概念的对比
    Elasticsearch             关系型数据库Mysql
    索引(index)               数据库(databases)
    类型(type)                 表(table)
    文档(document)         行(row)
    

    下载ElasticSearch 5.6.8版本
    https://www.elastic.co/downloads/past-releases/elasticsearch-5-6-8
    无需安装,解压安装包后即可使用
    在命令提示符下,进入ElasticSearch安装目录下的bin目录,执行命令,即可启用

    elasticsearch
    

    9200,9300端口启动后,打开浏览器,在地址栏输入http://127.0.0.1:9200/ 即可看到输出结果

    {
    "name" : "uV2glMR",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "RdV7UTQZT1‐Jnka9dDPsFg",
    "version" : {
    "number" : "5.6.8",
    "build_hash" : "688ecce",
    "build_date" : "2018‐02‐16T16:46:30.010Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.1"
    },
    "tagline" : "You Know, for Search"
    }
    
    Postman调用RestAPI

    ####### 例如我们要创建一个叫articleindex的索引 ,就以put方式提交

    http://127.0.0.1:9200/articleindex/
    

    ####### 新建文档

    以post方式提交 http://127.0.0.1:9200/articleindex/article
    body:
    {
    "name" : "uV2glMR",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "RdV7UTQZT1‐Jnka9dDPsFg",
    "version" : {
    "number" : "5.6.8",
    "build_hash" : "688ecce",
    "build_date" : "2018‐02‐16T16:46:30.010Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.1"
    },
    "tagline" : "You Know, for Search"
    }
    {
    "title":"SpringBoot2.0",
    "content":"发布啦"
    }
    返回结果如下:
    {
    "_index": "articleindex",
    "_type": "article",
    "_id": "AWPKsdh0FdLZnId5S_F9",
    "_version": 1,
    "result": "created",
    "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
    },
    "created": true
    }
    
    查询全部文档

    ####### 查询某索引某类型的全部数据,以get方式请求

    http://127.0.0.1:9200/articleindex/article/_search 返回结果如下:
    {
    "_index": "articleindex",
    "_type": "article",
    "_id": "AWPKsdh0FdLZnId5S_F9",
    "_version": 1,
    "result": "created",
    "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
    },
    "created": true
    }
    北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
    2.2.4 修改文档
    以put形式提交以下地址:
    {
    "took": 5,
    "timed_out": false,
    "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
    },
    "hits": {
    "total": 2,
    "max_score": 1,
    "hits": [
    {
    "_index": "articleindex",
    "_type": "article",
    "_id": "AWPKrI4pFdLZnId5S_F7",
    "_score": 1,
    "_source": {
    "title": "SpringBoot2.0",
    "content": "发布啦"
    }
    },
    {
    "_index": "articleindex",
    "_type": "article",
    "_id": "AWPKsdh0FdLZnId5S_F9",
    "_score": 1,
    "_source": {
    "title": "elasticsearch入门",
    "content": "零基础入门"
    }
    }
    ]
    }
    }
    
    修改文档 以put方式提交
    http://192.168.184.134:9200/articleindex/article/AWPKrI4pFdLZnId5S_F7
    body:
    返回结果:
    如果我们在地址中的ID不存在,则会创建新文档
    以put形式提交以下地址:
    http://192.168.184.134:9200/articleindex/article/1
    body:
    返回信息:
    {
    "title":"SpringBoot2.0正式版",
    "content":"发布了吗"
    }
    {
    "_index": "articleindex",
    "_type": "article",
    "_id": "AWPKsdh0FdLZnId5S_F9",
    "_version": 2,
    "result": "updated",
    "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
    },
    "created": false
    }
    {
    "title":"十次方课程好给力",
    "content":"知识点很多"
    }
    北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
    再次查询,看是否有新增的这条文档
    2.2.5 按ID查询文档
    GET方式请求
    http://192.168.184.134:9200/articleindex/article/1
    2.2.6 基本匹配查询
    根据某列进行查询 get方式提交下列地址:
    http://192.168.184.134:9200/articleindex/article/_search?q=title:十次方课程
    好给力
    以上为按标题查询,返回结果如下:
    {
    "_index": "articleindex",
    "_type": "article",
    "_id": "1",
    "_version": 1,
    "result": "created",
    "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
    },
    "created": true
    }
    
    按ID查询文档 GET方式请求
    http://192.168.184.134:9200/articleindex/article/1
    
    基本匹配查询 根据某列进行查询 get方式提交下列地址:
    http://192.168.184.134:9200/articleindex/article/_search?q=title:十次方课程
    好给力
    按标题查询结果如下
    {
    "took": 10,
    "timed_out": false,
    "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
    },
    "hits": {
    "total": 1,
    "max_score": 2.0649285,
    "hits": [
    {
    "_index": "articleindex",
    "_type": "article",
    "_id": "1",
    "_score": 2.0649285,
    "_source": {
    "title": "十次方课程好给力",
    "content": "知识点很多"
    }
    }
    ]
    }
    }
    
    模糊查询 我们可以用*代表任意字符
    http://192.168.184.134:9200/articleindex/article/_search?q=title:*s*
    
    删除文档 根据ID删除文档,删除ID为1的文档 DELETE方式提交
    http://192.168.184.134:9200/articleindex/article/1
    返回结果如下:
    {
    "found": true,
    "_index": "articleindex",
    "_type": "article",
    "_id": "1",
    "_version": 2,
    "result": "deleted",
    "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
    }
    }
    

    Head插件的安装与使用

    通过rest请求的方式使用Elasticsearch,未免太过麻烦,而且也不够人性化。我
    们一般都会使用图形化界面来实现Elasticsearch的日常管理,最常用的就是Head插件

    步骤1:
    下载head插件:https://github.com/mobz/elasticsearch-head
    配套资料中已提供。 elasticsearch-head-master.zip
    步骤2:
    解压到任意目录,但是要和elasticsearch的安装目录区别开。
    步骤3:
    安装node js ,安装cnpm
    npm install ‐g cnpm ‐‐registry=https://registry.npm.taobao.org   //如安装过,跳过
    步骤4:
    将grunt安装为全局命令 。Grunt是基于Node.js的项目构建工具。它可以自动运行你所
    设定的任务
    步骤5:安装依赖
    cnpm install
    步骤6:
    进入head目录启动head,在命令提示符下输入命令
    步骤7:
    打开浏览器,输入 http://localhost:9100
    步骤8:
    点击连接按钮没有任何相应,按F12发现有如下错误
    No 'Access-Control-Allow-Origin' header is present on the requested resource
    这个错误是由于elasticsearch默认不允许跨域调用,而elasticsearch-head是属于前端工
    程,所以报错。
    我们这时需要修改elasticsearch的配置,让其允许跨域访问。
    修改elasticsearch配置文件:elasticsearch.yml,增加以下两句命令:
    此步为允许elasticsearch跨越访问 点击连接即可看到相关信息
    npm install ‐g grunt‐cli
    grunt server
    http.cors.enabled: true
    http.cors.allow‐origin: "*"
    此步为允许elasticsearch跨越访问 点击连接即可看到相关信息
    
    Head插件操作
    新建索引

    选择“索引”选项卡,点击“新建索引”按钮,输入索引名称点击OK

    新建或修改文档

    在复合查询中提交地址,输入内容,提交方式为PUT,点击数据浏览 ,点击要查询的索引名称,右侧窗格中显示文档信息
    点击文档信息:
    修改数据后重新提交请求 , 此时因为ID已经存在,所以执行的是修改操作。
    重新查询此记录,发现版本为2 。也就是说每次修改后版本都会增加1.

    删除文档

    DELETE方式提交,带上ID号

    IK分词器

    我们在浏览器地址栏输入http://127.0.0.1:9200/_analyze?
    analyzer=chinese&pretty=true&text=我是程序员,浏览器显示效果如下

    {
    "tokens" : [
    {
    "token" : "我",
    "start_offset" : 0,
    "end_offset" : 1,
    "type" : "<IDEOGRAPHIC>",
    "position" : 0
    },
    {
    "token" : "是",
    "start_offset" : 1,
    "end_offset" : 2,
    "type" : "<IDEOGRAPHIC>",
    "position" : 1
    },
    {
    "token" : "程",
    "start_offset" : 2,
    "end_offset" : 3,
    "type" : "<IDEOGRAPHIC>",
    "position" : 2
    },
    {
    "token" : "序",
    "start_offset" : 3,
    "end_offset" : 4,
    "type" : "<IDEOGRAPHIC>",
    "position" : 3
    },
    {
    "token" : "员",
    "start_offset" : 4,
    "end_offset" : 5,
    "type" : "<IDEOGRAPHIC>",
    "position" : 4
    }
    ]
    }
    

    默认的中文分词是将每个字看成一个词,这显然是不符合要求的,所以我们需要安装中
    文分词器来解决这个问题。

    IK分词器安装

    下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases 下载5.6.8版
    本 课程配套资源也提供了: 资源\配套软件\elasticsearch\elasticsearch-analysis-ik-
    5.6.8.zip
    (1)先将其解压,将解压后的elasticsearch文件夹重命名文件夹为ik
    (2)将ik文件夹拷贝到elasticsearch/plugins 目录下。
    (3)重新启动,即可加载IK分词器

    IK分词器测试

    IK提供了两个分词算法ik_smart 和 ik_max_word
    其中 ik_smart 为最少切分,ik_max_word为最细粒度划分
    (1)最小切分:在浏览器地址栏输入地址
    http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员

    {
    "tokens" : [
    {
    "token" : "我",
    "start_offset" : 0,
    "end_offset" : 1,
    "type" : "CN_CHAR",
    "position" : 0
    },
    {
    "token" : "是",
    "start_offset" : 1,
    "end_offset" : 2,
    "type" : "CN_CHAR",
    "position" : 1
    },
    {
    "token" : "程序员",
    "start_offset" : 2,
    "end_offset" : 5,
    "type" : "CN_WORD",
    "position" : 2
    }
    ]
    }
    

    (2)最细切分:在浏览器地址栏输入地址
    http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序

    {
    "tokens" : [
    {
    "token" : "我",
    "start_offset" : 0,
    "end_offset" : 1,
    "type" : "CN_CHAR",
    "position" : 0
    },
    {
    "token" : "是",
    "start_offset" : 1,
    "end_offset" : 2,
    "type" : "CN_CHAR",
    "position" : 1
    },
    {
    "token" : "程序员",
    "start_offset" : 2,
    "end_offset" : 5,
    "type" : "CN_WORD",
    "position" : 2
    },
    {
    "token" : "程序",
    "start_offset" : 2,
    "end_offset" : 4,
    "type" : "CN_WORD",
    "position" : 3
    },
    {
    "token" : "员",
    "start_offset" : 4,
    "end_offset" : 5,
    "type" : "CN_CHAR",
    "position" : 4
    }
    ]
    }
    
    默认的分词并没有识别“传智播客”是一个词。如果我们想让系统识别“传智播客”是一个

    词,需要编辑自定义词库。

    步骤:
    (1)进入elasticsearch/plugins/ik/config目录
    (2)新建一个my.dic文件,编辑内容:
    法师打发时光
    修改IKAnalyzer.cfg.xml(在ik/config目录下)

    <properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!‐‐用户可以在这里配置自己的扩展字典 ‐‐>
    <entry key="ext_dict">my.dic</entry>
    <!‐‐用户可以在这里配置自己的扩展停止词字典‐‐>
    <entry key="ext_stopwords"></entry>
    </properties>
    

    重新启动elasticsearch,通过浏览器测试分词效果

    {
    "tokens" : [
    {
    "token" : "传智播客",
    "start_offset" : 0,
    "end_offset" : 4,
    "type" : "CN_WORD",
    "position" : 0
    }
    ]
    }
    
    示列:搜索微服务开发

    1,导入pom.xml依赖

    <dependencies>
    <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring‐data‐elasticsearch</artifactId>
    </dependency>
    <dependency>
    <groupId>com.tensquare</groupId>
    <artifactId>tensquare_common</artifactId>
    <version>1.0‐SNAPSHOT</version>
    </dependency>
    </dependencies>
    

    2,application.yml

    server:
    port: 9007
    spring:
    application:
    name: tensquare‐search #指定服务名
    data:
    elasticsearch:
    cluster‐nodes: 127.0.0.1:9300
    
    创建实体类
    /**
    * 文章实体类
    */
    @Document(indexName="tensquare",type="article")
    public class Article implements Serializable{
    @Id
    private String id;//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 state;//审核状态
    //getter and setter ......
    }
    
    controller
    @RestController
    @CrossOrigin
    @RequestMapping("/article")
    public class ArticleSearchController {
    @Autowired
    private ArticleSearchService articleSearchService;
    @RequestMapping(method= RequestMethod.POST)
    public Result save(@RequestBody Article article){
    articleSearchService.save(article);
    return new Result(true, StatusCode.OK, "操作成功");
    }
    }
    
    ArticleSearchRepository新增方法定义 dao
    /**
    * 检索
    * @param
    * @return
    */
    public Page<Article> findByTitleOrContentLike(String title, String
    content, Pageable pageable);
    
    ArticleSearchService新增方法
    public Page<Article> findByTitleLike(String keywords, int page, int size)
    {
    PageRequest pageRequest = PageRequest.of(page‐1, size);
    return
    articleSearchRepository.findByTitleOrContentLike(keywords,keywords,
    pageRequest);
    }
    
    ArticleSearchController方法
    @RequestMapping(value="/search/{keywords}/{page}/{size}",method=
    RequestMethod.GET)
    public Result findByTitleLike(@PathVariable String keywords,
    @PathVariable int page, @PathVariable int size){
    Page<Article> articlePage =
    articleSearchService.findByTitleLike(keywords,page,size);
    return new Result(true, StatusCode.OK, "查询成功",
    new PageResult<Article>(articlePage.getTotalElements(),
    articlePage.getContent()));
    }
    

    elasticsearch与MySQL数据同步 Logstash

    Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集
    起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。
    解压,进入bin目录
    logstash ‐e 'input { stdin { 输入什么} } output { stdout {输出什么} }'
    stdin,表示输入流,指从键盘输入
    stdout,表示输出流,指从显示器输出
    命令行参数:
    -e 执行
    --config 或 -f 配置文件,后跟参数类型可以是一个字符串的配置或全路径文件名或全路径
    路径(如:/etc/logstash.d/,logstash会自动读取/etc/logstash.d/目录下所有*.conf 的文
    本文件,然后在自己内存里拼接成一个完整的大配置文件再去执行)

    MySQL数据导入Elasticsearch
    (1)在logstash-5.6.8安装目录下创建文件夹mysqletc (名称随意)
    (2)文件夹下创建mysql.conf (名称随意) ,内容如下:
    (3)将mysql驱动包mysql-connector-java-5.1.46.jar拷贝至D:/logstash-
    5.6.8/mysqletc/ 下 。D:/logstash-5.6.8是你的安装目录
    (4)命令行下执行
    logstash ‐f ../mysqletc/mysql.conf
    观察控制台输出,每间隔1分钟就执行一次sql查询。
    再次刷新elasticsearch-head的数据显示,看是否也更新了数据。
    

    Elasticsearch Docker环境下安装

    (1)下载镜像 docker pull elasticsearch:5.6.8
    (2)创建容器

    docker run ‐di ‐‐name=tensquare_elasticsearch ‐p 9200:9200 ‐p 9300:9300
    elasticsearch:5.6.8
    

    (3)浏览器输入地址:http://192.168.184.134:9200/ 即可看到如下信息

    {
    "name" : "WmBn0H‐",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "2g‐VVbm9Rty7J4sksZNJEg",
    "version" : {
    "number" : "5.6.8",
    "build_hash" : "688ecce",
    "build_date" : "2018‐02‐16T16:46:30.010Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.1"
    },
    "tagline" : "You Know, for Search"
    }
    

    (4) 修改demo的application.yml

    spring:
    data:
    elasticsearch:
    cluster‐nodes: 192.168.184.135:930
    

    (5)运行测试程序,发现会报如下错误 这是因为elasticsearch从5版本以后默认不开启远程连接,需要修改配置文件

    NoNodeAvailableException[None of the configured nodes are available:
    [{#transport#‐1}{exvgJLR‐RlCNMJy‐hzKtnA}{192.168.184.135}
    {192.168.184.135:9300}]
    ]
    at
    org.elasticsearch.client.transport.TransportClientNodesService.ensureNodes
    AreAvailable(TransportClientNodesService.java:347)
    at
    org.elasticsearch.client.transport.TransportClientNodesService.execute(Tra
    nsportClientNodesService.java:245)
    at
    org.elasticsearch.client.transport.TransportProxyClient.execute(TransportP
    roxyClient.java:59)
    

    (6) 进入容器 docker exec ‐it tensquare_elasticsearch /bin/bash
    我们看到elasticsearch所在的目录为/usr/share/elasticsearch ,进入config看到了
    配置文件 elasticsearch.yml 无法使用 vi进行编辑
    (7)拷贝配置文件到宿主机

    首先退出容器(将容器中的文件拷贝出去修改),然后执行命令:

    docker cp
    tensquare_elasticsearch:/usr/share/elasticsearch/config/elasticsearch.yml
    /usr/share/elasticsearch.yml
    

    (8)停止和删除原来创建的容器

    docker stop tensquare_elasticsearch
    docker rm tensquare_elasticsearch
    

    (9)重新执行创建容器命令

    docker run ‐di ‐‐name=tensquare_elasticsearch ‐p 9200:9200 ‐p 9300:9300 ‐v
    /usr/share/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch
    .yml elasticsearch:5.6.8
    

    (10)修改/usr/share/elasticsearch.yml 将 transport.host: 0.0.0.0 前的#去掉后保
    存文件退出。其作用是允许任何ip地址访问elasticsearch .开发测试阶段可以这么做,生
    产环境下指定具体的IP
    (11)重启启动 docker restart tensquare_elasticsearch
    重启后发现重启启动失败了,这时什么原因呢?这与我们刚才修改的配置有关,因为
    elasticsearch在启动的时候会进行一些检查,比如最多打开的文件的个数以及虚拟内存
    区域数量等等,如果你放开了此配置,意味着需要打开更多的文件以及虚拟内存,所以
    我们还需要系统调优。
    (12)系统调优 修改/etc/security/limits.conf ,追加内容

    * soft nofile 65536
    * hard nofile 65536
    

    nofile是单个进程允许打开的最大文件个数 soft nofile 是软限制 hard nofile是硬限制
    修改/etc/sysctl.conf,追加内容

    vm.max_map_count=655360
    

    限制一个进程可以拥有的VMA(虚拟内存区域)的数量
    执行下面命令 修改内核参数马上生效

    sysctl ‐p
    

    (13)重新启动虚拟机,再次启动容器,发现已经可以启动并远程访问

    IK分词器安装

    (1)快捷键alt+p进入sftp , 将ik文件夹上传至宿主机
    (2)在宿主机中将ik文件夹拷贝到容器内 /usr/share/elasticsearch/plugins 目录下。

    docker cp ik tensquare_elasticsearch:/usr/share/elasticsearch/plugins/
    

    (3)重新启动,即可加载IK分词器

    docker restart tensquare_elasticsearch
    

    HEAD插件安装 (图形化操作界面)

    (1)修改/usr/share/elasticsearch.yml ,添加允许跨域配置

    http.cors.enabled: true
    http.cors.allow‐origin: "*"
    

    (2)重新启动elasticseach容器
    (3)下载head镜像
    docker pull mobz/elasticsearch‐head:5
    (4)创建head容器

    docker run ‐di ‐‐name=myhead ‐p 9100:9100 docker pull mobz/elasticsearch‐
    head:5
    

    相关文章

      网友评论

          本文标题:分布式搜索引擎ElasticSearch

          本文链接:https://www.haomeiwen.com/subject/burvxctx.html