Image

Solr + MySQL

"Если бы губы Никанора Ивановича да приставить к носу Ивана Кузьмича, да взять сколь-нибудь развязанное, какая у Балтазара Балтазаровича, да, пожалуй, прибавить к этому еще дородности Ивана Павловича — я бы тогда тотчас же решилась. А теперь — поди подумай!"
Н. В. Гоголь, "Женитьба"
Замечательная штука -- искать инструкции по установке чего-нибудь эдакого в интернете. Часто приходится собирать информацию по кускам из двух-трёх описаний одного и того же. Вот и со связкой Solr + MySQL получилось тоже самое.
За основу были взяты два описания: "Using Solr / Lucene for full text search with MySQL DB"  и "Apache Solr MySQL Sample Data Config". Плюс к этому множество форумов и багрепортов, ибо и Solr, и MySQL -- штуки местами удивительные и непредсказуемые.
Свои нечеловеческие эксперименты в области full-text поиска я начал с создания базы данных и таблицы, которые и будут являться хранилищем требуемых данных:
mysql> CREATE DATABASE solrdb;
mysql> USE solrdb;
mysql> CREATE TABLE `jos_content` (
> `id` bigint(20) NOT NULL AUTO_INCREMENT,
> `state` tinyint(3) unsigned NOT NULL DEFAULT '0',
> `title` char(10) DEFAULT NULL,
> `introtext` text,
> `ftext` text,
> PRIMARY KEY (`id`)
> ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

mysql> INSERT INTO jos_content VALUES(null, 1, a', 'intro1', 'ft1');
mysql> INSERT INTO jos_content VALUES(null, 1, 'b', 'intro2', 'ft2');
mysql> INSERT INTO jos_content VALUES(null, 1, 'c', 'intro3', 'ft3');
 
Следующий пункт программы -- это добыча подходящего MySQL JDBC-драйвера. Драйвера с версией младше 5.1.7 не подходят, поскольку не умеют работать с UTF8, в случае их использования JDBC-драйвер сгенерирует исключение java.sql.SQLException с загадочным обоснованием вида: "Unknown initial character set index '192' received from server. Initial client character set can be forced via the 'characterEncoding' property.". Во избежание проблем берётся самый последний из предлагаемого списка драйверов.

После того как драйвер найден, его необходимо положить в правильное место. "Правильным местом" является каталог /lib контейнера сервлетов или web-сервера, а не одноимённый каталог в домашней директории Solr. В противном случае ищите в логах запись про отсутствующий драйвер.

Дальше действия выполняются почти, как указано в инструкциях.
1. Создаётся конфигурационный xml-файл для работы с базой данных, я назвал его dataimport.xml. Поскольку я развлекался с прилагаемым к Solr демо-приложением и, опять же, прилагаемом контейнером сервлетов Jetty, то файл я разместил в <SOLR_HOME>/example/solr/conf. Вот его содержимое:
<?xml version="1.0" encoding="UTF-8"?>
  <dataConfig>
    <dataSource type="JdbcDataSource"
      driver="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost/solrdb"
      user="root"
      password="11111111"/>

    <document name="doc">
        <entity name="jos_content" query="select * from jos_content WHERE state=1">
        <field column="id" name="id" />
        <field column="title" name="title" />
        <field column="introtext" name="introtext" />
        <field column="ftext" name="ftext" />
      </entity>
  </document>
</dataConfig>

2. В конфигурационный файл <SOLR_HOME>/example/solr/conf/solrconfig.xml добавляются настройки для выполнения импорта данных из базы:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
  <lst name="defaults">
    <str name="config">dataimport.xml</str>
  </lst>
</requestHandler>

3. В том же каталоге правлю schema.xml, меняю(добавляю) текущее содержимое тэгов fields, uniqueKey и defaultSearchField:
<fields>
  <field name="id" type="string" indexed="true" stored="true" required="true"/>
  <field name="title" type="text" indexed="true" stored="true" required="true"/>
  <field name="introtext" type="text" indexed="true" stored="true" required="true"/>
  <field name="ftext" type="text" indexed="true" stored="true" required="true"/>
  <dynamicField name="*" type="ignored" />
</fields>

<uniqueKey>id</uniqueKey>

<defaultSearchField>ftext</defaultSearchField>

4. Перезапускаю Solr: java -jar start.jar

5. Проверяю состояние и импортирую данные.
http://localhost:8983/solr/dataimport
http://localhost:8983/solr/dataimport?command=delta-import

6. Выполняю запрос.
http://localhost:8983/solr/select/?q=id:1