1. 程式人生 > >SpringBoot高階篇搜尋Solr之 文件新增與修改使用姿勢

SpringBoot高階篇搜尋Solr之 文件新增與修改使用姿勢

大多涉及到資料的處理,無非CURD四種操作,對於搜尋SOLR而言,基本操作也可以說就這麼幾種,在實際應用中,搜尋條件的多樣性才是重點,我們在進入複雜的搜尋之前,先來看一下如何新增和修改文件

<!-- more -->

I. 環境準備

solr的基礎環境需要準備好,如果對這一塊有疑問的童鞋,可以參考下上一篇博文: 《190510-SpringBoot高階篇搜尋之Solr環境搭建與簡單測試

1. 環境配置

在pom檔案中,設定好對應的依賴

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from update -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    <java.version>1.8</java.version>
</properties>


<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>


<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-solr</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

因為我們採用預設的solr訪問姿勢,所以配置檔案中可以不加對應的引數,當然也可以加上

開啟 application.yml 配置檔案

spring:
  data:
    solr:
      host: http://127.0.0.1:8983/solr

如果我們的solr加上了使用者名稱密碼訪問條件,引數中並沒有地方設定username和password,那應該怎麼辦?

spring:
  data:
    solr:
      host: http://admin:[email protected]:8983/solr

如上寫法,將使用者名稱和密碼寫入http的連線中

2. 自動裝配

我們主要使用SolrTemplate來和Solr打交到,因此我們需要先註冊這個bean,可以怎麼辦?

package com.git.hui.boot.solr.config;

import org.apache.solr.client.solrj.SolrClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.solr.core.SolrTemplate;

/**
 * Created by @author yihui in 19:49 19/5/10.
 */
@Configuration
public class SearchAutoConfig {

    @Bean
    @ConditionalOnMissingBean(SolrTemplate.class)
    public SolrTemplate solrTemplate(SolrClient solrClient) {
        return new SolrTemplate(solrClient);
    }
}

上面的配置是條件注入,只有當SolrTemplate對應的bean沒有被自動載入時,才會載入,為什麼要怎麼幹?

(可以想一想原因...)

II. 使用姿勢示例

我們的操作主要依賴的是SolrTemplate,因此有必要在開始之前,看一下它的簽名

Spring的原始碼中,可以發現大多xxxTemplate都會實現一個xxxOperations 介面,而這個介面就是用來定義CURD的api,比如我們看下 SolrOperations中與修改相關的api

default UpdateResponse saveBean(String collection, Object obj) {
	return saveBean(collection, obj, Duration.ZERO);
}

/**
 * Execute add operation against solr, which will do either insert or update with support for commitWithin strategy.
 *
 * @param collection must not be {@literal null}.
 * @param obj must not be {@literal null}.
 * @param commitWithin max time within server performs commit.
 * @return {@link UpdateResponse} containing update result.
 */
UpdateResponse saveBean(String collection, Object obj, Duration commitWithin);

default UpdateResponse saveBeans(String collection, Collection<?> beans) {
	return saveBeans(collection, beans, Duration.ZERO);
}

UpdateResponse saveBeans(String collection, Collection<?> beans, Duration commitWithin);

default UpdateResponse saveDocument(String collection, SolrInputDocument document) {
	return saveDocument(collection, document, Duration.ZERO);
}

/**
 * Add a solrj input document to solr, which will do either insert or update with support for commitWithin strategy
 *
 * @param document must not be {@literal null}.
 * @param commitWithin must not be {@literal null}.
 * @return {@link UpdateResponse} containing update result.
 * @since 3.0
 */
UpdateResponse saveDocument(String collection, SolrInputDocument document, Duration commitWithin);


default UpdateResponse saveDocuments(String collection, Collection<SolrInputDocument> documents) {
	return saveDocuments(collection, documents, Duration.ZERO);
}

UpdateResponse saveDocuments(String collection, Collection<SolrInputDocument> documents, Duration commitWithin);

上面的api簽名中,比較明確的說明了這個 saveXXX 既可以用來新增文件,也可以用來修改文件,主要有提供了兩類

  • 單個與批量
  • saveDocument 與 saveBean

1. 新增文件

從上面的api簽名上看,saveDocument 應該是相對原始的操作方式了,因此我們先看下它的使用姿勢

a. saveDocument

首先就是建立文件 SolrInputDocument 物件,通過呼叫addField來設定成員值

public void testAddByDoc() {
    SolrInputDocument document = new SolrInputDocument();
    document.addField("id", 3);
    document.addField("title", "testAddByDoc!");
    document.addField("content", "通過solrTemplate新增文件");
    document.addField("type", 2);
    document.addField("create_at", System.currentTimeMillis() / 1000);
    document.addField("publish_at", System.currentTimeMillis() / 1000);

    UpdateResponse response = solrTemplate.saveDocument("yhh", document);
    solrTemplate.commit("yhh");
    System.out.println("over:" + response);
}

<font color="red">注意:儲存文件之後,一定得呼叫commit提交</font>

b. saveBean

