Статьи

Использование идентификации языка документа в Solr 3.5

Одной из функциональных возможностей последней версии Solr ( 3.5 ) является возможность определения языка документа во время его индексации. В сегодняшней записи мы увидим, как Apache Solr работает вместе с Apache Tika для определения языка документов.

В начале

Следует помнить, что описанная функциональность была представлена ​​в Solr 3.5.

Предположения

Мы будем использовать два поля для определения языка документа:  заголовок  и  текст . Мы хотим сохранить информацию об обнаруженном языке в  поле lang .

Структура индекса

Структура нашего индекса, конечно, упрощена и содержит только поля, необходимые для теста. Таким образом, часть определения поля в  файле schema.xml выглядит следующим образом:

1	<field name="id" type="string" indexed="true" stored="true" required="true" />
2	<field name="title" type="text_ws" indexed="true" stored="true" />
3	<field name="body" type="text_ws" indexed="true" stored="true" />
4	<field name="lang" type="string" indexed="true" stored="true" />

Все поля помечены как  сохраненные = «истина»  для простоты.

Обновление конфигурации процессора запросов

Чтобы использовать функцию идентификации языка, нам нужно настроить процессор запросов на обновление Solr. Мы будем использовать тот, который использует Apache Tika (есть вторая реализация, основанная на  http://code.google.com/p/language-detection/ ). Для настройки процесса мы добавляем в  файл solrconfig.xml следующее :

01	<updateRequestProcessorChain name="langid">
02	  <processor name="langid" class="org.apache.solr.update.processor.TikaLanguageIdentifierUpdateProcessorFactory">
03	    <lst name="defaults">
04	      <str name="langid.fl">title,body</str>
05	      <str name="langid.langField">lang</str>
06	    </lst>
07	  </processor>
08	  <processor class="solr.LogUpdateProcessorFactory" />
09	  <processor class="solr.RunUpdateProcessorFactory" />
10	</updateRequestProcessorChain>

Другие параметры TikaLanguageIdentifierUpdateProcessorFactory  описаны на вики-страницах Apache Solr, доступных по следующему URL-адресу:  http://wiki.apache.org/solr/LanguageDetection .

Дополнительные библиотеки

Чтобы процессор запросов на обновление работал, нам нужны дополнительные библиотеки. Из  каталога dist из дистрибутива Apache Solr мы копируем  apache-solr-langid-3.5.0.jar  в  tikaDir  (например), который мы создаем на том же уровне, что и  каталог webapps . Затем мы добавляем следующую строку в  файл solrconfig.xml :

1 <lib dir = «../ tikaLib /» regex = «apache-solr-langid-d. *. jar» />

Следующая библиотека, которая нам понадобится, — это банка Tika со всеми вкусностями (tika -app-1.0.jar ), которую мы можем скачать по следующему URL-адресу: http://tika.apache.org/ . Мы помещаем его в тот же  каталог tikaDir и затем добавляем следующую запись в  файл solrconfig.xml :

1 <lib dir = «../ tikaLib /» regex = «tika-app-1.0.jar» />

Тестовые документы

Для целей тестирования я решил подготовить три документа. Первый был на английском, второй на польском и третий на немецком. Их содержание было загружено из Википедии. Они выглядят следующим образом:

tika_en.xml

1	<add>
2	<doc>
3	  <field name="id">1</field>
4	  <field name="title">Water</field>
5	  <field name="body">Water is a chemical substance with the chemical formula H2O. A water molecule contains one oxygen and two hydrogen atoms connected by covalent bonds. Water is a liquid at ambient conditions, but it often co-exists on Earth with its solid state, ice, and gaseous state (water vapor or steam). Water also exists in a liquid crystal state near hydrophilic surfaces.[1][2] Under nomenclature used to name chemical compounds, Dihydrogen monoxide is the scientific name for water, though it is almost never used.</field>
6	</doc>
7	</add>

tika_pl.xml

1	<add>
2	<doc>
3	  <field name="id">2</field>
4	  <field name="title">Woda</field>
5	  <field name="body">Woda (tlenek wodoru; nazwa systematyczna IUPAC: oksydan) – związek chemiczny o wzorze H2O, występujący w warunkach standardowych w stanie ciekłym. W stanie gazowym wodę określa się mianem pary wodnej, a w stałym stanie skupienia – lodem. Słowo woda jako nazwa związku chemicznego może się odnosić do każdego stanu skupienia.</field>
6	</doc>
7	</add>

tika_de.xml

1	<add>
2	<doc>
3	  <field name="id">3</field>
4	  <field name="title">Wasser</field>
5	  <field name="body">Wasser (H2O) ist eine chemische Verbindung aus den Elementen Sauerstoff (O) und Wasserstoff (H). Wasser ist die einzige chemische Verbindung auf der Erde, die in der Natur in allen drei Aggregatzuständen vorkommt. Die Bezeichnung Wasser wird dabei besonders für den flüssigen Aggregatzustand verwendet. Im festen (gefrorenen) Zustand spricht man von Eis, im gasförmigen Zustand von Wasserdampf.</field>
6	</doc>
7	</add>

Больше тестирования

Для индексации данных я использовал следующие команды оболочки:

1	curl 'http://localhost:8983/solr/update?update.chain=langid' --data-binary @tika_pl.xml -H 'Content-type:application/xml'
2	curl 'http://localhost:8983/solr/update?update.chain=langid' --data-binary @tika_en.xml -H 'Content-type:application/xml'
3	curl 'http://localhost:8983/solr/update?update.chain=langid' --data-binary @tika_de.xml -H 'Content-type:application/xml'
4	curl 'http://localhost:8983/solr/update?update.chain=langid' --data-binary '<commit/>' -H 'Content-type:application/xml'

It is worth to notice the additional update.chain=langid parameter added to the request. This parameter is used to tell Solr which update processor to use when indexing the data. In the example we told Solr that it should use our defined update processor.

Indexed data

So let’s have a look at the indexed data. We will do that by running the following query: q=*:*&indent=true.

01	<?xml version="1.0" encoding="UTF-8"?>
02	<response>
03	<lst name="responseHeader">
04	  <int name="status">0</int>
05	  <int name="QTime">0</int>
06	  <lst name="params">
07	    <str name="indent">true</str>
08	    <str name="q">*:*</str>
09	  </lst>
10	</lst>
11	<result name="response" numFound="3" start="0">
12	  <doc>
13	    <str name="body">Woda (tlenek wodoru; nazwa systematyczna IUPAC: oksydan) – związek chemiczny o wzorze H2O, występujący w warunkach standardowych w stanie ciekłym. W stanie gazowym wodę określa się mianem pary wodnej, a w stałym stanie skupienia – lodem. Słowo woda jako nazwa związku chemicznego może się odnosić do każdego stanu skupienia.</str>
14	    <str name="id">2</str>
15	    <str name="lang">pl</str>
16	    <str name="title">Woda</str>
17	  </doc>
18	  <doc>
19	    <str name="body">Water is a chemical substance with the chemical formula H2O. A water molecule contains one oxygen and two hydrogen atoms connected by covalent bonds. Water is a liquid at ambient conditions, but it often co-exists on Earth with its solid state, ice, and gaseous state (water vapor or steam). Water also exists in a liquid crystal state near hydrophilic surfaces.[1][2] Under nomenclature used to name chemical compounds, Dihydrogen monoxide is the scientific name for water, though it is almost never used.</str>
20	    <str name="id">1</str>
21	    <str name="lang">en</str>
22	    <str name="title">Water</str>
23	  </doc>
24	  <doc>
25	    <str name="body">Wasser (H2O) ist eine chemische Verbindung aus den Elementen Sauerstoff (O) und Wasserstoff (H). Wasser ist die einzige chemische Verbindung auf der Erde, die in der Natur in allen drei Aggregatzuständen vorkommt. Die Bezeichnung Wasser wird dabei besonders für den flüssigen Aggregatzustand verwendet. Im festen (gefrorenen) Zustand spricht man von Eis, im gasförmigen Zustand von Wasserdampf.</str>
26	    <str name="id">3</str>
27	    <str name="lang">de</str>
28	    <str name="title">Wasser</str>
29	  </doc>
30	</result>
31	</response>

As you can see, Solr with the use of Tika, was able to identify the languages of the indexed documents. Of course, let’s not be too optimistic, because mistakes happen, especially when dealing with multi-language documents, but that’s understandable.

To sum up

You should remember, that the language identification feature is not perfect and can make mistakes. Also remember, that the longer the documents, the better the functionality will work. Of course the problem is that we can’t use the language identification during query time, but it’s not only problem with Solr and Tika. You can deal with that by identifying your user, it’s web browser or place he is located in.