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 .