前面需要建立SolrInputDocument物件,我們更希望的使用case是直接傳入一個POJO,然後自動與solr的filed進行關聯

因此一種使用方式可以如下

  • 定義pojo,成員上通過 @Field 註解來關聯solr的field
  • pojo物件直接當做引數傳入,儲存之後,執行 commit 提交
@Data
public static class DocDO {
    @Field("id")
    private Integer id;
    @Field("title")
    private String title;
    @Field("content")
    private String content;
    @Field("type")
    private Integer type;
    @Field("create_at")
    private Long createAt;
    @Field("publish_at")
    private Long publishAt;
}

/**
 * 新增
 */
private void testAddByBean() {
    DocDO docDO = new DocDO();
    docDO.setId(4);
    docDO.setTitle("addByBean");
    docDO.setContent("新增一個測試文件");
    docDO.setType(1);
    docDO.setCreateAt(System.currentTimeMillis() / 1000);
    docDO.setPublishAt(System.currentTimeMillis() / 1000);

    UpdateResponse response = solrTemplate.saveBean("yhh", docDO);
    solrTemplate.commit("yhh");
    System.out.println(response);
}

c. 批量

批量的方式就比較簡單了,傳入集合即可

private void testBatchAddByBean() {
    DocDO docDO = new DocDO();
    docDO.setId(5);
    docDO.setTitle("addBatchByBean - 1");
    docDO.setContent("新增一個測試文件");
    docDO.setType(1);
    docDO.setCreateAt(System.currentTimeMillis() / 1000);
    docDO.setPublishAt(System.currentTimeMillis() / 1000);

    DocDO docDO2 = new DocDO();
    docDO2.setId(6);
    docDO2.setTitle("addBatchByBean - 2");
    docDO2.setContent("新增一個測試文件");
    docDO2.setType(1);
    docDO2.setCreateAt(System.currentTimeMillis() / 1000);
    docDO2.setPublishAt(System.currentTimeMillis() / 1000);

    UpdateResponse response = solrTemplate.saveBeans("yhh", Arrays.asList(docDO, docDO2));
    solrTemplate.commit("yhh");
    System.out.println(response);
}

d. 測試

上面的幾個方法,我們執行之後,我們看下是否能查詢到新增加的資料

output

2. 文件修改

在看前面的介面簽名時,就知道修改和新增用的是相同的api,所以修改文件和上面的使用實際上也沒有什麼特別的,下面簡單的演示一下

public void testUpdateDoc() {
    DocDO docDO = new DocDO();
    docDO.setId(5);
    docDO.setTitle("修改之後!!!");
    docDO.setType(1);
    docDO.setCreateAt(System.currentTimeMillis() / 1000);
    docDO.setPublishAt(System.currentTimeMillis() / 1000);

    UpdateResponse response = solrTemplate.saveBean("yhh", docDO);
    solrTemplate.commit("yhh");
    System.out.println(response);
}

上面的例項中,修改了id為5的文件標題,並刪除了content內容,執行完畢之後,結果如何呢?

output

  • title被替換
  • content沒有了

到這裡就有個疑問了,對於呼叫而言,怎麼保證是修改還是新增呢?

  • 這裡主要是根據id來判斷,這個id類似db中的唯一主鍵,當我們沒有指定id時,會隨機生成一個id
  • 如果存在相同的id,則修改文件;如果不存在,則新增文件

III. 其他

0. 專案

1. 一灰灰Blog

盡信書則不如,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激

下面一灰灰的個人部落格,記錄所有學習和工作中的博文,歡迎大家前去逛逛

相關推薦

SpringBoot高階搜尋Solr 新增修改使用姿勢

大多涉及到資料的處理,無非CURD四種操作,對於搜尋SOLR而言,基本操作也可以說就這麼幾種,在實際應用中,搜尋條件的多樣性才是重

PHP引用自定義函數

urn global sta include 賦值 傳遞 語法 功能實現 頁面 PHP文件間的引用 include語言結構 格式:mixed include(string resource); 將一個資源文件resource載入到當前PHP程序中; resource資

Huffman的應用壓縮解壓縮

讀取文件 size 父節點 .get 位移 etc RM 初始 amp 文件壓縮與解壓縮> ???? 近期這段時間一直在學習樹的這樣的數據結構,也接觸到了Hu

CSS盒模型BFC

文件流:文件中可顯示的元素在排列時候的開始位置以及他們所佔的區域 原因:頁面元素不同,按照各自的特點去顯示,在頁面中所佔的區域是不一樣的 順序:從上到下,從左到右 css浮動float 概念:使元素脫離文件流,按照指定的方向發生移動,遇到父級元素或者相鄰的元素就會停下來 特徵:1)塊元素可以在一行顯示

Python 基礎操作的相關函數

取出 註意 宋體 循環 \n 函數 不出 line odin 一:文件操作fp =open("文件名",mode="采用的模式",encoding="使用什麽編碼集")fp 這個變量接受到open的返回值 是一個文件io對象 (又稱文件句柄)i => input 輸

Solr 配置schema.xml

