Статьи

WordPress полнотекстовый поиск с ElasticSearch

WordPress — это отличная программа: он поддерживает миллионы веб-сайтов, хотя его встроенная функция поиска не так мощна, как могла бы. На самом деле, Automattic сами используют другое решение для поиска на WordPress.com. Ознакомьтесь с отличным сообщением в блоге и презентацией в блоге и презентацией на Elasticsearch в Automattic .

Что не так с поиском WordPress? Проще говоря, это наивное решение с простым запросом MySQL для поиска.

  • WordPress сортирует результаты поиска по возрасту поста, за исключением того, насколько релевантен результат для поискового запроса.
  • Поиск — это просто комбинация LIKE , с %query% означающим, что индекс не используется. Без индексации он может быстро убить вашу базу данных на сайте с большим трафиком, если у вас много поисков.
  • Он ищет точную фразу. Если я ищу «zsh on arch linux», WordPress возвращает ноль результатов, даже если у вас много постов, содержащих эти слова. Вы обычно не ожидаете, что пользователь введет точную фразу, не так ли?
  • Это не поддерживает нечеткий поиск. Если пользователи делают опечатку, у них нет шансов получить ожидаемый результат.

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

Мы преодолеем эти проблемы, используя поисковую систему для индексации и поиска наших данных. Мы можем подумать об использовании MySQL Full Text Search или чего-то подобного. Хотя это возможно, это может быть не лучшим решением. Вы должны определить схему, вы должны изменить базу данных WordPress по умолчанию, добавить индексы и так далее.

Если вы хотите переиндексировать большую таблицу, вы можете ввести блокировку и запретить сайту принимать новые сообщения или сообщения. Более того, это все еще удар по вашей базе данных MySQL. На сайте с большим трафиком и большим количеством запросов, это может замедлить работу базы данных. При использовании такого продукта, как ElasticSearch , вы устраняете эти вещи. Это быстрый, эффективный, оптимизированный для поиска с множеством дополнительных функций, и даже без схемы, что означает, что вы можете легко добавлять, удалять поля.

В этом уроке мы пройдем следующие два шага:

  1. Настройка ElasticSearch.
  2. Настройте плагин для индексации данных в ElasticSearch и поиска по нему.

Хорошо, что плагин откатится к поиску WordPress по умолчанию, если сервер ElasticSearch выйдет из строя.

Вы должны использовать VPS, чтобы установить поисковую систему на нем. Если вы используете обычный сервис виртуального хостинга, то вы можете использовать OpenShift в качестве альтернативного сервера, чтобы позже установить нашу поисковую систему.

ElasticSearch — это гибкий и мощный распределенный механизм поиска и анализа в реальном времени. Вы можете отправить данные в него, и они будут индексированы и доступны для поиска быстро. Он оптимизирован для своей работы: поиск. Более того, результаты включают в себя значение того, насколько хорошо данные соответствуют поисковому запросу. ElasticSearch даже поставляется с REST API, позволяющим легко запрашивать поиск или играть с ним во время тестирования / разработки с помощью такого инструмента, как Sense .

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

В зависимости от вашего дистрибутива Linux вам может понадобиться обратиться к его документации, чтобы узнать, как установить ElasticSearch. Кроме того, вы можете следовать общему руководству ElasticSearch.

1
2
3
4
5
6
7
$ wget -O — http://packages.elasticsearch.org/GPG-KEY-elasticsearch |
$ sudo sh -c ‘echo «deb http://packages.elasticsearch.org/elasticsearch/1.1/debian stable main» > /etc/apt/sources.list’
$ sudo apt-get update# We need Java for ElasticSearch
$ sudo apt-get install openjdk-7-jre-headless -y
$ sudo apt-get install elasticsearch# Run elasticsearch when booting up
$ sudo update-rc.d elasticsearch defaults 95 10
$ sudo /etc/init.d/elasticsearch start
1
$ rpm —import http://packages.elasticsearch.org/GPG-KEY-elasticsearch$ vim /etc/yum.repos.d/elastic.repo

После установки поместите это в файл конфигурации ElasticSearch:

1
[elasticsearch-1.1]name=Elasticsearch repository for 1.1.x packagesbaseurl=http://packages.elasticsearch.org/elasticsearch/1.1/centosgpgcheck=1gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearchenabled=1

Сохраните файл. И продолжить установку с yum . Обратите внимание, что мы должны установить Java 6 из стороннего репозитория, если ваш репозиторий CentOS не имеет Java 6.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
$ sudo yum install elasticsearch
 
# Make it roon when booting
 
$ sudo /sbin/chkconfig —add elasticsearch
# We need Java6+ for ElasticSearch# Ignore this section if you had Java6+
$ sudo rpm —import http://apt.sw.be/RPM-GPG-KEY.dag.txt
 
$ sudo wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
 
