Установка Solr в Unix/Linux
Solr (произносится «солар») — ПО для полнотекстового поиска. Данная утилита имеет открытый исходный код на JAVA, и имеет Apache Lucene.
Основные функции Solr:
- Полнотекстовый поиск,
- Подсветка результатов,
- Распределенная индексация,
- Балансировка нагрузки,
- Фасетный поиск,
- Динамическая кластеризация,
- Интеграция с базами данных,
- Обработка документов со сложным форматом (например, Word, PDF),
- Автоматическое восстановление после отказа и восстановление данных,
- Имеет централизованное управление конфигурацией.
Т.к в солре есть репликация и распределенный поиск, данная тулза отлично маштабируется.
Так как в Solr есть возможность распределенного поиска и репликации, Solr хорошо масштабируем. По состоянию на май 2016 года Solr является вторым по популярности поисковым движком. У Solr есть HTTP/XML и JSON API, что делает возможным использовать Solr из всех популярных языков программирования. Также Solr можно очень гибко настраивать и подключать к нему внешние модули.
Установка Solr в CentOS/Fedora/RedHat
Сейчас я, выполню установку и настройку базовую конфигурацию Apache Solr на CentOS 7.
Первое что необходимо сделать перед установкой солара — установить JAVA. Я описывал процесс установки в своих статьях:
Установка JAVA (JDK) на CentOS/RHEL/Fedora
Узнать размер Java Heap Memory Size
Установка переменных JAVA_HOME / PATH в Linux
И так, смотрим какая версия джавы имеется на ОС:
# java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
Сейчас необходимо скачать сам solr, по этому — выполняем команду:
# cd /usr/local/src && wget http://apache.org/dist/lucene/solr/7.1.0/solr-7.1.0.tgz
PS: На момент написания статьи, используеться самая новая версия ПО.
Выполняем расспаковку:
$ tar xfvz solr-*.tgz
Смотрим что имеется:
[root@centos7 src]# ll total 148908 drwxr-xr-x. 9 root root 201 Nov 9 23:33 solr-7.1.0 -rw-r--r--. 1 root root 152481397 Oct 13 22:21 solr-7.1.0.tgz [root@centos7 src]#
И, собственно — запускаем установку:
# cd solr-7.1.0 && bash bin/install_solr_service.sh --strip-components=2 ../solr-7.1.0.tgz
Вывод:
id: solr: no such user Creating new user: solr Extracting ../solr-7.1.0.tgz to /opt Installing symlink /opt/solr -> /opt/solr-7.1.0 ... Installing /etc/init.d/solr script ... Installing /etc/default/solr.in.sh ... Service solr installed. Customize Solr startup configuration in /etc/default/solr.in.sh Waiting up to 180 seconds to see Solr running on port 8983 [\] Started Solr server on port 8983 (pid=118389). Happy searching! Found 1 Solr nodes: Solr process 118389 running on port 8983 { "solr_home":"/var/solr/data", "version":"7.1.0 84c90ad2c0218156c840e19a64d72b8a38550659 - ubuntu - 2017-10-13 16:15:59", "startTime":"2017-11-09T21:37:04.167Z", "uptime":"0 days, 0 hours, 0 minutes, 7 seconds", "memory":"40.3 MB (%8.2) of 490.7 MB"}
Проверим, запустился ли сервер:
# service solr status Found 1 Solr nodes: Solr process 118389 running on port 8983 { "solr_home":"/var/solr/data", "version":"7.1.0 84c90ad2c0218156c840e19a64d72b8a38550659 - ubuntu - 2017-10-13 16:15:59", "startTime":"2017-11-09T21:37:04.167Z", "uptime":"0 days, 0 hours, 2 minutes, 30 seconds", "memory":"23.7 MB (%4.8) of 490.7 MB"}
Для остановки используем:
# service solr stop
Для запуска, можно использовать:
# service solr start
Или, чтобы выполнить перезапуск, выполните:
# service solr restart
Добавим порт в Firewall
По умолчанию (я ничего не менял), солар использует 8983-й порт и его нужно добавить в межсетевой интерфейс. Т.к я использую CentOS 7, то данное действие будет выглядеть следующим образом:
# firewall-cmd --zone=public --add-port=8983/tcp --permanent # firewall-cmd --reload
PS: Если имеется CentOS 5/6 — выполните:
# iptables -A INPUT -p tcp -s localhost --dport 8983 -j ACCEPT # iptables -A INPUT -p tcp --dport 8983 -j DROP # service iptables save
Проыерям что соединения идут:
# netstat -natpl|grep 8983 tcp 0 0 192.168.13.211:43532 192.168.13.211:8983 ESTABLISHED 118943/kdeinit4: ki tcp 0 0 192.168.13.211:43524 192.168.13.211:8983 ESTABLISHED 118939/kdeinit4: ki tcp 0 0 192.168.13.211:43528 192.168.13.211:8983 ESTABLISHED 118941/kdeinit4: ki tcp 0 0 192.168.13.211:43530 192.168.13.211:8983 ESTABLISHED 118942/kdeinit4: ki tcp 0 0 192.168.13.211:43526 192.168.13.211:8983 ESTABLISHED 118940/kdeinit4: ki tcp6 0 0 :::8983 :::* LISTEN 118389/java tcp6 0 0 192.168.13.211:8983 192.168.13.211:43530 ESTABLISHED 118389/java tcp6 0 0 192.168.13.211:8983 192.168.13.211:43532 ESTABLISHED 118389/java tcp6 0 0 192.168.13.211:8983 192.168.13.211:43526 ESTABLISHED 118389/java tcp6 0 0 192.168.13.211:8983 192.168.13.211:43528 ESTABLISHED 118389/java tcp6 0 0 192.168.13.211:8983 192.168.13.211:43524 ESTABLISHED 118389/java
Как видно с вывода — у меня все отлично.
Добавим службу в автозагрузку:
# systemctl enable solr.service
PS: Если имеется CentOS 5/6 — выполните:
# chkconfig --add solr # chkconfig | grep solr
Настройка — завершена.
Установка Solr в Debian/Ubuntu
Первое что необходимо сделать перед установкой солара — установить JAVA. Я описывал процесс установки в своих статьях:
Узнать размер Java Heap Memory Size
Установка переменных JAVA_HOME / PATH в Linux
Установка Java на Debian/Ubuntu/Mint
Установка JAVA 9 (JDK9) на Debian/Ubuntu/LinuxMint
И так, смотрим какая версия джавы имеется на ОС:
# java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
Сейчас необходимо скачать сам solr, по этому — выполняем команду:
# cd /usr/local/src && wget http://apache.org/dist/lucene/solr/7.1.0/solr-7.1.0.tgz
PS: На момент написания статьи, используеться самая новая версия ПО.
Выполняем расспаковку:
$ tar xfvz solr-*.tgz
Смотрим что имеется:
[root@Debian8 src]# ll total 148908 drwxr-xr-x. 9 root root 201 Nov 9 23:33 solr-7.1.0 -rw-r--r--. 1 root root 152481397 Oct 13 22:21 solr-7.1.0.tgz [root@Debian8 src]#
И, собственно — запускаем установку:
# cd solr-7.1.0 && bash bin/install_solr_service.sh --strip-components=2 ../solr-7.1.0.tgz
Проверим, запустился ли сервер:
# service solr status
Для остановки используем:
# service solr stop
Для запуска, можно использовать:
# service solr start
Или, чтобы выполнить перезапуск, выполните:
# service solr restart
Добавим порт в Firewall
По умолчанию (я ничего не менял), солар использует 8983-й порт и его нужно добавить в межсетевой интерфейс. Т.к я использую Debian 8 (такие же действия и на новых версиях Ubuntu), то данное действие будет выглядеть следующим образом:
# firewall-cmd --zone=public --add-port=8983/tcp --permanent # firewall-cmd --reload
PS: Если имеется более ранние версии ОС — выполните:
# iptables -A INPUT -p tcp -s localhost --dport 8983 -j ACCEPT # iptables -A INPUT -p tcp --dport 8983 -j DROP # service iptables save
Проыерям что соединения идут:
# netstat -natpl|grep 8983
Как видно с вывода — у меня все отлично.
Добавим службу в автозагрузку:
# systemctl enable solr.service
PS: Если имеется CentOS 5/6 — выполните:
# chkconfig --add solr # chkconfig | grep solr
Настройка — завершена.
Установка Solr в Mac OS X
Ставим brew для начала — Установка brew в Mac OS X и потом выполняем поиск пакета:
$ brew search solr
У меня вывод следующий:
==> Searching local taps... homebrew/php/php53-solr homebrew/php/php54-solr homebrew/php/php55-solr homebrew/php/php56-solr homebrew/php/php70-solr homebrew/php/php71-solr solr solr@5.5 ==> Searching taps on GitHub... ==> Searching blacklisted, migrated and deleted formulae...
Чтобы поставить пакет, используем:
$ brew install solr
И осталось настроить….
Настройка Solr в Unix/Linux
И так, установку выполнили и solr сервер работает. Сейчас я создам 1-й мой core (имя которго — test_solr_core):
# su -c "/opt/solr/bin/solr create -c test_solr_core -n solrconfig.xml" -s /bin/sh solr Created new core 'test_solr_core'
Давайте попробуем использовать его! Открываем ссылку:
http://192.168.13.211:8983
Где:
- 192.168.13.211 — мой локальный IP. Можете использовать домен.
- 8983 — Порт на котором висит соляр.
Получаем что-то типа:
Так же, можно передать Solr дополнительные параметры JVM, например:
# su -c '/opt/solr/bin/solr start -a "-Xdebug -Xrunjdwp:transport=dt_socket, server=y,suspend=n,address=1044"' -s /bin/sh solr
Запустите Solr с заданным значением MAXHEAP min (-Xms) и max (-Xmx) для JVM:
# su -c '/opt/solr/bin/solr start -m 1g' -s /bin/sh solr
Можно передать порт:
# su -c '/opt/solr/bin/solr start -p 8655' -s /bin/sh solr
Чтобы проверить все ли впорядке (правильно ли установился solr, правильные ли имеет права и т.д и т.п) используйте:
# su -c '/opt/solr/bin/solr assert --exists /opt/solr' -s /bin/sh solr
Можно запустить хелз_чек и проверить что и как работает, например:
# su -c '/opt/solr/bin/solr healthcheck -c gettingstarted' -s /bin/sh solr
Получим вывод:
{ "collection":"gettingstarted", "status":"healthy", "numDocs":0, "numShards":2, "shards":[ { "shard":"shard1", "status":"healthy", "replicas":[ { "name":"core_node2", "url":"http://192.168.13.211:7574/solr/gettingstarted_shard1_replica_n1/", "numDocs":0, "status":"active", "uptime":"0 days, 0 hours, 1 minutes, 40 seconds", "memory":"100.4 MB (%20.5) of 490.7 MB"}, { "name":"core_node4", "url":"http://192.168.13.211:8983/solr/gettingstarted_shard1_replica_n3/", "numDocs":0, "status":"active", "uptime":"0 days, 0 hours, 1 minutes, 45 seconds", "memory":"108.9 MB (%22.2) of 490.7 MB", "leader":true}]}, { "shard":"shard2", "status":"healthy", "replicas":[ { "name":"core_node6", "url":"http://192.168.13.211:7574/solr/gettingstarted_shard2_replica_n5/", "numDocs":0, "status":"active", "uptime":"0 days, 0 hours, 1 minutes, 40 seconds", "memory":"100.9 MB (%20.6) of 490.7 MB"}, { "name":"core_node8", "url":"http://192.168.13.211:8983/solr/gettingstarted_shard2_replica_n7/", "numDocs":0, "status":"active", "uptime":"0 days, 0 hours, 1 minutes, 45 seconds", "memory":"109 MB (%22.2) of 490.7 MB", "leader":true}]}]}
Скопируем конфиг (сделаем бэкап файла):
# cp /opt/solr/server/etc/jetty.xml{,_BK}
Открываем файл:
# vim /opt/solr/server/etc/jetty.xml
Находим строку:
<New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
И заменяем на:
<!-- <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/> --> <!-- here begins ip securing --> <New class="org.eclipse.jetty.server.handler.IPAccessHandler"> <Call name="addWhite"> <!-- list of args with ip-addresses --> <Arg>127.0.0.1</Arg> </Call> <Call name="addWhite"> <!-- list of args with ip-addresses --> <Arg>192.168.13.211</Arg> </Call> <Call name="addWhite"> <!-- list of args with ip-addresses --> <Arg>0.0.0.0/8</Arg> </Call> <Set name="handler"> <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/> </Set> </New> <!-- end of securing -->
И перезапускаем соляр:
# service solr restart
PS: Не забываем добавить правило в SELinux, ну или выключите его вообще, вот пример — отключить SELinux на CentOS
Только для указанных IP адресов, будет доступен соляр, а для всех остальных покажет:
HTTP ERROR: 403 Problem accessing /solr/. Reason: Forbidden
Запуск Solr в режиме SolrCloud
Чтобы запустить solr в режиме SolrCloud, используем следующую команду:
# /opt/solr/bin/solr -e cloud
Если не получиться запустить, всегда можно использовать «-force» ключ:
# /opt/solr/bin/solr start -e cloud -force
PS: Запуст соляра от рута — не желателен, по этому, выполняем:
# su -c "/opt/solr/bin/solr start -e cloud -force" -s /bin/sh solr
Пример моей тестовой конфигурации:
# su -c "/opt/solr/bin/solr start -e cloud -h 192.168.13.211" -s /bin/sh solr Welcome to the SolrCloud example! This interactive session will help you launch a SolrCloud cluster on your local workstation. To begin, how many Solr nodes would you like to run in your local cluster? (specify 1-4 nodes) [2]: Ok, let's start up 2 Solr nodes for your example SolrCloud cluster. Please enter the port for node1 [8983]: Please enter the port for node2 [7574]: Solr home directory /opt/solr/example/cloud/node1/solr already exists. /opt/solr/example/cloud/node2 already exists. Starting up Solr on port 8983 using command: "/opt/solr/bin/solr" start -cloud -p 8983 -s "/opt/solr/example/cloud/node1/solr" -h 192.168.13.211 Waiting up to 180 seconds to see Solr running on port 8983 [\] Started Solr server on port 8983 (pid=19345). Happy searching! Starting up Solr on port 7574 using command: "/opt/solr/bin/solr" start -cloud -p 7574 -s "/opt/solr/example/cloud/node2/solr" -h 192.168.13.211 -z localhost:9983 /opt/solr/bin/solr: line 2017: /var/solr/solr-7574.pid: Permission denied Waiting up to 180 seconds to see Solr running on port 7574 [\] Started Solr server on port 7574 (pid=19547). Happy searching! INFO - 2017-11-20 22:38:49.070; org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; Cluster at localhost:9983 ready Now let's create a new collection for indexing documents in your 2-node cluster. Please provide a name for your new collection: [gettingstarted] techproducts How many shards would you like to split techproducts into? [2] How many replicas per shard would you like to create? [2] Please choose a configuration for the techproducts collection, available options are: _default or sample_techproducts_configs [_default] sample_techproducts_configs Re-using existing configuration directory techproducts Created collection 'techproducts' with 2 shard(s), 2 replica(s) with config-set 'techproducts' Enabling auto soft-commits with maxTime 3 secs using the Config API POSTing request to Config API: http://192.168.13.211:8983/solr/techproducts/config {"set-property":{"updateHandler.autoSoftCommit.maxTime":"3000"}} Successfully set-property updateHandler.autoSoftCommit.maxTime to 3000 SolrCloud example running, please visit: http://192.168.13.211:8983/solr #
Данный пример взят из официальной документации. Идем дальше…
Запускаем индекс techproducts данных:
# /opt/solr/bin/post -c techproducts /opt/solr/example/exampledocs/* java -classpath /opt/solr/dist/solr-core-7.1.0.jar -Dauto=yes -Dc=techproducts -Ddata=files org.apache.solr.util.SimplePostTool /opt/solr/example/exampledocs/books.csv /opt/solr/example/exampledocs/books.json /opt/solr/example/exampledocs/gb18030-example.xml /opt/solr/example/exampledocs/hd.xml /opt/solr/example/exampledocs/ipod_other.xml /opt/solr/example/exampledocs/ipod_video.xml /opt/solr/example/exampledocs/manufacturers.xml /opt/solr/example/exampledocs/mem.xml /opt/solr/example/exampledocs/money.xml /opt/solr/example/exampledocs/monitor2.xml /opt/solr/example/exampledocs/monitor.xml /opt/solr/example/exampledocs/more_books.jsonl /opt/solr/example/exampledocs/mp500.xml /opt/solr/example/exampledocs/post.jar /opt/solr/example/exampledocs/sample.html /opt/solr/example/exampledocs/sd500.xml /opt/solr/example/exampledocs/solr-word.pdf /opt/solr/example/exampledocs/solr.xml /opt/solr/example/exampledocs/test_utf8.sh /opt/solr/example/exampledocs/utf8-example.xml /opt/solr/example/exampledocs/vidcard.xml SimplePostTool version 5.0.0 Posting files to [base] url http://localhost:8983/solr/techproducts/update... Entering auto mode. File endings considered are xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log POSTing file books.csv (text/csv) to [base] POSTing file books.json (application/json) to [base]/json/docs POSTing file gb18030-example.xml (application/xml) to [base] POSTing file hd.xml (application/xml) to [base] POSTing file ipod_other.xml (application/xml) to [base] POSTing file ipod_video.xml (application/xml) to [base] POSTing file manufacturers.xml (application/xml) to [base] POSTing file mem.xml (application/xml) to [base] POSTing file money.xml (application/xml) to [base] POSTing file monitor2.xml (application/xml) to [base] POSTing file monitor.xml (application/xml) to [base] POSTing file more_books.jsonl (application/json) to [base]/json/docs POSTing file mp500.xml (application/xml) to [base] POSTing file post.jar (application/octet-stream) to [base]/extract POSTing file sample.html (text/html) to [base]/extract POSTing file sd500.xml (application/xml) to [base] POSTing file solr-word.pdf (application/pdf) to [base]/extract POSTing file solr.xml (application/xml) to [base] POSTing file test_utf8.sh (application/octet-stream) to [base]/extract POSTing file utf8-example.xml (application/xml) to [base] POSTing file vidcard.xml (application/xml) to [base] 21 files indexed. COMMITting Solr index changes to http://localhost:8983/solr/techproducts/update... Time spent: 0:00:03.276 #
Чтобы найти что-то в поиске, используем:
http://localhost:8983/solr/#/techproducts/query
В моем случае:
http://192.168.13.211:8983/solr/#/techproducts/query
Но это выполнение в самом браузере. Солр поддерживает поиск и через консоль, для этого, выполняем:
$ curl "http://localhost:8983/solr/techproducts/select?indent=on&q=*:*" $ curl "http://192.168.13.211:8983/solr/techproducts/select?indent=on&q=*:*"
Все работает, идем дальше.
Давайте попробуем поискать что-то конкретное, например:
# curl "http://192.168.13.211:8983/solr/techproducts/select?q=foundation"
Или:
# curl "http://192.168.13.211:8983/solr/techproducts/select?q=foundation&fl=id"
Еще пример:
# curl "http://192.168.13.211:8983/solr/techproducts/select?q=cat:electronics"
Поиск по фразе, можно замутить вот так:
# curl "http://192.168.13.211:8983/solr/techproducts/select?q=\"CAS+latency\""
Для объединение поисков можно использовать:
# curl "http://192.168.13.211:8983/solr/techproducts/select?q=%2Belectronics%20%2Bmusic"
Если вы используете curl, вы должны закодировать символ +, поскольку он имеет зарезервированную цель в URL-адресах (кодируя символ пробела). Кодировка для + будет равна %2B.
ИЛИ:
# curl "http://192.168.13.211:8983/solr/techproducts/select?q=%2Belectronics+-music"
Иногда бывает так, что он не может получить нужные директории из-за того, что нехватает прав — исправить можно:
# chown -R solr:solr /opt/solr*
Чтобы удалить созданный пример, используем:
# su -c "/opt/solr/bin/solr delete -c techproducts" -s /bin/sh solr
Т.к это был тостовый пример, то я его удалил…. И создаю новую коллекцию:
# su -c "/opt/solr/bin/solr create -c My_new_collection -s 2 -rf 2" -s /bin/sh solr
Получаем вывод:
WARNING: Using _default configset. Data driven schema functionality is enabled by default, which is NOT RECOMMENDED for production use. To turn it off: curl http://localhost:7574/solr/My_new_collection/config -d '{"set-user-property": {"update.autoCreateFields":"false"}}' Created collection 'My_new_collection' with 2 shard(s), 2 replica(s) with config-set 'My_new_collection'
Давайте сейчас вольем в новую колекцию некоторые данные:
# curl -X POST -H 'Content-type:application/json' --data-binary '{"add-field": {"name":"name", "type":"text_general", "multiValued":false, "stored":true}}' http://192.168.13.211:8983/solr/My_new_collection/schema { "responseHeader":{ "status":0, "QTime":2152}}
Можно поиграться с кверями, но мы идем дальше…..
Перед тем как мы начнем индексирование, создаем поле «catchall» селдующим образом:
# curl -X POST -H 'Content-type:application/json' --data-binary '{"add-copy-field" : {"source":"*","dest":"_text_"}}' http://192.168.13.211:8983/solr/My_new_collection/schema
После чего, перейдем к индексированию (для JSON):
# /opt/solr/bin/post -c My_new_collection /opt/solr/example/films/films.json
PS: Делаем от юзера:
# su -c "/opt/solr/bin/post -c My_new_collection /opt/solr/example/films/films.json " -s /bin/sh solr java -classpath /opt/solr/dist/solr-core-7.1.0.jar -Dauto=yes -Dc=My_new_collection -Ddata=files org.apache.solr.util.SimplePostTool /opt/solr/example/films/films.json SimplePostTool version 5.0.0 Posting files to [base] url http://localhost:8983/solr/My_new_collection/update... Entering auto mode. File endings considered are xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log POSTing file films.json (application/json) to [base]/json/docs 1 files indexed. COMMITting Solr index changes to http://localhost:8983/solr/My_new_collection/update... Time spent: 0:00:02.317
После чего, перейдем к индексированию (для XML):
# /opt/solr/bin/post -c My_new_collection /opt/solr/example/films/films.xml
PS: Делаем от юзера:
# su -c "/opt/solr/bin/post -c My_new_collection /opt/solr/example/films/films.xml" -s /bin/sh solr java -classpath /opt/solr/dist/solr-core-7.1.0.jar -Dauto=yes -Dc=My_new_collection -Ddata=files org.apache.solr.util.SimplePostTool /opt/solr/example/films/films.xml SimplePostTool version 5.0.0 Posting files to [base] url http://localhost:8983/solr/My_new_collection/update... Entering auto mode. File endings considered are xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log POSTing file films.xml (application/xml) to [base] 1 files indexed. COMMITting Solr index changes to http://localhost:8983/solr/My_new_collection/update... Time spent: 0:00:00.977
Помимо предоставления результатов поиска, запрос Solr может возвращать количество документов, содержащих каждое уникальное значение во всем результирующем наборе. Например, выполним квери для работы с facet:
# curl "http://192.168.13.211:8983/solr/My_new_collection/select?q=*:*&rows=0&facet=true&facet.field=genre_str"
Еще одно:
# curl "http://192.168.13.211:8983/solr/My_new_collection/select?=&q=*:*&facet.field=genre_str&facet.mincount=200&facet=on&rows=0"
Для остановки всех нод что запустили, выполняем:
# su -c "/opt/solr/bin/solr stop -all" -s /bin/sh solr
Я на дополню данную статью при первой необходимости.
Вот и все, статья «Установка Solr в Unix/Linux» завершена.