• Elasticsearch


    Elasticsearch总结

    1:项目结构

     

    2.介绍

             2.1 什么是elasticsearch

                       它是一个天生的实时的分布式搜索和分析引擎。他可以处理大规模的数据,在大规模的搜索时相比solr的效率高性能好,不需要借助外部插件来完成分布式搜索功能。是一个基于lucene的搜索服务器。基于restful web接口,它是用java语言开发的,能达到实时搜索,稳定、可靠、快速、安装使用方便等优势。

                       注释:实时搜索(多次搜索的结果动态变化,不局限于静态数据的搜索)

             2.2 elasticsearch的特点

    (1)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公

    司;也可以运行在单机上

    (2)将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES;

    (3)开箱即用的,部署简单

    (4)全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理

    3.基本概念

             3.1索引(一般称索引库,类比关系型数据库的数据库)

             3.2类型(类比关系型数据库中的表)

             3.3文档(类比数据库中的行)

    4.postman调用restAPI

             4.1创建索引

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

    注意无需添加body数据

    http://127.0.0.1:9200/articleindex/

             4.2新建文档

    以post方式提交 http://127.0.0.1:9200/索引名称/类型(文档名称)

    Body需要添加json数据(类比添加文档下的字段及内容)

    {

             “key”:”value”

    }

             4.3查询一个类型(全部文档)

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

    http://127.0.0.1:9200/articleindex/article/_search 返回结果如下:

                       _id是由系统自动生成的。

    4.4修改类型(全部文档)

    如果我们在地址中的ID不存在,则会创建新文档

    以put形式提交以下地址:

    http://192.168.184.134:9200/索引/类型/AWPKrI4pFdLZnId5S_F7

    body:

    {

             “key”:”value”

    }

    注意:如果类型有多个数据,修改必须将未修改的数据也写上,否则丢失其他数据。

             4.5_id查询类型的数据

                       GET方式请求

    http://192.168.184.134:9200/articleindex/article/1

    4.6基本匹配查询(模糊查询*代表0到多个任意字符)

    根据某列进行查询 get方式提交下列地址:

    http://192.168.184.134:9200/articleindex/article/_search?q=title:titleValue

    http://192.168.184.134:9200/articleindex/article/_search?q=title:titleValue*

    titleValue可以用使用正则

             4.7删除文档

    根据ID删除文档,删除ID为1的文档 DELETE方式提交

    http://192.168.184.134:9200/articleindex/article/1

    5.Head插件的安装与使用(可视化界面操作ES)

    如果都是通过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的项目构建工具。它可以自动运行你所设定的任务

    npm install ‐g grunt‐cli

    步骤5:安装依赖

    cnpm install

    步骤6:

    进入head目录启动head,在命令提示符下输入命令

    grunt server

    步骤7:

    打开浏览器,访问head插件项目,输入http://localhost:9100

    步骤8:

    点击连接按钮没有任何相应,按F12发现有如下错误

    No 'Access-Control-Allow-Origin' header is present on the requested resource

    这个错误是由于elasticsearch默认不允许跨域调用,而elasticsearch-head是属于前端工程,所以报错。

    我们这时需要修改elasticsearch的配置,让其允许跨域访问。

    修改elasticsearch配置文件:elasticsearch.yml,增加以下两句命令:

    http.cors.enabled: true

    http.cors.allow-origin: "*"

    此步为允许elasticsearch跨越访问 点击连接即可看到相关信息

    5.1 Head插件操作

    5.1.1 新建索引

    选择“索引”选项卡,点击“新建索引”按钮

    输入索引名称点击OK

    5.1.2 新建或修改文档

    在复合查询中提交地址,输入内容,提交方式为PUT

    点击数据浏览 ,点击要查询的索引名称,右侧窗格中显示文档信息

    点击文档信息:

    修改数据后重新提交请求 , ID已经存在,所以执行的是修改操作。

    不存在则为添加操作

    重新查询此记录,发现版本为2。也就是说每次修改后版本都会增加1.

    5.1.3 查询

    不点击任何表示查询所有索引的文档,点击谁单独查谁。

    5.1.4 删除

    6.ik分词器

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

    文分词器来解决这个问题。

    IK分词是一款国人开发的相对简单的中文分词器。虽然开发者自2012年之后就不在维护

    了,但在工程应用中IK算是比较流行的一款!我们今天就介绍一下IK中文分词器的使用。

    IK提供了两个分词算法ik_smart 和 ik_max_word

    其中 ik_smart 为最少切分,ik_max_word为最细粒度划分

    http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=搜索关键字

    6.4 自定义词库(添加词库)

    测试"传智播客",浏览器的测试效果如下:

    http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=传智播客

    不存在词语,所以单个字都分开了。

    所以需要添加额外的词语

    步骤

    (1)进入elasticsearch/plugins/ik/config目录

    (2)新建一个my.dic文件,编辑内容:

    传智播客

    修改IKAnalyzer.cfg.xml(在ik/config目录下)添加my.dic文件到配置中

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

    7.使用java继承Springdate-elasticsearch

             1.导入Spring-date-elasticsearch坐标

             2.编写application.yml配置文件

                       server:

      port: 9007

    spring:

      application:

        name: tensquare‐search #指定服务名

      data:

        elasticsearch:

          cluster‐nodes: 127.0.0.1:9300        

             3.dao层接口继承ElasticsearchRepository<对应类,String>接口

             4.在对应类中要添加以下注释

    //indexName:数据库(索引)名称,article类型名称
    @Document(indexName = "tensquare_article",type = "article")
    public class Article implements Serializable {

    @Id
    private String id;

    //是否索引,就看该字段能否被搜索
    //是否分词,表示搜索的时候是整体匹配还是单词匹配
    //是否存储,就是是否在页面显示
    // 使用查询分词器searchAnalyzer = "ik_max_word",要与存的分词器相同
    // 使用存储分词器:analyzer ="ik_max_word",指的是存储到关系型数据库
    // index = true表示这列是索引

    @Field(index = true,analyzer ="ik_max_word",searchAnalyzer = "ik_max_word")

             5.在service层可以调用ElasticsearchRepository中默认支持的方法

                       在dao层可以添加jpa规则的方法搜索

                       例如

    Page<Article> findByContentOrTitleLike(String title, String content, Pageable pageable);

             6.在controller层

    return new Result(true, StatusCode.OK,"搜索成功",
    new PageResult<Article>(list.getTotalElements(),list.getContent()));

    8.注意事项

             在docker启动ES时9300端口默认不可用

    进入容器目录:

    Docker exec –it +name(或id)

             新建一个挂载新文件在docker容器中的容器:

             V 宿主机文件:docker文件

             修改挂载的文件(宿主机的文件)

             将transport.host: 0.0.0.0取消注释,外部即可访问9300端口

    9. IK分词器安装

    (1)快捷键alt+p进入sftp , 将ik文件夹上传至宿主机

    sftp> put ‐r d:setupik

    (2)在宿主机中将ik文件夹拷贝到容器内 /usr/share/elasticsearch/plugins 目录下。

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

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

    docker restart tensquare_elasticsearch

     

     
  • 相关阅读:
    关于MySQL与SQLLite的Group By排序原理的差别
    利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)
    深入java并发Lock一
    windows 7 SDK和DDK下载地址
    用cocos2d-x 3.2 实现的FlappyBird
    Java替代C语言的可能性
    Spring Quartz结合Spring mail定期发送邮件
    web小流量实验方案
    paip.微信菜单直接跳转url和获取openid流程总结
    【java web】java运行预编译Groovy脚本
  • 原文地址:https://www.cnblogs.com/erfsfj-dbc/p/10773853.html
Copyright © 2020-2023  润新知