$ sudo rpm -Uhv rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
$ sudo yum install java-1.6.0-openjdk.x86_64 -y# Start it
 
$ sudo service elasticsearch start

После запуска ElasticSearch вы можете подтвердить, что он работает должным образом, посетив ваш домен на порту 9200 как yourdomain.com:9200 в браузере или выполнив запрос curl .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
$ curl 127.0.0.1:9200
{
  «ok» : true,
  «status» : 200,
  «name» : «Jessica Jones»,
  «version» : {
    «number» : «0.90.7»,
    «build_hash» : «36897d07dadcb70886db7f149e645ed3d44eb5f2»,
    «build_timestamp» : «2013-11-13T12:06:54Z»,
    «build_snapshot» : false,
    «lucene_version» : «4.5.1»
  },
  «tagline» : «You Know, for Search»
}

Если у вас нет VPS и вы все еще хотите его использовать, вы можете использовать платформу, такую ​​как OpenShift, чтобы установить на нее ElasticSearch. Если вы установили ElasticSearch на свой сервер, перейдите к следующему разделу.

ElasticSearch можно легко установить, загрузив программный пакет и запустив бинарный файл. Java 6 — единственная зависимость, которая у него есть. OpenShift предоставляет нам своего рода виртуальный сервер, на который мы можем установить собственное программное обеспечение.

Зарегистрируйтесь для получения учетной записи на https://www.openshift.com/ . Затем войдите в свою панель инструментов или введите этот URL https://openshift.redhat.com/app/console/applications после того, как вы вошли в систему. Нажмите «Приложения», введите «DIY», чтобы отфильтровать поле.

Затем нажмите на заголовок «Do-It-Yourself 0.1», чтобы добавить приложение в свою учетную запись. Это означает, что мы настроим приложение сами. Отсюда у вас будет возможность назвать ваше приложение и получить поддомен, например appnamesubdomain.rhccloud.com . Подождите, пока подготовка завершится, затем нажмите « Перейти к странице обзора приложения », чтобы перейти на страницу обзора приложения.

На этой странице вы увидите доменное имя вашего приложения. Это понадобится нам позже для настройки URL-адреса сервера ElasticSearch. Справа внизу вы можете увидеть «Удаленный доступ». С этим доступом мы сможем запустить команду оболочки и установить ее так же, как мы делаем с обычным VPS. Мы соберем информацию SSH для удаленного доступа в наше приложение и установим в нем ElasticSearch.

Обратите внимание на команду ssh [email protected] , мы будем использовать ее для удаленного доступа к нашему серверу в OpenShift. diy-notyim.rhcloud.com — это адрес вашего сервера, ssh — команда, которую мы используем для удаленного доступа.

Чтобы войти через SSH, вы должны предоставить свой открытый ключ OpenShift. Нажмите на вкладку « Настройки », а затем нажмите « Добавить новый ключ» …

Просто скопируйте и вставьте в него содержимое вашего открытого ключа. Ваш открытый ключ обычно находится в ~/.ssh/id_rsa.pub . Если вы не знакомы с открытыми ключами, прочитайте эти руководства о том, как их генерировать:

  1. Настройка ключей SSH
  2. SSH: что и как

Как только вы добавите свой ключ на веб-сайт OpenShift, введите эту команду, чтобы подключиться к нему. Обратите внимание, что ваш адрес будет отличаться от моего.

Вас встретит такой экран:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
*********************************************************************
 
    You are accessing a service that is for use only by authorized users.
    If you do not have authorization, discontinue use at once.
    Any use of the services is subject to the applicable terms of the
    agreement which can be found at:
    https://www.openshift.com/legal
 
    *********************************************************************
 
    Welcome to OpenShift shell
 
    This shell will assist you in managing OpenShift applications.
 
    !!!
    Shell access is quite powerful and it is possible for you to
    accidentally damage your application.
    If worse comes to worst, destroy your application with «rhc app delete»
    and recreate it
    !!!
 
    Type «help» for more info.
 
 
[diy-notyim.rhcloud.com 536ea3e4500446d9db000279]\>

Мы будем загружать и устанавливать ElasticSearch вручную. Однако мы должны сохранить загружаемый файл в папке $OPENSHIFT_DATA_DIR поскольку он сохраняется между развертываниями. Во время развертывания OpenShift удаляет почти все файлы и папки и использует инструкцию по сборке в хуке приложения для сборки и развертывания вашего приложения.

Обратите внимание, что OpenShift имеет специальную папку, которая используется для хранения постоянных данных между несколькими развертываниями. $OPENSHIFT_DATA_DIR — путь хранения переменной среды. Введите ниже команду для загрузки, установки и запуска ElasticSearch.

1
2
3
$ cd $OPENSHIFT_DATA_DIR$ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.1.1.tar.gz
$ tar xvf elasticsearch-1.1.1.tar.gz
$ cd elasticsearch-1.1.1

