Перейти к основному содержимому

Руководство по Solr в Java с Apache SolrJ

· 4 мин. чтения

1. Обзор

Apache Solr — это поисковая платформа с открытым исходным кодом, построенная на основе Lucene. Apache SolrJ — это клиент для Solr на основе Java, который предоставляет интерфейсы для основных функций поиска, таких как индексирование, запросы и удаление документов.

В этой статье мы собираемся изучить , как взаимодействовать с сервером Apache Solr с помощью SolrJ .

2. Настройка

Чтобы установить сервер Solr на свой компьютер, обратитесь к Solr QuickStart Guide .

Процесс установки прост — просто скачайте пакет zip/tar, извлеките содержимое и запустите сервер из командной строки. Для этой статьи мы создадим сервер Solr с ядром под названием «bigboxstore»:

bin/solr start
bin/solr create -c 'bigboxstore'

По умолчанию Solr прослушивает порт 8983 для входящих HTTP-запросов. Вы можете убедиться, что он успешно запущен, открыв URL-адрес http://localhost:8983/solr/#/bigboxstore в браузере и просмотрев панель инструментов Solr.

3. Конфигурация Maven

Теперь, когда наш сервер Solr запущен и работает, давайте сразу перейдем к Java-клиенту SolrJ. Чтобы использовать SolrJ в вашем проекте, вам потребуется объявить следующую зависимость Maven в вашем файле pom.xml :

<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>6.4.0</version>
</dependency>

Вы всегда можете найти последнюю версию, размещенную на Maven Central .

4. Java-API Apache SolrJ

Давайте запустим клиент SolrJ, подключившись к нашему серверу Solr:

String urlString = "http://localhost:8983/solr/bigboxstore";
HttpSolrClient solr = new HttpSolrClient.Builder(urlString).build();
solr.setParser(new XMLResponseParser());

Примечание. SolrJ использует двоичный формат, а не XML , в качестве формата ответа по умолчанию. Для совместимости с Solr необходимо явно вызывать setParser() для XML, как показано выше. Подробнее об этом можно узнать здесь .

4.1. Индексирование документов

Давайте определим данные для индексации с помощью SolrInputDocument и добавим их в наш индекс с помощью метода add() :

SolrInputDocument document = new SolrInputDocument();
document.addField("id", "123456");
document.addField("name", "Kenmore Dishwasher");
document.addField("price", "599.99");
solr.add(document);
solr.commit();

Примечание. Любое действие, которое изменяет базу данных Solr, требует, чтобы за этим действием следовал commit() .

4.2. Индексирование с помощью бинов

Вы также можете индексировать документы Solr, используя bean-компоненты . Давайте определим ProductBean, свойства которого аннотированы @Field :

public class ProductBean {

String id;
String name;
String price;

@Field("id")
protected void setId(String id) {
this.id = id;
}

@Field("name")
protected void setName(String name) {
this.name = name;
}

@Field("price")
protected void setPrice(String price) {
this.price = price;
}

// getters and constructor omitted for space
}

Затем давайте добавим bean-компонент в наш индекс:

solrClient.addBean( new ProductBean("888", "Apple iPhone 6s", "299.99") );
solrClient.commit();

4.3. Запрос индексированных документов по полю и идентификатору

Давайте проверим, добавлен ли наш документ, используя SolrQuery для запроса нашего сервера Solr.

QueryResponse от сервера будет содержать список объектов SolrDocument , соответствующих любому запросу с форматом field:value . В этом примере мы запрашиваем по цене:

SolrQuery query = new SolrQuery();
query.set("q", "price:599.99");
QueryResponse response = solr.query(query);

SolrDocumentList docList = response.getResults();
assertEquals(docList.getNumFound(), 1);

for (SolrDocument doc : docList) {
assertEquals((String) doc.getFieldValue("id"), "123456");
assertEquals((Double) doc.getFieldValue("price"), (Double) 599.99);
}

Более простой вариант — запросить по идентификатору с помощью getById() . который вернет только один документ, если будет найдено совпадение:

SolrDocument doc = solr.getById("123456");
assertEquals((String) doc.getFieldValue("name"), "Kenmore Dishwasher");
assertEquals((Double) doc.getFieldValue("price"), (Double) 599.99);

4.4. Удаление документов

Когда мы хотим удалить документ из индекса, мы можем использовать deleteById() и убедиться, что он был удален:

solr.deleteById("123456");
solr.commit();
SolrQuery query = new SolrQuery();
query.set("q", "id:123456");
QueryResponse response = solr.query(query);
SolrDocumentList docList = response.getResults();
assertEquals(docList.getNumFound(), 0);

У нас также есть возможность deleteByQuery() , поэтому давайте попробуем удалить любой документ с определенным именем:

solr.deleteByQuery("name:Kenmore Dishwasher");
solr.commit();
SolrQuery query = new SolrQuery();
query.set("q", "id:123456");
QueryResponse response = solr.query(query);
SolrDocumentList docList = response.getResults();
assertEquals(docList.getNumFound(), 0);

5. Вывод

В этой быстрой статье мы увидели, как использовать SolrJ Java API для выполнения некоторых распространенных взаимодействий с механизмом полнотекстового поиска Apache Solr.

Вы можете ознакомиться с примерами, приведенными в этой статье , на GitHub .