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

Руководство по 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.