Как только вы elasticsearch-1.1.1 , вы должны изменить ключи и значения в файле config/elasticsearch.yml . Вы можете использовать nano или vi / vim для редактирования файла и редактирования этих значений

Как только вы отредактируете и сохраните его. Запустите ElasticSearch.

1
2
3
# Stop default DIY app to release the port
$ ctl_app stop
$ bin/elasticsearch &

Подождите, пока он запустится. Отсюда ваш URL ElasticSearch можно получить через домен, который мы настроили ранее. В моем случае это http://diy-notyim.rhccloud.com . Обратите внимание, что мы не используем порт по умолчанию 9200, потому что OpenShift не позволяет нам привязываться к нему; поэтому мы используем порт 8080, который устанавливается переменной среды ${OPENSHIFT_DIY_PORT} . Мы связываемся только с нашим внутренним IP-адресом, и OpenShift будет перенаправлять на общедоступный IP-адрес через порт 80 для нас. Из-за этого вы можете получить прямой доступ к URL-адресу http://diy-notyim.rhccloud.com без указания порта. Мы также должны остановить внутреннее приложение DIY с помощью ctl_app stop, чтобы освободить порт перед запускомasticsearch.

Запуск ElasticSearch в OpenShift, привязка к порту 8080 вместо порта 9200

Загрузите и установите плагин в хранилище плагинов WordPress . Распакуйте его в папку wp-content/plugins и активируйте его. Или, если вы используете wp-cli , это просто, как пирог.

1
2
wp install fantastic-elasticsearch
wp activate fantastic-elasticsearch

Перезагрузка панели инструментов WordPress, должен появиться новый пункт меню для ElasticSearch. Отсюда давайте настроим это.

Большинство полей описаны четко, чтобы помочь вам настроить его. Ниже приведены некоторые итоги.

Эта вкладка содержит настройки, позволяющие использовать ElasticSearch или нет. Эта вкладка также позволяет нам выбрать, какие категории должны содержаться в ElasticSearch.

Настройте сервер ElasticSearch и имя индекса. Имя индекса похоже на имя базы данных в MySQL. У вас есть сервер MySQL и несколько баз данных внутри него. Вы можете использовать любое имя, если оно используется другим сервисом.

Если ElasticSearch установлен на том же компьютере и использует настройки по умолчанию, вы можете оставить имя сервера пустым; в противном случае укажите свой URL. Например, если бы я использовал OpenShift, как описано выше, я бы ввел http://diy-notyim.rhcloud.com/ в качестве URL-адреса сервера.

Вы можете выбрать, какой тип записи, поля публикации или поля таксономии будут индексироваться ElasticSearch. Как только элемент проиндексирован, он будет доступен для поиска через ElasticSearch. Вы можете индексировать сообщения, страницы, настраиваемые поля или любые другие типы сообщений в зависимости от ваших потребностей.

Это важная вещь для сортировки результата. Например, совпадение в заголовке сообщения можно считать более точным, чем совпадение в содержании сообщения. Поэтому мы должны установить меньшее значение для содержимого публикации. Аналогично, если совпадение тега более ценно, чем совпадение в заголовке, мы установим более высокое значение для post_tag .

Моя оценка счета, вы должны изменить и принять ее в соответствии с вашими требованиями

Это относится к числу символов, которые можно поменять местами для совпадения слов. Например: если я искал Lonux , то Linux по-прежнему считается подходящим: L (i) nux-> L (o) nux. Чем меньше число, тем выше производительность. Не устанавливайте это слишком высоко. Я думаю, что 0-2 являются наиболее разумными.

Как только все настроено или изменено, пришло время применить изменения. Когда вы нажимаете re-index, он должен показать что-то, как показано ниже:

После окончания индексации. Попробуйте найти что-то на своем сайте, найдите фразу, включите / выключите поиск между значением по умолчанию и ElasticSearch, чтобы увидеть разницу. Вот мой результат поиска с поиском WordPress по умолчанию:

Нет результата при поиске по zsh arch linux с поиском по умолчанию

Вот результат поиска с ElasticSearch.

Связка постов с ElasticSearch

Всего за несколько простых шагов мы настроили мощную поисковую систему для нашего сайта. Чем более точный результат поиска, тем лучше будут впечатления наших посетителей. Если на вашем сайте интенсивный трафик, и одна установка ElasticSearch не может выполнить поиск, вы можете добавить больше узлов в ElasticSearch для выполнения распределенного поиска .

Обратите внимание, что по умолчанию ElasticSearch не поставляется с аутентификацией, но вам, вероятно, следует использовать брандмауэр для ограничения доступа к ElasticSearch с общедоступных IP-адресов. Или, возможно, лучший способ — привязать ElasticSearch к внутреннему IP и сделать его доступным только через локальную сеть.

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