Начало работы с Солром

задняя часть сервер Solr Lucene

Введение в солр

что такое соль

Solr — это лучший проект Apache с открытым исходным кодом, это сервер полнотекстового поиска, основанный на lucene, разработанный с использованием java.

Solr предоставляет больше операторов запросов, чем lucene, он расширяемый и настраиваемый, а также оптимизирует производительность lucene.

Как Solr реализует полнотекстовый поиск?

Процесс индексирования: клиент Solr (браузер, программа Java) может отправить запрос POST на сервер Solr.Содержимое запроса представляет собой XML-документ, содержащий поле и другую информацию.С помощью этого документа Solr поддерживает индекс (добавление, удаление и изменение )

Процесс поиска: клиент solr (браузер, программа Java) может отправить запрос GET на сервер solr, и сервер solr вернет XML-документ.

Solr также не имеет возможности рендеринга представлений.

Разница между solr и lucene

Lucene — это инструментарий полнотекстовой поисковой системы, представляющий собой пакет jar, который нельзя запускать независимо для предоставления внешних служб.

Solr — это сервер полнотекстового поиска, который может работать только в контейнере сервлетов и может предоставлять функции поиска и индексирования для внешнего мира. Solr быстрее и удобнее lucene в разработке функций полнотекстового поиска.

конфигурация установки Solr

скачать

Версии solr и lucene обновляются синхронно, последняя версия 5.2.1

Адрес загрузки: http://archive.apache.org/dist/lucene/solr/

окрестности

jdk: 1.7 и выше решение: 4.10.3 MySQL: 5x веб-сервер: tomcat7

скрипт инициализации базы данных

конфигурация установки Solr

  • установить кота
  • Скопируйте solr.war из каталога solr-4.10.3\example\webapps в каталог tomcat webapps.
  • Разархивируйте военный пакет, после распаковки удалите военный пакет
  • Добавьте пакет обновления расширения solr. Скопируйте банку из каталога solr-4.10.3\example\lib\ext в каталог tomcat solr WEB-INF lib.
  • Добавьте log4j.properties. Скопируйте log4j.properties из каталога solr-4.10.3\example\resources в apache-tomcat-7.0.57\webapps\solr\WEB-INF\classes , если каталог не существует, создайте его.
  • Укажите каталог solrhome в web.xml

установка solcore

солкор и солрхоум

Solrhome — это домашний каталог, в котором работает служба solr.Каталог solrhome содержит несколько каталогов solrcore, а каталог solrcore содержит файлы конфигурации и файлы данных, необходимые для запуска экземпляра solr.

Каждый solrcore может независимо предоставлять внешние службы поиска и индексации. Нет никакой связи между несколькими solrcores.

Структура каталогов solrcore и solrhome

solrhome: solr-4.10.3\пример\solr solrcore: solr-4.10.3\example\solr\collection1 содержит файлы конфигурации, информацию журнала индексного файла

установка солкор

Чтобы установить solrcore, сначала необходимо установить solrhome. Скопируйте файлы из solrhome выше в solrhome, указанный в web.xml.

Солкор конфигурация

Настройте файл конфигурации solrconfig.xml в каталоге conf solrcore, чтобы настроить текущую информацию solrcore.

В этом файле в основном настраиваются три тега: тег lib, тег datadir и тег requestHandler.

тег библиотеки

solrcore необходимо добавить пакет зависимостей расширения и указать адрес пакета зависимостей через тег lib

solr.install.dir представляет каталог установки solrcore.

Скопируйте каталоги contrib и dis в каталог примера в

Изменить тег библиотеки

тег datadir

У каждого solrcore есть собственный каталог индексных файлов, который по умолчанию находится в data в каталоге solrcore.

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

тег requestHandler

requestHandler Обработчик запросов, который определяет способ доступа к индексированию и поиску. Индексы можно добавлять, изменять и удалять с помощью параметра /update для обслуживания индексов.

Отправьте данные xml и json для завершения обслуживания индекса.

Поиск в индексе через /select

Установите параметры поиска, чтобы завершить поиск.Вы также можете установить некоторые значения по умолчанию для параметров поиска, как показано ниже:

<requestHandler name="/select" class="solr.SearchHandler">
    <!-- 设置默认的参数值,可以在请求地址中修改这些参数-->
    <lst name="defaults">
        <str name="echoParams">explicit</str>
        <int name="rows">10</int><!--显示数量-->
        <str name="wt">json</str><!--显示格式-->
        <str name="df">text</str><!--默认搜索字段-->
    </lst>
