😊SpringBoot интегрирует Elasticsearch (суперподробно).md
😊SpringBoot интегрирует Elasticsearch (суперподробно).md

SpringBoot интегрирует Elasticsearch (суперподробно)

Уведомление:

1. Настройка среды

Установить es

🔗Elasticsearch 6.4.3 Ссылка для скачивания

для удобства,Экологическое использованиеWindows

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

🍑После декомпрессии Конфигурация

  • оказатьсяconfigкаталогelasticsearch.yml

токенизатор

Как показано ниже,После декомпрессиитокенизаторнадеватьpluginsв каталоге,ikКаталог необходимо создать самостоятельно.

запускать

  • 🍈 Потому что яWindowsсреда,оказатьсяbinкаталогelasticsearch.batПросто дважды щелкните。
Командный тест
  • 🚆 Проверить состояние здоровья
    • curl -X GET “localhost:9200/_cat/health?v“
  • 🚖 Посмотреть все узлы
    • curl -X GET “localhost:9200/_cat/nodes?v“
  • 🏅 Новыйиндекс
    • curl -X PUT "localhost:9200/test"
  • ☀️ Посмотреть индекс
    • curl -X GET "localhost:9200/_cat/indices?v"
  • 🌈 Удалить индекс
    • curl -X DELETE "localhost:9200/test"

2. Интегрируйте Es

полагаться & Конфигурация

  • ❌ Я использую здесьSpringBoot 2.1.5.RELEASE,Выберите версию в соответствии с реальной ситуацией.
Язык кода:javascript
копировать
		<!--elasticsearch-->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
  • yamlКонфигурация
  • propertiesКонфигурация
Язык кода:javascript
копировать
spring.data.elasticsearch.cluster-name=community
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300

запускатьпроект:

  • ❌Если нет аварии, то обязательно будет авария
  • ❓Эта проблема связана с основной проблемой Эс. Я не буду объяснять ее здесь, я предложу идеи и пойму это самостоятельно.

Решение:

3. Используйте

Видеоруководство по интеграции SpringBoot с Elasticsearch

Класс сущности

  • ❌ Я полагаю, что студенты, которые ранее изучали JPA, будут знакомы со следующей Конфигурацией.
Язык кода:javascript
копировать
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
// Укажите Эс индекс тип Шардинг резервное копирование
@Document(indexName = "discusspost", type = "_doc", shards = 6, replicas = 3)
@Data
public class DiscussPost implements Serializable {
    private static final long serialVersionUID = 114809849189593294L;

    // Определите первичный ключ
    @Id
    private Integer id;
	
    // Соответствующий тип документа
    @Field(type = FieldType.Integer)
    private Integer userId;

    /**
     * type тип
     * analyzer парсер хранилища
     * searchAnalyzer парсер запросов
     */
    @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
    private String title;
    @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
    private String content;
}

слой сохранения

  • ElasticsearchRepository В нем много распространенных методов
Язык кода:javascript
копировать
@Repository
public interface DiscussPostRepository extends ElasticsearchRepository<DiscussPost, Integer> {
}

тестовый код

  • ❌ Код запроса уровня данных отображаться не будет. Я объясню это в коде.
  • 😊 Времени достаточно, рекомендуем посмотреть видео
Язык кода:javascript
копировать
/**
 * @author : look-word
 * 2022-11-03 18:56
 **/
@SpringBootTest
@RunWith(SpringRunner.class)
public class ElasticSearchTest {

    @Resource
    private DiscussPostRepository discussPostRepository;

    @Resource
    private DiscussPostMapper discussPostMapper;

    @Resource
    private ElasticsearchTemplate elasticsearchTemplate;

    @Test
    public void testInsert() {
        // Синхронизируйте результаты запроса с Es
        discussPostRepository.save(discussPostMapper.selectDiscussPostById(241));
    }

