Elasticsearch 安装和使用

我这里使用的环境是 ubuntu18.04 
把压缩包移动到你想要的安装目录解压缩
tar -zxvf elasticsearch-7.6.2-linux-x86_64.tar.gz
es 7.+ 版本后不需要下载 jdk 环境,压缩包自带了环境,只需要配置 java 环境变量
修改环境变量 
vim /etc/profile 
将下列添加到末尾
export JAVA_HOME=/home/vagrant/elasticsearch-7.6.2/jdk // 这里的路径是 elasticsearch/jdk 的路径
export JRE_HOME=/${JAVA_HOME}
export CLASSPATH=.:${JAVA_HOME}/libss:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH 
运行
source  /etc/profile 
查看 java -version 版本 
openjdk version "13.0.2" 2020-01-14
OpenJDK Runtime Environment AdoptOpenJDK (build 13.0.2+8)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 13.0.2+8, mixed mode, sharing)
说明配置成功 
  • 启动
es 不能使用 root 用户启动
新建用户 useradd es
设置用户密码 passwd  es 
更改 es 用户组 chown -R es.es elasticsearch-7.6.2
切换用户 su es  切换到 es/bin 目录下 
启动 es 
./elasticsearch  
后台启动 ./elasticsearch -d
在终端 运行 curl localhost:9200 可以看到 es 相关信息,说明启动成功。
  • 开启 es 远程连接权限
修改 config 中 elasticsearch.yml
network.host: 0.0.0.0
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
切换到 root 用户 
 vim /etc/security/limits.conf
*          soft     nofile      65536
*          hard     nofile      65536
*          soft     nproc       4096
*          hard     nproc       4096
通过以下命令查看是否生效
ulimit -Hn
ulimit -Hu
ulimit -Sn
ulimit -Su
修改  /etc/sysctl.conf 文件
末尾添加 vm.max_map_count=262144
执行 sysctl -p 生效配置
然后切换回 es 用户 重新启动 es 即可
启动后会有一个警告关于 主节点为发现  可以修改 elasticsearch.yml
node.name: node-1
cluster.initial_master_nodes: ["node-1"]
再次启动即可
在 浏览器访问 es ,看到 es 相关信息说明配置成功
解压 tar -zxvf kibana-7.6.2-linux-x86_64.tar.gz
修改 kibana.yml 文件
server.host: "192.168.111.198"
elasticsearch.hosts: ["http://192.168.111.198:9200"]
启动 kibana  bin 目录下运行 ./kibana
启动 kibana 后,发现 es 自动 killed  可能是内存不足
需要修改 jvm.options 文件
cd /elasticsearch/config  
vim jvm.options
-Xms1g  
-Xmx1g
都改为 -Xms512m
  • 安装 ik 中文分词 ik
1. 在线安装
在 es bin 目录下 运行, 要切换到可以执行 es 的用户上
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
其中版本号换成你自己的 es 版本,下载速度取决于你的网速
2. 本地安装 
选择对应 es 版本的包
在 elasticsearch/plugins 目录下 新建 ik 目录 mkdir ik 
移动包 到 ik 目录,然后解压包 unzip 
重启 es 即可

ik 有 2 中分词类型 
ik_smart ik_max_word 
比如市场营销这个词
ik_smart 认为是一个词,不会进行分词
ik_max_word 会分为 市场、营销、市场营销 3个词
选择哪种类型根据自己的需求来

ik 配置分词词典, 在 es 的 plugins/ik/config 下 有个 IKAnalyzer.cfg.xml.
按照注释配置该文件即可。
  • 配置 Es 集群
复制 elasticsearch 服务,分别命名为 node1 node2 ,这里我配置3个节点
分别修改3个服务的 elasticsearch.yml 文件,这里我以其中一个为例
cluster.name: es  // 必须一样
node.name: node-1 // 必须不一样,相当于该节点的名字
network.host: 192.168.31.199 // 你的 ip 地址
http.port: 9200 // 必须不一样
transport.port: 9300 // 必须不一样
// 该节点访问其他节点的 ip 地址,使用 transport.port 端口
discovery.seed_hosts: ["192.168.31.198:9301", "192.168.31.198:9302"]
cluster.initial_master_nodes: ["node-1"] // 主节点名称 
gateway.recover_after_nodes: 3 // 节点个数
3台服务都配置完成后,启动服务
然后在 kibana 中 调用 
GET /_cat/health?v
返回的信息中:
//集群名称            集群状态               节点个数
cluster              status                node.total 
es                    green                    3         
说明集群配置成功

laravel 使用 ELasticsearch

安装依赖包
composer require tamayo/laravel-scout-elastic
生成配置文件
php artisan vendor:publish  选择 laravel/scout
修改配置文件
// 驱动修改为 elasticsearch
'driver' => env('SCOUT_DRIVER', 'elasticsearch'),
// 添加 elasticsearch 配置项
'elasticsearch' => [
        'index' =>  'article',
        'hosts' => '192.168.31.199:9200', // 此处 ip 为你的 es 配置ip 
        ]
    ]
// 添加模型配置
 use  Searchable;
// 获取模型的可搜索数据
public function toSearchableArray()
 {
     return [
         'title' => $this->title,
         'content' => $this->content,
         'id' => $this->id,
         'price' => $this->price
     ];
 }
 // 数据库索引的类型
 public function searchableAs()
 {
     return '_doc';
 }


在app.PHP中添加对应的 ServiceProvider
Laravel\Scout\ScoutServiceProvider::class,
ScoutEngines\Elasticsearch\ElasticsearchProvider::class

// 向 es 中添加索引, 可以在 kibana 中创建索引,也可以创建命令来完成 es 初始化。这里我选择创建命令
php artisan make:command initEs

public function handle()
 {
       $client =  new Client();
       //  请求地址为你的 es host 后面的 article 就是索引,与 es 配置中的 index 一致。
        $url = 'http://192.168.31.199:9200/article';
        $client->put($url, [
            'json' => [
                'mappings' => [
                    "properties" => [
                        "content" => [
                            "type" => "text",
                            "analyzer" => "ik_max_word",
                            "fields" => [
                                "keyword" => [
                                    "type" => "keyword",
                                    "ignore_above" => 256
                                ]
                            ]
                        ],
                        "title" => [
                            "type" => "text",
                            "analyzer" => "ik_max_word",
                            "fields" => [
                                "keyword" => [
                                    "type" => "keyword",
                                    "ignore_above" => 256
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]);
    }
运行 php artisan initEs  // 初始化索引
运行 php artisan scout:import 'App\Article' // 导入数据库到 es
// 查询数据
使用  Article::search($query)->get();

相关的模型增加、删除等操作请查看文档

Scout 全文搜索

  • 高亮显示
$client = ClientBuilder::create()->setHosts(['192.168.31.198:9200'])->build();
        $res = $client->search([
            'index' => 'article',
            'type' => '_doc',
            'body' => [
                'query' => [
                    'multi_match' =>[
                        'query' => '市场营销',  //参数
                        'fields' => ['title', 'content']
                    ]
                ],
                'highlight' => [
                    'fields' => ['*' => (object)[]],
                    'pre_tags' => ['<span>'],
                    'post_tags' => ["</span>"]
                ]
            ]
        ]);

$res 返回的是 json 数据,自行拼接想要的数据即可
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!