standard 不同的 文檔 Coding 指向 hand 微軟 等價 core schema.xml這個配置文件的根本目的是為了通過配置告訴Solr怎樣建立索引。 solr的數據結構例如以下: document:一個文檔、一條記錄

DWR第五上傳

rem put rip data www. == throws text org 1. 在第一篇架構基礎上進行 2. 修改maven依賴 1 <dependencies> 2 <dependency> 3 &

Python入門(五)操作和字符編碼

Python 文件操作和字符編碼 1、文件操作 1、文件操作流程: 打開文件,得到文件句柄並賦值給一個變量===> file = open("yesterday",encoding="utf-8") 通過句柄對文件進行操作 關閉文件 ==> file.close() 1.2、打開文件的

Python成長路【第五】:Python基礎處理

閱讀 關註 src 文件路徑 程序 opened IT 寫入 文件操作 一、文件操作 1、介紹 計算機系統分為:計算機硬件,操作系統,應用程序三部分。 我們用python或其他語言編寫的應用程序若想要把數據永久保存下來,必須要保存於硬盤中,這就涉及到應用程序要操作硬件,

TK可視化內容查找(升級

基礎 bind ack 用戶 taf 按鈕 column 列表 win 升級為帶有選擇框 分三種查看格式一種是表格查看 一種是文本查看 一種是列表 1.列表查看類 # listbox 顯示數據 import tkinter class ListShowData:

【探索路】機器人(4)-根據3D來優化自己的機器人模型

手動 tps pan csdn article org 生成 圖像 模型生成   此章節不是必須做的!!!!   因為我已經用solidworks畫了機器人的3D模型,那我就直接導入已經畫好的三維模型。   如果大家沒有畫也是可以直接使用上一章節我們已經構建的機器人模型

【itext學習路】-------(第三)對pdf進行加密和許可權設定

上篇文章,我們學習了pdf的屬性設定,但是我們知道,在實際開發中,如果pdf文件被黑客盜取的話,那麼pdf中的資訊就會被洩露,因此本篇文章將會介紹pdf的加密設定,並且設定許可權。 首先我們要說明的是,itext中對pdf文件的加密包括兩部分,第一部分是使用者密

軟體工程(各的巨集觀把控)

一、可行性研究報告 第一部分:引言(背景,編寫目的) 第二部分:前提(目標,要求,方法,評價) 第三部分:現有系統分析(處理流程、工作負荷、開支、人員) 第四部分:建議模組分析(處理流程、改進之處,各方面影響、侷限性、技術可行性) 第五部分:可選擇的其他方案 第六部分:投資與

框架學習系列 mybatis 第十二 mapper映射輸出映射

總結 www. XML 聲明 com 2.4 res rom 用戶 1: mapper映射文件輸出映射(輸入類型) 2:resultType的使用 3:resultMap的使用 3:總結&下節預告 本文是《凱哥陪你學系列-框架學習之mybatis框架學習》中第十二篇

Python 爬蟲利器 Beautiful Soup 4 樹的搜尋

前面兩篇介紹的是 Beautiful Soup 4 的基本物件型別和文件樹的遍歷, 本篇介紹 Beautiful Soup 4 的文件搜尋 搜尋文件樹主要使用兩個方法 find() 和 find_all() find_all(): find_all 是用於搜尋節

SpringBoot -ElasticSearch RestHighLevelClient 高階客戶端使用(3) 操作

前一章講過如何將SpringBoot -ElasticSearch的高階客戶端RestHighLevelClient 的Index操作 這一章是使用RestHighLevelClient 進行document操作 之前說過es7.X會移除type,所以以下操作中 index和ty

SpringBoot進階教程 | 第一:YML多塊實現多環境配置

你是否為SpringBoot一個功能多個yml和多個properties檔案區分不同執行環境配置,經常為這些配置檔案的管理而頭疼,現在通過這篇文章,將徹底解決你的煩惱,這篇文篇介紹,怎麼通過yml檔案構建多文件塊,區分不同環境配置,自由切換不同環境啟動專案,一個

Python學習—基礎操作

flush 一次 格式化 mod 當前 ani author 對象 run 文件操作 文件操作也是編程中需要熟練掌握的技能,尤其是在後臺接口編寫和數據分析過程中,對各種類型的文件進行操作,獲取文件信息或者對信息進行存儲是十分重要的。本篇博客中將主要對常見的文本格式文件和Ex

SpringBoot高階JdbcTemplate資料查詢上

前面一篇介紹如何使用JdbcTemplate實現插入資料,接下來進入實際業務中,最常見的查詢篇。由於查詢的姿勢實在太多,對內容進行

Elasticsearch 7.x 、索引和 REST API 【基礎入門

前幾天寫過一篇《Elasticsearch 7.x 最詳細安裝及配置》,今天繼續最新版基礎入門內容。這一篇簡單總結了 Elasticsearch 7.x 之文件、索引和 REST API。 什麼是文件 文件Unique ID 文件元資料 什麼是索引 REST API 一、索引文件(Document) 1.