    @Test
    public void testInsertAll() {
        // Пакетный импорт discussPostRepository.saveAll()
        discussPostRepository.saveAll(discussPostMapper.selectDiscussPosts(101, 0, 100));
    }

    /**
     * тествозобновлять     */
    @Test
    public void testUpdate() {
        DiscussPost discussPost = discussPostMapper.selectDiscussPostById(241);
        обсудитьPost.setContent("Я люблю Китайскую Народную Республику, я китаец");
        discussPostRepository.save(discussPost);
    }

    /**
     * тест модифицировать
     */
    @Test
    public void testDelete() {
        discussPostRepository.deleteById(241);
    }

    /**
     * тестовый запрос
     */
    @Test
    public void testSelect() {
        // Создание условий запроса
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
            	// (значение запроса, поле запроса 1, поле запроса 1) Соответствует заголовку или содержит ли заголовок Интернет Bitter Winter
                .withQuery(QueryBuilders.multiMatchQuery("Интернет-магазин", "title", "title"))
                .withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC)) // сортировать
                .withSort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
                .withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
                .withPageable(PageRequest.of(0, 10)) // Пагинация
                .withHighlightFields(
                        new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
                        new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")
                ).build(); //Выделять
        Page<DiscussPost> page = discussPostRepository.search(searchQuery);
        page.get().forEach(System.out::println);
    }

    /**
     * тестовый запрос Выделить
     */
    @Test
    public void testSelectHighlight() {
        // Создание условий запроса
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.multiMatchQuery("Интернет-магазин", "title", "content"))
                .withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC)) // сортировать
                .withSort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
                .withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
                .withPageable(PageRequest.of(0, 10)) // Пагинация
                .withHighlightFields(
                        new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
                        new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")
                ).build(); //Выделять

        Page<DiscussPost> page = elasticsearchTemplate.queryForPage(searchQuery, DiscussPost.class, new SearchResultMapper() {
            @Override
            public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> aClass, Pageable pageable) {
                SearchHits hits = response.getHits();
                if (hits.getTotalHits() <= 0) {
                    return null;
                }
                List<DiscussPost> list = new ArrayList<>();
                for (SearchHit hit : hits) {
                    DiscussPost post = new DiscussPost();

                    String id = hit.getSourceAsMap().get("id").toString();
                    post.setId(Integer.parseInt(id));

                    String userId = hit.getSourceAsMap().get("userId").toString();
                    post.setUserId(Integer.parseInt(userId));

                    String title = hit.getSourceAsMap().get("title").toString();
                    post.setTitle(title);

                    String content = hit.getSourceAsMap().get("content").toString();
                    post.setContent(content);

                    String type = hit.getSourceAsMap().get("type").toString();
                    post.setType(Integer.parseInt(type));

                    String status = hit.getSourceAsMap().get("status").toString();
                    post.setStatus(Integer.parseInt(status));

                    String createTime = hit.getSourceAsMap().get("createTime").toString();
                    post.setCreateTime(new Date(Long.parseLong(createTime)));

                    String commentCount = hit.getSourceAsMap().get("commentCount").toString();
                    post.setCommentCount(Integer.parseInt(commentCount));

                    String score = hit.getSourceAsMap().get("score").toString();
                    post.setScore(Double.parseDouble(score));

                    // Обработка основных моментов
                    HighlightField titleField = hit.getHighlightFields().get("title");
                    // На странице несколько выделенных слов Показать только первый
                    if (titleField != null) {
                        post.setTitle(titleField.getFragments()[0].toString());
                    }
                    HighlightField contentField = hit.getHighlightFields().get("content");
                    if (contentField != null) {
                        post.setTitle(contentField.getFragments()[0].toString());
                    }
                    list.add(post);
                }
                return new AggregatedPageImpl(list, pageable, hits.getTotalHits(), response.getAggregations(), response.getScrollId(), hits.getMaxScore());
            }
        });
        page.get().forEach(System.out::println);
    }
}
boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.