</requestHandler>

сольный интерфейс

Dashboard

Панель мониторинга, на которой отображается такая информация, как время работы экземпляра Solr, версия, системные ресурсы и jvm. ,

Logging

Информация журнала запуска Solr

Cloud

Облако — это SolrCloud, облако (кластер) Solr, это меню отображается при работе в режиме Solr Cloud.

Core Admin

Интерфейс управления solrcore, куда вы можете добавлять экземпляры solrcore.

java properties

Информация об атрибутах solr в среде выполнения jvm.

Thread Dump

Отображает информацию об активных в данный момент потоках на сервере solr, а также может отслеживать информацию о запущенных потоках в стеке.

Core selector

Выберите solrcore для подробных операций следующим образом:

Analysis

Этот интерфейс позволяет тестировать производительность анализатора индекса и анализатора поиска. Примечание. В solr анализаторы привязаны к типам доменов.

dataimport

Процессоры импорта данных могут быть определены для импорта из реляционных баз данных в индексный репозиторий Solr. Конфигурация по умолчанию требует ручной настройки.

Document

Под /update подразумевается обновление индекса. Solr по умолчанию обновляет содержимое документа в соответствии с полем id (уникальное ограничение).Если поле id невозможно найти по значению id, будет выполнена операция добавления, а если найдено, обновление будет выполнено.

Через это меню вы можете создавать индексы, обновлять индексы, удалять индексы и т. д. Интерфейс выглядит следующим образом:

  • overwrite="true" : когда Solr индексирует документ, если он уже существует, он будет заменен документом в формате xml.
  • commitWithin="1000" : Solr отправляет документ каждые 1000 (1 секунду) миллисекунд при индексировании. Для удобства тестирования его также можно подать сразу в Документе, после добавления ""

Query

Чтобы выполнить индекс поиска через /select, вы должны указать условие запроса "q" для поиска.

Множественная конфигурация solrcore

Преимущества настройки нескольких solrcore: 1. При выполнении solrcloud необходимо настроить несколько solrcore. 2. Каждый solrcore независим и может независимо предоставлять внешние услуги. Различные бизнес-модули могут использовать разные ядра solrcore для предоставления услуг поиска и индексирования.

Добавить к

  • Шаг 1: Скопируйте каталог collection1 в solrhome в этот каталог и измените имя на collection2.
  • Измените core.properties в каталоге solrcore.
    Настроено так много solrcores.

Основное использование Solr

schema.xml

В файле schema.xml в основном настраивается некоторая информация о данных solrcore, включая определение Field и FieldType.В solr и Field, и FieldType необходимо определить перед использованием.

Field

Определить поле

Имя: имя указанного домена Тип: указывает тип поля. Индексировано: индексировать ли Хранится: хранить ли Требуется: Требуется ли multiValued: является ли оно многозначным.Например, в информации о продукте, если продукт имеет несколько изображений, а поле хранит несколько значений, вы должны установить для multiValued значение true.

dynamicField

динамический домен

Имя: указывает правила именования для динамических доменов.

uniqueKey

Укажите уникальный ключ

id

Идентификатор — это имя домена, которое было определено в теге Field, и для домена необходимо установить значение true.

В файле schema.xml должен быть один и только один уникальный ключ.

copyField

копировать домен

Источник: доменное имя исходного домена для копирования. Dest: доменное имя целевого домена.

Для целевого домена, на который указывает dest, для параметра multiValued должно быть установлено значение true.

FieldType

тип домена

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

Имя: указывает имя типа домена. Класс: указывает тип solr, соответствующий типу домена. Анализатор: укажите анализатор Тип: index, query, указать анализатор для поиска и индексации соответственно Токенизатор: укажите токенизатор Фильтр: укажите фильтр

Китайский токенизатор

Сегментация китайских слов с помощью ikanalyzer

  • Шаг 1: Скопируйте jar-пакет ikanalyzer в следующий каталог.

  • Шаг 2: Скопируйте файл конфигурации расширенного тезауруса ikanalyzer в каталог

  • Настроить тип поля

  • Настройте поле, которое использует сегментацию китайских слов

  • перезапустить кота

Настройка бизнес-полей

необходимость

Для индексации данных таблицы товаров в случае Jingdong необходимо определить соответствующее поле поля.

Конфигурация анализа

Поля, которые необходимо добавить в библиотеку индексов: pid, название, каталог, catalog_name, цена, описание, картинка

