PHP использует elasticsearch для поиска методов установки и сегментации слов.

задняя часть PHP Elasticsearch Composer

Введение

Зачем использовать этот поиск ES? Это потому, что когда я просматриваю библиотеку случаев уязвимостей Wuyun, искать ее неудобно.

Допустим, я хочу найтиSQL-инъекция

Когда mysql совпадает, это похоже на нечеткое сопоставление, в поиске должны быть эти четыре слова SQL инъекции, а найти их подряд будет неудобно.

Потом подумал сделать сегментацию по словам, по которой было бы гораздо удобнее искать.Первое, что пришло в голову, это поиск по ES.

Как пользоваться ЭС?

Первый шаг — установить ES search

Нам нужна только среда JAVA и настройка переменных среды Java.Я полагаю, что эти среды JAVA были настроены ранее, поэтому я не буду здесь много говорить.

Теперь вам нужно только скачать файл ES, и вам не нужно его компилировать, просто скачайте его и поместите в каталог.
ссылка для скачивания:www.elastic.co/downlo...

Второй этап – установка головы.

head разработан на основе узла, поэтому вам нужно сначала установить узел
адрес загрузки узла: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. Посетите страницу управления головой:http://localhost:9100/

Третий шаг - установить композитор

То есть, что нам нужно для установки Composer, что делать с Composer?

ссылка для скачивания: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, и все.

ссылка для скачивания:GitHub.com/Many out/Ola Mountain. …

Как я могу убедиться, что плагин был успешно установлен?
Мы можем выполнить тест сегментации слов по следующему URL-адресу.
http://localhost:9200/название вашей библиотеки/_analyze?analyzer=ik_max_word&pretty=true&text=PRC

Мы можем ввести Китайскую Народную Республику в этот URL-адрес; токенизатор по умолчанию разделит Китайскую Народную Республику на слова 中, 华, 人, 民, 公, 和 и 国.

Затем, после того как мы решили использовать IK в качестве токенизатора, он может использовать Китайскую Народную Республику как слово и Китай как слово.

Шаг 5 Импорт данных

Теперь поговорим о том, как импортировать данные из БД в ЕС,

Во-первых, вам необходимо создать такую ​​библиотеку, а затем вставить данные в поиск 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;
    }
}

Шаг 6 Запрос данных

<?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);