Solr 8.11入門教程(3)數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)

新建core

添加core

命令添加

使用命令比較簡單

~$ bin/solr create -c mytest[core名稱]

這樣就添加完了。Core Admin就可以看到了。

手動添加

手動添加相對復(fù)雜一些,需要提前創(chuàng)建目錄,然后通過可視化界面添加

1、到server\solr(相對于solr根目錄的路徑,下同)目錄下,先把要?jiǎng)?chuàng)建的core目錄提前創(chuàng)建,復(fù)制configsets_default下的conf到core目錄。

~$ cd solr-8.11.2
~$ mkdir server/solr/mytest
~$ cp -r server/solr/configsets/_default/conf  server/solr/mytest/

2、點(diǎn)擊core的部分,因?yàn)橄拗茮]有core(核)會出現(xiàn)添加頁面。按照圖示添加 [圖片上傳失敗...(image-1a0020-1667202723227)]

添加完成,點(diǎn)擊“Core Admin”可以看到添加的核 [圖片上傳失敗...(image-ff02ef-1667202723227)]

配置solr字段

添加字段有2種方法,可以通過web頁面添加,也可以直接修改schema文件添加。

可視化界面增加

通過瀏覽器的Schema菜單添加 [圖片上傳失敗...(image-cd5140-1667202723227)]

添加字段名稱,選中字段類型,添加添加字段即可。https://solr.apache.org/guide/8_11/field-type-definitions-and-properties.html#field-default-properties

屬性 說明 取值 默認(rèn)值
stored 是否存儲,一個(gè)字段是否被存儲,取決于你是否想在solr的查詢結(jié)果中得到它,也就是說你是否想在查詢結(jié)果中看到它,它將會消耗cpu和io和磁盤空間等資源。 true/false true
indexed 字段是否創(chuàng)建索引,索引的字段是在搜索的時(shí)候可以用它來查詢或排序,在lucene中,被索引的字段將會建立倒排表。 true/false true
uninvertible 如果為 true,則表示一個(gè) indexed=“true” docValues="false" 字段在查詢時(shí)可以用“un-inverted”構(gòu)建大內(nèi)存數(shù)據(jù)結(jié)構(gòu)以代替 DocValues。 出于歷史原因,默認(rèn)為 true,但強(qiáng)烈建議用戶將其設(shè)置 false 以保持穩(wěn)定性,并據(jù)需要使用 docValues="true"。 true/false true
docValues 字段的值是否放在面向列的 DocValues 結(jié)構(gòu)中 true/false false
multiValued 設(shè)置為true表示此字段可以存儲多個(gè)值,意思是這個(gè)字段在一個(gè)文檔中可以存儲多個(gè)值的內(nèi)容。 true/false false
required 是否必須。如果為 true,則 Solr 拒絕任何添加沒有此字段的文檔。 true/false false
default 字段的默認(rèn)值,經(jīng)常用在字段是必須的,但是有時(shí)候又無法提供的情況,solr就會用默認(rèn)值替代。如: <field name="recordTime" type="date" indexed="true" stored="true" required="true" default="NOW+8HOUR"/> 標(biāo)示recordTime如果沒有提供,用當(dāng)前的時(shí)間+8個(gè)小時(shí)作為recordTime的時(shí)間,加8小時(shí)是因?yàn)閟olr默認(rèn)時(shí)區(qū)是0時(shí)區(qū),按照中國北京時(shí)間(東8區(qū))算,需要加上8個(gè)小時(shí)。

類型高級屬性

1.docValue

在solr的schema定義中,基本的long、int、double、float類型設(shè)置docValue,如下:

<fieldType name="long" class="solr.TrieLongField" docValues="true" precisionStep="0" positionIncrementGap="0"/>`
當(dāng)然也可以在字段里面直接定義:
<field name="_root_" type="string" indexed="true" stored="false" docValues="false" />

solr說明: 如果此字段應(yīng)包含doc值,則為true。 Doc值為用于分面(faceting),分組,排序和函數(shù)查詢。 雖然不是required,doc值會使索引加載更快,更多 NRT友好和更高內(nèi)存利用率。 但他們有一些 限制:它們目前只受StrField,UUIDField支持 和所有Trie *字段,并且根據(jù)字段類型,它們可能要求字段為單值,是必需的或具有默認(rèn)值 。 docValue值存在正排索引中,只所以在排序的時(shí)候效果更好,是因?yàn)閐ocValue是按照列存儲的,又存在正排索引中,所以可以通過文檔ID快速找到它。

說明下: lucene的倒排索引是:Term(詞)-> 文檔ID 這樣根據(jù)類似Hash算法,通過詞可以迅速找到文檔ID,然后把相關(guān)字段取處理。但是也有不利的方面就是如果要進(jìn)行分組或排序的時(shí)候,會遍歷取出所有文檔的字段,然后在內(nèi)存中根據(jù)排序字段進(jìn)行排序,非常耗時(shí)和占用內(nèi)存。

設(shè)置docValue就構(gòu)建了正排索引,即文檔ID->docValue字段,而且docValue字段又是排好序的,按照列存儲的。只是簡單說明。 設(shè)置docValue在lucene其實(shí)是增加一個(gè)字段,所以占存儲,影響建索引效率。

useDocValuesAsStored:如果這一項(xiàng)設(shè)置為true則標(biāo)示所有docValue為true的字段將被存儲,即使它的stored=false。

2.omitNorms

solr對這個(gè)屬性解釋的有點(diǎn)拗口,自己理解下,就是如果這個(gè)為true,則在索引中不存在這個(gè)字段的長度屬性。這在給文檔打分的時(shí)候用的到。

舉個(gè)例子,一個(gè)詞語,在兩篇文章中,一般認(rèn)為段的文章比長的文章是不是要更加符合查詢的需要(因?yàn)檫@個(gè)詞在兩篇文章中權(quán)重不一樣,比如在100個(gè)詞的文章中,這個(gè)詞權(quán)重為0.01; 在100個(gè)詞的文章中,這個(gè)詞權(quán)重為0.001),如果是,則需要用長度來加強(qiáng)文檔打分的策略,這就是這個(gè)屬性的作用。Norm 在Lucene中是按照浮點(diǎn)數(shù)的形式,只占用一個(gè)字節(jié)的方式存儲的。

忽略情況: 1、如果你的doc的字段的內(nèi)容長度大小比較一致,則可以忽略。 2、如果在查詢結(jié)果中,字段內(nèi)容的長度對你的結(jié)果匹配無影響忽略。 3、需要節(jié)省空間,提高建索引和查詢的性能。

使用情況: 1、字段內(nèi)容長度影響了文檔的打分,則需要使用。

在solr中,默認(rèn)的時(shí)間、string或數(shù)字類型,這個(gè)屬性為true。

3.termVectors

在solr中,我們通過查詢的內(nèi)容的詞向量和文檔中的此向量之間的夾角來求相關(guān)性,給文檔相關(guān)性打分(詞向量比較復(fù)雜,回頭單獨(dú)寫一篇文章來闡述)。 solr中有個(gè)MoreLikeThis 的功能,現(xiàn)在很多電商的查詢里面的找類似就是這個(gè)功能,solr利用term Vectors來計(jì)算相關(guān)度,通常是是利用存儲在索引中查詢信息計(jì)算的,設(shè)置termVectors為true,則可以在建索引的時(shí)候計(jì)算term Vector信息,且保存在索引中。

這對大數(shù)據(jù)量的索引來說,影響很大。如果你重度使用MoreLikeThis 的功能,可以開啟這個(gè)屬性。

4.termPositions和termOffset、termPayLoads

這三項(xiàng)和前面的termVectors關(guān)系很大,是在前面一項(xiàng)為true的情況下,這三項(xiàng)才有效果。分別是指詞在文檔中所處位置、詞的偏移量、詞在詞向量中比重信息(詞在文章中重要性?不確定此處)。 可以加速高亮功能和其他輔助功能,當(dāng)然如果設(shè)置為true也會增加索引的大小和降低建索引的速度。

omitTermFreqAndPositions: 如果設(shè)置為true,則忽略詞出現(xiàn)的頻次、位置和在文章中這個(gè)字段的比重信息。在不需要這些信息時(shí)候可以改進(jìn)索引性能。減少索引的大小。依賴這個(gè)詞的位置的查詢將默默地顯示找不到信息,除了textField字段類型,其他字段類型默認(rèn)設(shè)置為true。

omitPositions : 和omitTermFreqAndPositions 類似僅僅忽略位置。

5.precisionStep 和positionIncrementGap

precisionStep 這可能是這幾個(gè)屬性里面最難理解的屬性了,不過這個(gè)屬性用在數(shù)字或時(shí)間字段的范圍查詢或者排序的時(shí)候。通過字面理解就是精度步長,簡單來說就是通過保存數(shù)據(jù)的多個(gè)精度來加快數(shù)據(jù)的范圍定位。

舉個(gè)例子,比如你在電商網(wǎng)站查詢價(jià)格范圍在1000 到10000之間的所有手機(jī),這里面就用到了范圍搜索。如果價(jià)格值的范圍很小,用precisionStep 沒多大意義,只有大量數(shù)據(jù)的時(shí)候使用它才可能起到加快搜索的作用。 假設(shè)手機(jī)價(jià)格如下定義: <field name="phone_price" type="tint" indexed="true" stored="true" /<fieldType name="tint" class="solr.TrieIntField"precisionStep="8"positionIncrementGap="0"/> 首先說明在solr中(在lucene中),一個(gè)數(shù)字類型(Date類型實(shí)際是按照Long來存儲的)最高精度是其本身,這也稱為基數(shù)據(jù)。 solr對于一個(gè)具有precisionStep非0的值保存了多個(gè)不同精度的term。 按照Solr In Action舉例如圖:

[圖片上傳失敗...(image-437e32-1667202723227)]

xoIk5T.md.jpg

圖來自Solr In Action

tint四個(gè)字節(jié),按照precisionStep=8 ,則說明精度按照8位切分,4個(gè)字節(jié)一共32位,剛好保存四個(gè)值。

[圖片上傳失敗...(image-4b927-1667202723227)]

img

圖來自Solr In Action

通過這兩個(gè)圖的對比,更小的步長,則同一個(gè)值需要保存更多的term, 當(dāng)然范圍搜索也更加精確,查找速度更快,但是也同樣會增大索引的大小。

[圖片上傳失敗...(image-898441-1667202723227)]

img

圖來自Solr In Action

同樣是50000個(gè)價(jià)格隨機(jī)數(shù),在不同的precisionStep下的索引大小和范圍查詢速度的快慢。 positionIncrementGap 它是和multiValued一起使用的,標(biāo)示多值之間虛擬空白的數(shù)量。 舉個(gè)網(wǎng)上的例子:

title1: ab cd title2: xy zz 如果positionIncrementGap=0,那么這四個(gè)term的位置為0,1,2,3。如果檢索"cd xy"那么能夠找到,如果你不想讓它找到,那么就需要調(diào)整positionIncrementGap值。如100,那么這是位置為0,1,100,101。這樣就不能匹配了。

6.sortMissingFirst 和sortMissingLast

這兩個(gè)比較好理解,是文檔在排序的時(shí)候,如果排序字段的值缺失,那么是排在前面還是排在后面。

修改managed-schema

也可以直接修改managed-schema文件,在core的conf下的managed-schema文件中增加字段配置

<!-- 自定義的字段,id已經(jīng)存在不需要設(shè)置 -->
<field name="dd" type="string" indexed="true" stored="true"/>    
<field name="age" type="pint" indexed="true" stored="true" />
<field name="description" type="text_ik" indexed="true" stored="true"  />
<field name="createTime" type="pdate" indexed="true" stored="true"  />
<field name="updateTime" type="pdate" indexed="true" stored="true"  />

添加后到“Core Admin”中刷新一下核即可 [圖片上傳失敗...(image-b1c800-1667202723227)] 就添加上了。

添加數(shù)據(jù)

現(xiàn)在core已經(jīng)建好了,但是里面還沒有數(shù)據(jù),這里我們使用json添加以便快速演示(支持 JSON,、CSV、XML等格式),一般生產(chǎn)環(huán)境下都是從數(shù)據(jù)庫訪問。

準(zhǔn)備json數(shù)據(jù):

{"id": "11","age": 40,"name": "李白","description": "創(chuàng)造了古代浪漫主義文學(xué)高峰、歌行體和七絕達(dá)到后人難及的高度"},
{"id": "12","age": 31,"name": "杜甫","description": "唐代偉大的現(xiàn)實(shí)主義文學(xué)作家,唐詩思想藝術(shù)的集大成者"}

找到該core的Documents菜單,選擇文檔類型未JSON,把剛才準(zhǔn)備的數(shù)據(jù)粘貼進(jìn)來,確認(rèn)無誤提交。 [圖片上傳失敗...(image-ccbb71-1667202723227)]

查詢

剛才已經(jīng)添加了數(shù)據(jù),我們現(xiàn)在驗(yàn)證一下查詢一下

[圖片上傳失敗...(image-9a35eb-1667202723227)]

xVNcwt.md.png

點(diǎn)擊Query菜單,然后直接點(diǎn)擊Execute Query按鈕查詢可以看到剛才添加的2條數(shù)據(jù)已經(jīng)能查詢到了。

參考文檔

  1. 官方文檔
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容