Тип поля: После анализа, поскольку китайский токенизатор был настроен с FieldType, текущий FieldType удовлетворил потребности и не нуждается в настройке.

Поле: Код: Поскольку pid является уникальным ключом в таблице products, а в файле solr shema.xml уже есть конфигурация уникального ключа id, нет необходимости переопределять поле pid.

название:

<!-- 商品名称 -->
<field name="product_name" type="text_ik" indexed="true" stored="true"/>

Каталог, имя_каталога:

<!-- 商品分类ID -->
<field name="product_catalog" type="string" indexed="true" stored="true"/> 
<!-- 商品分类名称 -->
<field name="product_catalog_name" type="string" indexed="true" stored="false"/>

Цена:

<!-- 商品价格 -->
<field name="product_price" type="float" indexed="true" stored="true"/>

Описание:

<!-- 商品描述 -->
<field name="product_description" type="text_ik" indexed="true" stored="false"/>

Рисунок:

<!-- 商品图片地址 -->
<field name="product_picture" type="string" indexed="false" stored="true"/> 
<!-- 目标域 -->
<field name="product_keywords" type="text_ik" indexed="true" stored="true" multiValued="true"/>

<!-- 将商品名称添加到目标域 -->
<copyField source="product_name" dest="product_keywords"/>

<!-- 将商品描述添加到目标域 -->
<copyField source="product_description" dest="product_keywords"/>

Dataimport

Этот подключаемый модуль может импортировать результат указанного оператора SQL из базы данных в индексную библиотеку Solr.

  • Шаг 1: Добавьте пакет jar Пакет jar для импорта данных (solr-4.10.3\dist\solr-dataimporthandler-extras-4.10.3.jar) скопировать в

    Измените файл solrconfig.xml и добавьте тег lib.<lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".*\.jar" />

    пакет драйвера базы данных mysql Скопируйте пакет драйвера mysql в:

    Измените файл solrconfig.xml и добавьте тег lib.<lib dir="${solr.install.dir:../..}/contrib/db/lib" regex=".*\.jar" />

  • Шаг 2. Настройте обработчик запросов. В solrconfig.xml добавьте requestHandler для импорта данных.

    <requestHandler name="/dataimport"     class="org.apache.solr.handler.dataimport.DataImportHandler">
          <lst name="defaults">
              <str name="config">data-config.xml</str>
          </lst>
    </requestHandler>
    
- 第三步:创建 data-config.xml
  在 solrconfig.xml 同级目录下,创建 data-config.xml
