Руководство по Solr в Java с Apache SolrJ
1. обзор
Apache Solr - это поисковая платформа с открытым исходным кодом, построенная на основе Lucene. Apache SolrJ - это основанный на Java клиент для Solr, который предоставляет интерфейсы для основных функций поиска, таких как индексация, запросы и удаление документов.
В этой статье мы собираемся изучитьhow to interact with an Apache Solr server using 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 Dashboard.
3. Конфигурация Maven
Теперь, когда наш сервер Solr запущен и работает, давайте сразу перейдем к Java-клиенту SolrJ. Чтобы использовать SolrJ в вашем проекте, вам необходимо, чтобы в вашем файлеpom.xml была объявлена следующая зависимость Maven:
org.apache.solr
solr-solrj
6.4.0
Вы всегда можете найти последнюю версию, размещенную наMaven Central.
4. API Java для Apache SolrJ
Давайте запустим клиент SolrJ, подключившись к нашему серверу Solr:
String urlString = "http://localhost:8983/solr/bigboxstore";
HttpSolrClient solr = new HttpSolrClient.Builder(urlString).build();
solr.setParser(new XMLResponseParser());
Примечание.SolrJ uses a binary format, rather than XML в качестве формата ответа по умолчанию. Для совместимости с Solr необходимо явно вызыватьsetParser() в XML, как показано выше. Более подробную информацию можно найти вhere.
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. Индексирование с помощью Beans
You can also index Solr documents using beans. Давайте определим 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
}
Затем добавим компонент в наш индекс:
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);
}
Более простой вариант - запроситьId с помощью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. Заключение
В этой быстрой статье мы увидели, как использовать Java-API SolrJ для выполнения некоторых из общих взаимодействий с механизмом полнотекстового поиска Apache Solr.
Вы можете ознакомиться с примерами из этой статьиover on GitHub.