整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          html基礎(chǔ)必備-列表標(biāo)記,前端小白一看就會(huì)

          列表是一個(gè)接一個(gè)顯示條目的首選方式,而不是使用<br>標(biāo)記。完整的列表定義包括開始和結(jié)束標(biāo)記,以及表示列表中每個(gè)條目的標(biāo)記。

          有三種類型的列表:有序列表、無(wú)序列表和定義列表。

          無(wú)序列表

          無(wú)序列表是一個(gè)帶條目符號(hào)的列表,類似于菜單。

          無(wú)序列表 - <ul> ... </ul>

          ul標(biāo)記定義無(wú)序列表的開始和結(jié)束,列表項(xiàng)包含在ul標(biāo)記中。

          無(wú)序列表項(xiàng) - <li> ... </li>

          li標(biāo)記添加每個(gè)條目的文本,每個(gè)列表項(xiàng)必須有自己的li標(biāo)記。

          符號(hào)類型 <ul type="disc | circle | square">

          默認(rèn)情況下,瀏覽器將顯示圓形條目符號(hào)。這可以通過(guò)使用ul標(biāo)記的type屬性來(lái)更改,這將更改整個(gè)列表的條目符號(hào)類型。

          條目符號(hào)類型 <li type="?">

          通過(guò)設(shè)置li標(biāo)記的type屬性,可以為列表中的某個(gè)條目設(shè)置不同的符號(hào)類型。

          例子

          以下是無(wú)序列表的示例:

          瀏覽器顯示內(nèi)容如下所示:

          對(duì)海量數(shù)據(jù)渲染,即使是強(qiáng)大的 Vue 也難免會(huì)遇到性能瓶頸,卡頓、掉幀等問(wèn)題接踵而至。今天,我們就來(lái)聊聊如何利用虛擬列表這一“黑科技”,解決 Vue 中萬(wàn)級(jí)數(shù)據(jù)列表的勾選卡頓問(wèn)題,讓你的列表性能飛起來(lái)!

          海量數(shù)據(jù)渲染之痛:卡頓、崩潰、用戶體驗(yàn)差

          當(dāng)數(shù)據(jù)量達(dá)到上萬(wàn)條甚至更多時(shí),傳統(tǒng)的列表渲染方式會(huì)將所有數(shù)據(jù)一次性加載并渲染到頁(yè)面上,這會(huì)帶來(lái)一系列問(wèn)題:

          • 瀏覽器卡頓: 大量的 DOM 節(jié)點(diǎn)操作,會(huì)占用大量的 CPU 資源,導(dǎo)致瀏覽器卡頓甚至崩潰。
          • 頁(yè)面加載緩慢: 首次渲染時(shí)間過(guò)長(zhǎng),用戶需要等待很長(zhǎng)時(shí)間才能看到列表內(nèi)容。
          • 操作卡頓: 列表滾動(dòng)、勾選等操作,都會(huì)變得非常卡頓,嚴(yán)重影響用戶體驗(yàn)。

          虛擬列表:以一敵萬(wàn)的性能優(yōu)化利器

          虛擬列表的核心思想是:只渲染可視區(qū)域內(nèi)的數(shù)據(jù),非可視區(qū)域的數(shù)據(jù)不進(jìn)行渲染,從而大大減少 DOM 節(jié)點(diǎn)數(shù)量,提高渲染效率。

          Vue 中如何實(shí)現(xiàn)虛擬列表?

          1. 核心思路

          • 計(jì)算可視區(qū)域的高度和每個(gè)列表項(xiàng)的高度。
          • 根據(jù)可視區(qū)域的高度和滾動(dòng)位置,計(jì)算出需要渲染的列表項(xiàng)的起始索引和結(jié)束索引。
          • 只渲染起始索引和結(jié)束索引之間的列表項(xiàng),并通過(guò) CSS 技巧,將這些列表項(xiàng)定位到正確的位置。
          • 監(jiān)聽列表滾動(dòng)事件,動(dòng)態(tài)更新渲染的列表項(xiàng)。

          2. 示例代碼

          <template>
            <div class="virtual-list" @scroll="handleScroll">
              <div class="list-viewport" :style="{ height: `${viewportHeight}px` }">
                <div class="list-container" :style="{ transform: `translateY(${startIndex * itemHeight}px)` }">
                  <div v-for="(item, index) in visibleData" :key="index" class="list-item" :style="{ height: `${itemHeight}px` }">
                    <input type="checkbox" v-model="item.checked">
                    {{ item.label }}
                  </div>
                </div>
              </div>
            </div>
          </template>
          
          <script>
          export default {
            data() {
              return {
                dataList: [], //  所有數(shù)據(jù)
                visibleData: [], //  可視區(qū)域數(shù)據(jù)
                viewportHeight: 0, //  可視區(qū)域高度
                itemHeight: 50, //  每個(gè)列表項(xiàng)高度
                startIndex: 0, //  起始索引
                endIndex: 0, //  結(jié)束索引
              };
            },
            mounted() {
              this.viewportHeight = this.$el.clientHeight;
              this.generateData(10000); //  生成 10000 條數(shù)據(jù)
            },
            methods: {
              //  生成模擬數(shù)據(jù)
              generateData(count) {
                for (let i = 0; i < count; i++) {
                  this.dataList.push({
                    label: `Item ${i}`,
                    checked: false,
                  });
                }
                this.updateVisibleData();
              },
              //  更新可視區(qū)域數(shù)據(jù)
              updateVisibleData() {
                this.startIndex = Math.floor(this.$el.scrollTop / this.itemHeight);
                this.endIndex = Math.min(this.startIndex + Math.ceil(this.viewportHeight / this.itemHeight) + 1, this.dataList.length);
                this.visibleData = this.dataList.slice(this.startIndex, this.endIndex);
              },
              //  處理滾動(dòng)事件
              handleScroll() {
                this.updateVisibleData();
              },
            },
          };
          </script>
          

          3. 源碼解析

          • handleScroll 方法監(jiān)聽列表滾動(dòng)事件,并在每次滾動(dòng)時(shí)調(diào)用 updateVisibleData 方法。
          • updateVisibleData 方法計(jì)算可視區(qū)域數(shù)據(jù)的起始索引和結(jié)束索引,并更新 visibleData 數(shù)組。
          • v-for 指令只渲染 visibleData 數(shù)組中的數(shù)據(jù),從而減少 DOM 節(jié)點(diǎn)數(shù)量。
          • :style 屬性動(dòng)態(tài)設(shè)置列表容器的 transform 屬性,將可視區(qū)域數(shù)據(jù)定位到正確的位置。

          總結(jié)

          虛擬列表是解決海量數(shù)據(jù)渲染性能問(wèn)題的利器,使用虛擬列表可以顯著提高列表的渲染效率和用戶體驗(yàn)。在 Vue 項(xiàng)目中,我們可以借助虛擬列表組件或自行實(shí)現(xiàn)虛擬列表邏輯,優(yōu)化列表性能,打造絲滑流暢的用戶體驗(yàn)!

          #頭條創(chuàng)作挑戰(zhàn)賽#

          質(zhì)文章,及時(shí)送達(dá)

          作者:JasonGofen

          鏈接:https://www.jianshu.com/p/95869ade37b3

          本文內(nèi)容主要講解Solr 7.7.1 環(huán)境搭建后使用Spring boot 2.1.3集成SolrJ實(shí)現(xiàn)簡(jiǎn)易全文檢索微服務(wù),對(duì)于Solr與Spring boot的介紹內(nèi)容網(wǎng)上資料很多,本文不再贅述。

          關(guān)于本文內(nèi)容所涉及資源在最后會(huì)給大家統(tǒng)一都列出來(lái)。

          一、環(huán)境說(shuō)明

          Spring boot 結(jié)合 SolrJ 實(shí)現(xiàn)對(duì)Solr Server的訪問(wèn)是非常簡(jiǎn)單的,它們相互之間的關(guān)系如下圖所示。

          主體實(shí)現(xiàn)是通過(guò)在Spring boot微服務(wù)中集成SolrJ,配置好Solr Server參數(shù),調(diào)用SolrJ中的CRUD API實(shí)現(xiàn)請(qǐng)求Solr Server端進(jìn)行添加、修改、刪除索引和查詢的操作。至于如何結(jié)合現(xiàn)有業(yè)務(wù)系統(tǒng),我們后面介紹。

          圖1 簡(jiǎn)易環(huán)境說(shuō)明

          下面以最簡(jiǎn)單快速的方式實(shí)現(xiàn)全文檢索基礎(chǔ)CRUD功能。

          二、搭建Solr 7.7.1 Server端

          因自己的電腦硬盤空間滿了沒(méi)裝Linux虛擬機(jī),就以Windows為例安裝Solr Server端了。其實(shí)總體而言兩個(gè)系統(tǒng)對(duì)Solr Server端的操作類似,各位看官舉一反三就好,就兩種系統(tǒng)部署Solr的不同下面也會(huì)做相應(yīng)的提及。

          • 已配置好的Solr 7.7.1下載:

          https://pan.baidu.com/s/11s18oJVKpEVc-AmZO1xkgA

          我們首先來(lái)了解一下Solr的常見命令:

          • 啟動(dòng):

          ./solr start

          • 關(guān)閉:

          ./solr stop -all

          • 重啟:

          ./solr restart

          • 創(chuàng)建Core:

          ./solr create -c YourCoreName -d _default

          • 刪除Core:

          ./solr delete -c YourCoreName

          關(guān)于Solr更細(xì)致的內(nèi)容,大家可以參閱下方鏈接:

          • Solr 官網(wǎng)

          https://lucene.apache.org/solr/

          • Solr API官方文檔

          http://lucene.apache.org/solr/7_7_1/solr-solrj/index.html

          • Solr 中文文檔(譯版)

          https://www.w3cschool.cn/solr_doc/solr_doc-t3642fkr.html

          要想搭建Solr Server攏共分3步:

          步驟1:部署Solr 7.7.1

          步驟1-1:下載安裝JDK和Solr Server端

          • 下載安裝JDK 8:JDK的安裝在這就不說(shuō)了,網(wǎng)上有很多資料。\

          Java SE Development Kit 8 下載

          • 下載Solr 7.7.1壓縮包:請(qǐng)注意Linux下載solr-7.7.1.tgz,Windows下載solr-7.7.1.zip\

          http://archive.apache.org/dist/lucene/solr/

          步驟1-2:解壓Solr-7.7.1壓縮包

          • Windows下解壓壓縮包到對(duì)應(yīng)的目錄,我的路徑是:

          C:\myworking\solr-7.7.1

          • Linux下使用 tar 命令解壓Solr壓縮包:

          tar zxvf solr-7.7.1.tgz -C /myworking

          步驟1-3:進(jìn)入bin目錄運(yùn)行Solr

          Windows與Linux操作solr的命令都是一樣的,但都需要進(jìn)入到Solr的bin目錄下,我的目錄是C:\myworking\solr-7.7.1\binlinux的目錄使用cd命令進(jìn)入即可。

          • 進(jìn)入的到bin目錄下執(zhí)行啟動(dòng)命令:

          ./solr start

          • 啟動(dòng)完成后的控制臺(tái)截圖:

          圖2 控制臺(tái)Solr啟動(dòng)完成圖

          • 隨后我們?cè)L問(wèn)http://localhost:8983即能看到Solr Server端的Web頁(yè)面了

          圖3 Solr Server端 Web首頁(yè)

          步驟1-4:創(chuàng)建Core

          Solr Core的創(chuàng)建有兩種方式,第一種是通過(guò)命令行的方式,第二種是在SolrWeb首頁(yè)中創(chuàng)建。

          個(gè)人比較推薦第一種,原因有二,一是方便快捷在命令行一句話搞定,Ctrl+c Ctrl+v齊活兒,不用在頁(yè)面上點(diǎn)來(lái)點(diǎn)去還得敲文字,二是所在公司大牛在實(shí)踐過(guò)后說(shuō)是如果采用的第二種方式創(chuàng)建出的Core會(huì)有一些問(wèn)題。本著聽人話,吃飽飯的態(tài)度就采用第一種吧~ ~*大家可以實(shí)踐一下然后分享給我哦。*當(dāng)然兩種方式還是要介紹下的。

          • 使用命令行創(chuàng)建Core

          我們只需要進(jìn)入到上述的bin目錄,復(fù)制以下命令即可創(chuàng)建Core,命令中的TestCore為名稱可以自行替換:

          ./solr create -c TestCore -d _default

          • 使用Web端創(chuàng)建Core

          上述圖3中左側(cè)的列表第3個(gè)Core Admin菜單項(xiàng),點(diǎn)開后就明白怎么做了。

          • Web端查看TestCore

          圖4 選擇TestCore

          圖5 TestCore詳情圖

          步驟2:配置IK-Analyzer中文分詞

          介紹性的內(nèi)容還是不羅列了,大家自己百度吧。Ik-Analyzer分詞據(jù)說(shuō)是國(guó)內(nèi)最好用的中文分詞,大部分人都用這個(gè)。目前Solr-7.7.1也自帶了一個(gè)中文分詞,具體的對(duì)比我沒(méi)做過(guò),等裝完IK后大家回來(lái)可以進(jìn)行下對(duì)比。同時(shí)歡迎分享給我哦。

          • IK分詞GitHub:

          https://github.com/magese/ik-analyzer-solr7

          • 動(dòng)態(tài)詞庫(kù)自動(dòng)加載:

          https://github.com/liang68/ik-analyzer-solr6

          http://www.cnblogs.com/liang1101/articles/6395016.html

          PS:關(guān)于動(dòng)態(tài)詞庫(kù)自動(dòng)加載,這個(gè)大家看一下下面這段引用描述后視項(xiàng)目情況選擇要不要去研究下。

          如果只是在我們?cè)械臉I(yè)務(wù)系統(tǒng)中簡(jiǎn)單集成Solr,那暫時(shí)沒(méi)必要去了解動(dòng)態(tài)詞庫(kù)自動(dòng)加載。如果像商城等業(yè)務(wù)系統(tǒng)中,對(duì)于搜索模塊是業(yè)務(wù)系統(tǒng)的核心之一,那么簡(jiǎn)單使用IK可能無(wú)法達(dá)到線上使用的要求。在IK分詞器中默認(rèn)是一次啟動(dòng)將主詞庫(kù)、停用詞以及擴(kuò)展詞庫(kù)全部加載完畢,后續(xù)如果再想要增加額外的擴(kuò)展詞,就必須得修改對(duì)應(yīng)的擴(kuò)展詞表重新打包上傳并重啟服務(wù)方能生效,這種方式不適合應(yīng)用與線上服務(wù)。那么到底如何實(shí)現(xiàn)這種無(wú)縫擴(kuò)充詞庫(kù)呢?大家可以看看上面的博客。

          步驟2-1:配置IK-analyzer jar包和詞庫(kù)

          首先需要大家下載jar包和源碼,我們下面需要放到Solr Server端對(duì)應(yīng)的目錄下。

          • IK分詞jar包:

          https://search.maven.org/remotecontent?filepath=com/github/magese/ik-analyzer/7.7.1/ik-analyzer-7.7.1.jar

          • IK分詞GitHub源碼:

          https://github.com/magese/ik-analyzer-solr7

          1. 將下載好的ik-analyzer-7.7.1.jar包放入Solr服務(wù)的webapp\WEB-INF\lib目錄下,我的目錄全路徑是:

          C:\myworking\solr-7.7.1\server\solr-webapp\webapp\WEB-INF\lib

          1. 將下載好的ik-analyzer-solr7-master源碼下的src\main\resources目錄中的文件***(如下)***,放入到webapp\WEB-INF\classes目錄下:

          ① IKAnalyzer.cfg.xml 擴(kuò)展配置文件

          ② ext.dic 擴(kuò)展詞庫(kù)

          ③ stopword.dic 停止詞庫(kù)

          ④ ik.conf 動(dòng)態(tài)詞庫(kù)配置文件

          ⑤ dynamicdic.txt 動(dòng)態(tài)詞庫(kù)

          我的目錄全路徑是:

          C:\myworking\solr-7.7.1\server\solr-webapp\webapp\WEB-INF\classses

          • 關(guān)于詞庫(kù)中同義詞庫(kù)、擴(kuò)展詞庫(kù)、停止詞庫(kù)的介紹,可以看下面的blog:

          https://blog.csdn.net/zcl_love_wx/article/details/52092894

          步驟2-2. 配置TestCoreserver\solr\TestCore\conf\managed-schema,添加IK分詞器,示例如下:

          <!-- ik分詞器 -->

          <fieldType name="text_ik" class="solr.TextField">

          <analyzer type="index">

          <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>

          <filter class="solr.LowerCaseFilterFactory"/>

          </analyzer>

          <analyzer type="query">

          <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>

          <filter class="solr.LowerCaseFilterFactory"/>

          </analyzer>

          </fieldType>

          *PS:放在<schema name="default-config" version="1.6">標(biāo)簽下。*同時(shí)在該標(biāo)簽下我們還需要配置field,請(qǐng)看步驟3。

          步驟3:配置field

          Solr filed域的配置極為重要,filed的配置會(huì)影響到索引的創(chuàng)建和查詢出的結(jié)果展示。

          <!-- Solr Test search -->

          <field name="title" type="text_ik" indexed="true" stored="true" required="true" multiValued="true" />

          <field name="content" type="text_ik" indexed="true" stored="true" required="true" multiValued="true" />

          <field name="filetype" type="string" indexed="true" stored="true" required="true" multiValued="false" />

          <field name="uploadtime" type="string" indexed="false" stored="true" required="true" multiValued="false" />

          <!-- 復(fù)制域,可以將多個(gè)Field復(fù)制到一個(gè)Field中,以便進(jìn)行統(tǒng)一的檢索,multiValued屬性需要設(shè)置成true -->

          <copyField source="content" dest="title" />

          name:查詢時(shí)的名稱

          type:這個(gè)是之前定義的FieldType的名稱,在這使用的ik分詞

          indexed:是否索引(true/false)

          stored:是否存儲(chǔ)(是否將索引結(jié)果存儲(chǔ)到索引庫(kù))

          multivalued:是否多值(一般配合copyField使用)

          • 動(dòng)態(tài)filed

          在定義filed時(shí),可能會(huì)隨著業(yè)務(wù)主線作出變更,那么每次在managed-schema更改filed后,還需重啟Solr也是個(gè)麻煩事兒。那么在生產(chǎn)環(huán)境如此操作可能顯得不是那么理想了。那么可以在變更時(shí)使用類似通配符的方式建立動(dòng)態(tài)filed,比如name="title"可以寫成name="fl_*",這樣只要以fl_開頭的索引都可以被建立。

          步驟4:重啟Solr服務(wù),測(cè)試ik分詞

          這里請(qǐng)注意Analyse Fieldname / FieldType:右邊的下拉列表,需要去選中ik分詞text_ik。我們可以看到輸入中華人民共和國(guó)關(guān)鍵字后所出現(xiàn)的分詞效果。

          圖6 分詞效果圖

          至此我們的Solr Server端基礎(chǔ)版就搭建完成了,下面開始使用Spring boot結(jié)合SolrJ進(jìn)行全文檢索微服務(wù)的搭建。

          三、Spring boot 微服務(wù)實(shí)現(xiàn)

          Spring boot的基礎(chǔ)知識(shí)不講解了,下面我們采用Spring boot 2.1.3結(jié)合SolrJ 7.7.1完成全文檢索微服務(wù)的實(shí)現(xiàn)。

          • 下載源碼

          https://github.com/JasonGofen/SolrProject

          步驟1:在本地準(zhǔn)備將要建立索引的文件

          準(zhǔn)備兩個(gè)doc文檔,寫入一些自定內(nèi)容,放到指定目錄下,當(dāng)然也不一定非得要doc。以下是我準(zhǔn)備的兩個(gè)文件:

          C:\solrfile\data\鵝鵝鵝.pdfC:\solrfile\data\靜夜思.docx

          步驟2:搭建Spring boot項(xiàng)目

          • 創(chuàng)建項(xiàng)目,在pom.xml引入SolrJ的Maven依賴

          <!-- SolrJ 7.7.1 API -->

          <dependency>

          <groupId>org.apache.solr</groupId>

          <artifactId>solr-solrj</artifactId>

          <version>7.7.1</version>

          </dependency>

          <!-- 解析文檔內(nèi)容工具包 -->

          <dependency>

          <groupId>org.apache.tika</groupId>

          <artifactId>tika-core</artifactId>

          <version>1.9</version>

          </dependency>

          • 目錄結(jié)構(gòu)

          ├── src

          │ └── main

          │ ├── java

          │ │ └── com.jasongofen

          │ │ ├── client

          │ │ │ └── SolrClient.java // Solr客戶端

          │ │ ├── config

          │ │ │ ├── CorsConfig.java // 跨域配置文件

          │ │ │ └── SolrConfigProperties.java // yml屬性實(shí)例化配置文件

          │ │ ├── test

          │ │ │ └── SolrCURDTest.java // Solr API調(diào)用測(cè)試示例

          │ │ ├── util

          │ │ │ ├── ConvertUtil.java // 自定義轉(zhuǎn)換工具類

          │ │ │ └── TikaUtil.java // 提取文檔內(nèi)容工具類

          │ │ └── SolrProjectApplication.java // Spring boot啟動(dòng)類

          │ └── resources

          │ ├── application.yml // 項(xiàng)目配置

          │ ├── banner.txt // banner配置

          │ └── logback-spring.xml // 日志配置

          ├── pom.xml // 依賴配置

          └── README.md // 項(xiàng)目幫助文檔

          • 配置application.ymlsolr節(jié)點(diǎn)下的屬性值***(必須)***

          # solr配置

          solr:

          # Solr Server端地址

          server: localhost:8983 # 設(shè)置你的Solr Server訪問(wèn)地址

          # Solr Core名稱

          core: TestCore # 設(shè)置你的Solr Core名稱

          # 上面準(zhǔn)備的文檔的所在本地路徑

          dir: C:\solrfile\data\ # 設(shè)置你的需要建立索引的文件所在目錄

          步驟3:運(yùn)行項(xiàng)目

          下面就可以運(yùn)行項(xiàng)目了,SolrJ API調(diào)用請(qǐng)看以下內(nèi)容。未完待續(xù)

          SolrJ API調(diào)用說(shuō)明

          基礎(chǔ)的API調(diào)用代碼在項(xiàng)目目錄src\main\java\com.jasongofen.test\SolrCURDTest.java文件中,該java是一個(gè)Controller可以以http請(qǐng)求的方式模擬其他業(yè)務(wù)系統(tǒng)調(diào)用過(guò)程。

          • 添加、修改索引

            添加索引時(shí)首先使用HttpSolrClientSolr Server建立連接,隨后解析需要建立索引的文件*(至于需要結(jié)合現(xiàn)有的業(yè)務(wù)系統(tǒng)是采用http ftp等方式從各自的文件Server中獲取,還是另外的方式,請(qǐng)結(jié)合當(dāng)前項(xiàng)目業(yè)務(wù)需要作擴(kuò)展即可)*,接著把解析出的文件數(shù)據(jù)放到對(duì)應(yīng)的索引位置,在設(shè)置索引內(nèi)容時(shí)id字段是必須要設(shè)置的且全局唯一,最后提交索引并關(guān)閉SolrClient

            修改索引時(shí),如果id在索引庫(kù)中已存在,則執(zhí)行更新操作。

          @GetMapping("/Add")

          public void solrAdd throws Exception {

          // 設(shè)置文件路徑

          List<String> files = new ArrayList<>;

          files.add("鵝鵝鵝.pdf");

          files.add("靜夜思.docx");

          // 獲取Solr客戶端

          HttpSolrClient solr = SolrClient.getClient(solrConfigProperties.getServer);

          String prefix = "";

          for (String fi : files) {

          System.out.println(fi);

          // 取后綴名

          prefix = ConvertUtil.getFileSufix(fi);

          if (prefix.equalsIgnoreCase("txt") ||

          prefix.equalsIgnoreCase("docx") ||

          prefix.equalsIgnoreCase("doc") ||

          prefix.equalsIgnoreCase("pdf")) {

          String fileInfo = fi.split("\.");

          String content = "";

          // 獲取文件流,取出文件內(nèi)容

          InputStream inputStream = new FileInputStream(solrConfigProperties.getDir + fi);

          if (prefix.equals("txt")) {

          content = TikaUtil.txt2String(inputStream);

          } else if (prefix.equals("docx") || prefix.equals("doc") || prefix.equals("pdf")) {

          content = TikaUtil.doc2String(inputStream);

          } else {

          inputStream.close;

          }

          // 添加索引

          SolrInputDocument solrDoc = new SolrInputDocument;

          String formatDate = ConvertUtil.formatDate;

          // 執(zhí)行添加 ps:如果id相同,則執(zhí)行更新操作

          solrDoc.addField("id", UUID.randomUUID.toString.toUpperCase.replace("-", ""));

          solrDoc.addField("title", fileInfo[0]);

          solrDoc.addField("content", content);

          solrDoc.addField("filetype", prefix);

          solrDoc.addField("uploadtime", formatDate);

          solr.add(solrConfigProperties.getCore, solrDoc);

          } else {

          continue;

          }

          }

          // 提交

          solr.commit(solrConfigProperties.getCore);

          solr.close;

          }

          • 查詢

          查詢時(shí)因返回的是JSON串,并未做前端頁(yè)面展示,請(qǐng)根據(jù)業(yè)務(wù)需求自行定制。

          @GetMapping("/Query")

          public SolrDocumentList solrQuery throws Exception {

          HttpSolrClient solrClient = SolrClient.getClient(solrConfigProperties.getServer);

          // 定義查詢條件

          Map<String, String> params = new HashMap<String, String>;

          params.put("q", "*:*");

          SolrParams mapSolrParams = new MapSolrParams(params);

          //執(zhí)行查詢 第一個(gè)參數(shù)是collection,就是我們?cè)趕olr中創(chuàng)建的core

          QueryResponse response = solrClient.query(solrConfigProperties.getCore, mapSolrParams);

          // 獲取結(jié)果集

          SolrDocumentList results = response.getResults;

          for (SolrDocument result : results) {

          // SolrDocument 數(shù)據(jù)結(jié)構(gòu)為Map

          System.out.println(result);

          }

          solrClient.close;

          return results;

          }

          • 刪除索引

          需要?jiǎng)h除索引時(shí),根據(jù)id去刪除即可。

          @GetMapping("/Delete")

          public void solrDelete(@RequestParam("id") String id) throws Exception {

          HttpSolrClient solrClient = SolrClient.getClient(solrConfigProperties.getServer);

          // 通過(guò)id刪除 執(zhí)行要?jiǎng)h除的collection(core)

          solrClient.deleteById(solrConfigProperties.getCore, id);

          // 還可以通過(guò)查詢條件刪除

          // solrClient.deleteByQuery(solrConfigProperties.getCore, "查詢條件");

          // 提交刪除

          solrClient.commit(solrConfigProperties.getCore);

          solrClient.close;

          }

          本文所用資源匯總:

          • 本文已配置的 Solr7.7.1https://pan.baidu.com/s/11s18oJVKpEVc-AmZO1xkgA

          • 本文源碼https://github.com/JasonGofen/SolrProject

          • Solr 官網(wǎng)https://lucene.apache.org/solr/

          • Solr API 官方文檔http://lucene.apache.org/solr/7_7_1/solr-solrj/index.html

          • Solr 中文文檔(譯版)https://www.w3cschool.cn/solr_doc/solr_doc-t3642fkr.html

          • JDK 8Java SE Development Kit 8 下載

          • Solr 7.7.1 壓縮包http://archive.apache.org/dist/lucene/solr/

          • IK 分詞 jar 包https://search.maven.org/remotecontent?filepath=com/github/magese/ik-analyzer/7.7.1/ik-analyzer-7.7.1.jar

          • IK 分詞 GitHub 源碼https://github.com/magese/ik-analyzer-solr7

          • 動(dòng)態(tài)詞庫(kù)自動(dòng)加載

            https://github.com/liang68/ik-analyzer-solr6

            http://www.cnblogs.com/liang1101/articles/6395016.html

          • 同義詞典、擴(kuò)展詞典、停止詞典介紹 Bloghttps://blog.csdn.net/zcl_love_wx/article/details/52092894

          • 創(chuàng)建 Spring boot 項(xiàng)目的網(wǎng)址https://start.spring.io/

          -END-

          如果看到這里,說(shuō)明你喜歡這篇文章,請(qǐng)轉(zhuǎn)發(fā)。同時(shí)標(biāo)星(置頂)本公眾號(hào)可以第一時(shí)間接受到博文推送。1. 基友說(shuō):“自己整一個(gè)”HashMap為什么線程不安全?3.一致性Hash在負(fù)載均衡中的應(yīng)用60個(gè)相見恨晚的神器工具


          主站蜘蛛池模板: 影院无码人妻精品一区二区| 亚洲码一区二区三区| 色狠狠色噜噜Av天堂一区| 韩国一区二区视频| 中文字幕在线无码一区二区三区| 亚洲AV无码国产精品永久一区| 国产午夜三级一区二区三| 精品一区二区三区在线视频观看| 精品国产一区二区三区| 日韩在线一区二区| 亚洲一区二区三区久久久久| 日韩精品无码一区二区三区免费| 精品人妻少妇一区二区三区在线| 免费无码VA一区二区三区| 濑亚美莉在线视频一区| 综合久久一区二区三区 | 一区二区精品视频| 久久精品一区二区| 欧洲亚洲综合一区二区三区| 精品一区二区无码AV| 精品国产乱码一区二区三区| 精品3d动漫视频一区在线观看| 无码少妇一区二区三区| 一区在线观看视频| 91久久精品国产免费一区| 亚洲丰满熟女一区二区v| 国产精品视频一区二区三区经| 亚洲高清美女一区二区三区| 精品成人乱色一区二区| 亚洲欧洲专线一区| 国产精品一区二区资源| 国产在线精品一区二区| 一区二区三区四区在线观看视频| 久久99久久无码毛片一区二区| 农村人乱弄一区二区| 色狠狠一区二区三区香蕉| 波多野结衣一区二区三区| 国产精品一区二区无线| 久久久不卡国产精品一区二区| 精品一区二区三区四区| 影音先锋中文无码一区|