![](http://pbzzkhjh1.bkt.clouddn.com/1c648865-30cb-4dbe-9133-525692211bf4.jpg)
```xml
<dataConfig>
    <dataSource 
        type="JdbcDataSource"
        driver="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/taotao" 
        user="root"
        password="root"/>

    <document>
        <entity name="products" query="select pid,name,catalog,catalog_name,price,description,picture from products ">
            <field column="pid" name="id" />
            <field column="name" name="product_name" />
            <field column="catalog" name="product_catalog" />
            <field column="catalog_name" name="product_catalog_name" />
            <field column="price" name="product_price" />
            <field column="description" name="product_description" />
            <field column="picture" name="product_picture" />
        </entity>
    </document>
</dataConfig>
  • Шаг 4: Перезапустите кота

использование solrj

что такое солдж

solrj — это java-клиент сервера solr.

Подготовка окружающей среды

jdk ide tomcat solrj

Строительный проект

  • Зависимости и основные пакеты solrj

  • Пакет расширений для solrj

Обслуживание индекса выполняется с помощью solrj

Добавить/изменить индекс

В Solr уникальный ключ существует в библиотеке индексов, если идентификатор документа существует, выполняется операция модификации, а если он не существует, выполняется операция добавления.

    @Test
    public void insertAndUpdateIndex() throws Exception {
        // 创建HttpSolrServer
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");
        // 创建Document对象
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id", "c001");
        doc.addField("name", "solr test111");
        // 将Document对象添加到索引库
        server.add(doc);
        // 提交
        server.commit();
    }

падение индекса

удалить по указанному id
удалить по условию
@Test
    public void deleteIndex() throws Exception {
        // 创建HttpSolrServer
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");

        // 根据指定的ID删除索引
        // server.deleteById("c001");

        // 根据条件删除
        server.deleteByQuery("id:c001");

        // 删除全部(慎用)
        server.deleteByQuery("*:*");

        // 提交
        server.commit();
    }

индекс запроса

Простой запрос
    @Test
    public void search01() throws Exception {
        // 创建HttpSolrServer
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");
        // 创建SolrQuery对象
        SolrQuery query = new SolrQuery();
        // 输入查询条件
        query.setQuery("product_name:小黄人");
        // 执行查询并返回结果
        QueryResponse response = server.query(query);
        // 获取匹配的所有结果
        SolrDocumentList list = response.getResults();
        // 匹配结果总数
        long count = list.getNumFound();
        System.out.println("匹配结果总数:" + count);
        for (SolrDocument doc : list) {
            System.out.println(doc.get("id"));
            System.out.println(doc.get("product_name"));
            System.out.println(doc.get("product_catalog"));
            System.out.println(doc.get("product_price"));
            System.out.println(doc.get("product_picture"));
            System.out.println("=====================");
        }
    }
сложный запрос

Синтаксис запроса Solr

1.q - ключевое слово запроса, требуется, если запрос используется всеми*:*. Запрошенный q представляет собой строку

2.fq - (filter query) фильтровать запрос, эффект: в результатах сопоставления q-запроса он же и fq-сопоставление запроса, например: запрос fq представляет собой массив (несколько значений)

Фильтровать записи с ценами запросов от 1 до 20. Вы также можете использовать product_price:[1 TO 20] в условии запроса "q", как показано ниже:
Вы также можете использовать «*» для обозначения бесконечности, например: Выше 20: product_price: [20 TO] Ниже 20: product_price:[ TO 20]

3.sort - сортировка, формат: sort=+[+]… . Пример:

По убыванию цены

4.start - использование отображения страницы, начало записи индексов, начиная с 0

5.rows — укажите максимальное количество записей в возвращаемом результате и сотрудничайте с start для достижения пейджинга. В реальной разработке узнайте текущий номер страницы и номер, отображаемый на каждой странице, и, наконец, найдите начальный индекс.

6.fl - Укажите содержимое возвращаемых полей, разделенных запятыми или пробелами.

Показать изображение продукта, название продукта, цена продукта

7.df-указать поле поиска

Вы также можете указать поле поиска по умолчанию в файле conf/solrconfig.xml в каталоге SolrCore.После указания вы можете напрямую ввести ключевое слово в условие запроса «q».

8. wt - (тип записи) указывает выходной формат, который может быть xml, json, php, phps, а позже добавлен в solr 1.3, пожалуйста, сообщите нам, потому что он не включен по умолчанию.

9. Если выделен hl, установите выделенное Поле, установите префикс и суффикс формата.

код

    @Test
    public void search02() throws Exception {
        // 创建HttpSolrServer
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");
        // 创建SolrQuery对象
        SolrQuery query = new SolrQuery();

        // 输入查询条件
        query.setQuery("product_name:小黄人");
        // query.set("q", "product_name:小黄人");

        // 设置过滤条件
        // 如果设置多个过滤条件的话,需要使用query.addFilterQuery(fq)
        query.setFilterQueries("product_price:[1 TO 10]");

        // 设置排序
        query.setSort("product_price", ORDER.asc);
        // 设置分页信息(使用默认的)
        query.setStart(0);
        query.setRows(10);

        // 设置显示的Field的域集合
        query.setFields("id,product_name,product_catalog,product_price,product_picture");

        // 设置默认域
        query.set("df", "product_keywords");

        // 设置高亮信息
        query.setHighlight(true);
        query.addHighlightField("product_name");
        query.setHighlightSimplePre("<em>");
        query.setHighlightSimplePost("</em>");

        // 执行查询并返回结果
        QueryResponse response = server.query(query);
        // 获取匹配的所有结果
        SolrDocumentList list = response.getResults();
        // 匹配结果总数
        long count = list.getNumFound();
        System.out.println("匹配结果总数:" + count);

        // 获取高亮显示信息
        Map<String, Map<String, List<String>>> highlighting = response
                .getHighlighting();
        for (SolrDocument doc : list) {
            System.out.println(doc.get("id"));

            List<String> list2 = highlighting.get(doc.get("id")).get(
                    "product_name");
            if (list2 != null)
                System.out.println("高亮显示的商品名称:" + list2.get(0));
            else {
                System.out.println(doc.get("product_name"));
            }

            System.out.println(doc.get("product_catalog"));
            System.out.println(doc.get("product_price"));
            System.out.println(doc.get("product_picture"));
            System.out.println("=====================");
        }
    }