PHP使用elasticsearch搜索安裝及分詞方法

簡介

爲什麼會用到這個ES搜索? 是因爲我在看烏雲的漏洞案例庫時候,搜索即爲不方便。

比如說說我要搜索一個 SQL注入

那mysql匹配的時候是like模糊匹配,搜索必須要有SQL注入這四個字,連續的才能查找到那這樣會不太方便。

然後我就想着做一個分詞,搜索起來會方便不少,第一個想到的就是ES搜索了。

怎麼去用ES呢?

第一步 安裝ES搜索

我們只需要一個JAVA環境並且把Java的環境變量配置好,我相信這些JAVA環境大家之前都配置過,這裏不多說。

那現在只需要下載ES的文件,也不需要編譯,下載下來就行了,把他放到一個目錄。 下載地址: https://www.elastic.co/downlo...

第二步 安裝head

head是基於node開發的,所以需要先安裝node node下載地址:http://cdn.npm.taobao.org/dis...

在電腦任意一個目錄下(不要在elasticsearch目錄裏面),執行一下命令,

git clone https://github.com/mobz/elasticsearch-head.git  
cd elasticsearch-head/  
npm install  

3、修改部分配置 修改兩個地方: 文件:elasticsearch-headGruntfile.js

connect: {
    server: {
        options: {
            port: 9100,
            hostname: '*',
            base: '.',
            keepalive: true
        }
    }
}

增加配置,文件:elasticsearch-5.6.0configelasticsearch.yml

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

4、輸入 npm run start 啓動

5、訪問head管理頁面: http://localhost:9100/

第三步 安裝composer

就是我們需要安裝composer,安裝composer幹什麼呢?

下載地址:https://getcomposer.org/Compo...

下載之後,直接下一步下一步就安裝好了。

因爲我們PHP如果調用ES搜索的接口,我們是需要去下載一個類庫。

1. 在當前目錄下載composer.phar
curl -sS https://getcomposer.org/installer | php
2. 在當前目錄下創建一個composer.json的文件
{
    "require": {
        "elasticsearch/elasticsearch": "~2.0@beta"
    }
}
3. 安裝依賴
php composer.phar install

第四步 安裝分詞插件

就是說我們需要安裝一個分詞插件。 在ES搜索當中Ik分詞插件是中文分詞最好用的一個,安裝也極爲方便。

我們只需要到GitHub上把他對應版本的這個,文件下載下來,然後解壓到ES的插件目錄,然後重新啓動一下ES搜索服務,就可以了。

下載地址:https://github.com/medcl/elas...

怎麼去驗證這個插件有沒有安裝成功呢? 我們可以通過下面的URL,做分詞測試。 http://localhost:9200/你的庫名/_analyze?analyzer=ik_max_word&pretty=true&text=中華人民共和國

我們可以在這個URL中輸入,中華人民共和國; 默認的分詞器他會把中華人民共和國分別以以 中、華、人、民、共、和、國。

那我們選擇用IK作爲分詞器後,它是可以把 中華人民共和國 作爲一個詞,把中華作爲一個詞。

第五步 導入數據

現在說一下怎麼把數據庫中的數據導入到ES中,

首先需要建立這樣一個庫, 然後把數據按照固定的格式插入到ES搜索中。下面是我的一個代碼示例

<?php
require_once './vendor/autoload.php';

//連接MYSQL數據庫
function get_conn()
{
    @$conn = mysql_connect("localhost", "root", "") or die("error connecting");
    mysql_select_db("wooyun", $conn);
    mysql_query("SET NAMES 'UTF8'");
    return $conn;
}

//插入數據到ES搜索中
function create_index($maxId, $client)
{
    //查詢數據庫中的數據
    $sql = "SELECT * FROM bugs where id > $maxId limit 0,300";
    get_conn();
    @$result_bugs = mysql_query($sql);
    while (@$row = mysql_fetch_assoc(@$result_bugs)) {
        $rtn[] = $row;
    }

    foreach ($rtn as $val) {
        $params = array();
        $params['body'] = array(
            'id' => $val['id'],
            'wybug_id' => $val['wybug_id'],
            'wybug_title' => $val['wybug_title'],
        );
        $params['index'] = 'wooyun';
        $params['type'] = 'title';
        $client->index($params);
    }

    return (count($rtn) == 300) ? $val['id'] : false;
}

set_time_limit(0);
$client = Elasticsearch\ClientBuilder::create()->setHosts(['localhost'])->build();
//刪除所有數據
$client->indices()->delete(['index' => 'wooyun']);

$a = true;
$maxId = 0;
while ($a) {
    $maxId = create_index($maxId, $client);
    if (empty($maxId)) {
        $a = false;
    }
}

第六步 查詢數據

<?php
//引入mysql連接,和ES類庫
require('conn.php');
require_once 'vendor/autoload.php';
function search($keyword, $page = 0, $size = 20)
{
    //對象實例化
    $client = Elasticsearch\ClientBuilder::create()->setHosts(['localhost'])->build();
    //查詢數據的拼裝
    $params = array();
    $params['index'] = 'wooyun';
    $params['type'] = 'title';
    $params['body']['query']['match']['wybug_title'] = $keyword;
    $params['from'] = $page;
    $params['size'] = $size;
    //執行查詢
    $rtn = $client->search($params)['hits'];
    //結果組裝組裝數據
    $data['total'] = $rtn['total'];
    $data['lists'] = array_column($rtn['hits'], '_source');
    $data['lists'] = formartData(array_column($data['lists'], 'id'));

    return $data;
}

function formartData($ids)
{
    $ids = implode($ids, ',');
    $sql = "select * from bugs where id in($ids)";
    $data = mysql_query($sql);

    $rtn = [];
    while (@$row = mysql_fetch_assoc(@$data)) {
        $rtn[] = $row;
    }

    return $rtn;
}

$q0 = isset($_GET['q']) ? $_GET['q'] : 'SQL注入';
$num = "15"; //每頁顯示15條
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$offset = ($page - 1) * $num;
$esData = search($q0, $offset, $num);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章