Введение
Зачем использовать этот поиск 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);