# Solr #### 1. Solr 概要 - 被設計為功能強大的文檔檢索應用程序(或平台),以提供根據用戶查詢所需的數據。 - 是基於Lucene所構建的搜索服務器(Solr底層的核心技術是使用Lucene來實現的)。是一個具備功能管理界面的獨立應用程式,提供給企業能夠應用。 - Lucene: - 是一套Java的全文檢索和搜尋的開放原始碼程式庫(全文搜尋引擎),由Apache軟體基金會支援和提供。 - 提供了一個簡單卻強大的應用程式介面,能夠做*全文檢索,但Lucene不是一個完整的應用程式,而是一個代碼庫和 API。 > *全文檢索:從文字或資料庫中自由萃取出訊息的技術,能夠在大量資料中快速搜索。執行全文檢索任務的程式,一般稱作搜尋引擎。 圖:Solr如何與應用程序整合(同時運作) ![](https://i.imgur.com/FjpGXna.png) >例 : 線上商店應用程序提供用戶界面"購物車",為最終用戶進行購買的方式。而庫存管理應用程序將允許商店員工編輯產品信息。產品的metadata(元資料)將保存在某種數據庫或Solr中。 - 依據以下步驟,Solr將使得online store搜索功能變得容易新增資料: 1. 定義一個schema。該schema告訴Solr有關將要建立索引的文檔的內容。Solr的架構強大而靈活,允許您根據應用程序訂制Solr的行為。(在商店的例子中,該schema將為產品名稱、描述、價格、製造商等定義字段。) 2. 提供documents,讓最終用戶未來可搜索。 3. 在應用程序中公開搜索功能。 --- #### 2. Solr’s Schema File - schema file定義核心中field(字段),儲存有關field的類型和field的詳細信息(index of the field)。 - 該文件的名稱和位置可能會有所不同,具體取決於最初配置Solr的方式或以後對其進行修改的方式。 - Solr中提供了兩種方式來配置schema,兩者只能選一: 1. 預設方式:通過Schema API 來進行配置及更改,資訊儲存在核心目錄的conf/managed-schema(Solr默認使用的檔案)中。可以用"顯式配置託管模式功能"以使用備用文件名,但是Solr仍會自動更新文件的內容。 2. 傳統方式:需手動編輯conf/schema.xml,編輯完後需重新開啟核心才會生效。 --- #### 3. Solr config - 許多文件都是XML格式,但與config進行設定的API傾向於用JSON格式進行programmatic access(編程訪問)。 - 在Solr’s Home將找到以下文件: - solr.xml:指定Solr server instance的configuration options(配置選項)。(更多solr.xml的詳細信息:Solr Cores和solr.xml。) - 每個Solr核心包含: - core.properties:每個核心定義的屬性。例如:名稱、核心所屬集合、Schema的位置等等。 - solrconfig.xml:控制high-level(高端?)行為,包含請求handler(處理程序)和其他配置選項。可定義url(需請求handler),及使用其默認配置以執行plugins。例如:指定data directory(數據目錄)的備用位置。 - managed-schema(或schema.xml):描述向Solr要求搜索至index的文件。該模式將文件定義為field的集合。操作者可以定義field type和field本身。field type的定義功能強大,並包含有關Solr如何處理傳入field values(字段值)和query values(查詢值)的資料。 - data/:包含low-level index files的目錄。 - Solr index配置透過schema.xml和solrconfig.xml完成 : ![](https://i.imgur.com/5W5EYzl.png) > WordPress : 為一套內容管理系統,能夠透過它來快速建立及管理網站。 > Solarium : Solr的用戶端庫 > From : https://deeplearning.lipingyang.org/2017/05/13/apache-solr-schema-explained/ --- #### 4. Solr API Schema API用HTTP API管理Schema的設定,可以讀、寫Schema,並通過API來更新Schema,solr會自動更新核心。用這種方式來動態的定義模式,就不用自己手動編寫config。 但是修改Schema並不會自動重新索引已索引的文件,只會對後續的文件起作用,如果必要的話則需手動重新索引(刪除原來的,再重新提交文件)。 --- # solr 7.4.0 server 安裝 #### 1. download java 14.0.2 Step 1. Installing OpenJDK version 14 on Ubuntu 20.04 LTS ``` $ sudo apt update $ sudo apt upgrade $ sudo apt install openjdk-14-jdk ## for servers try headless version ## $ sudo apt install openjdk-14-jdk-headless ``` Step 2. Verification(check version) ``` $ java --version ``` Step 3. Set up JAVA_HOME environment variable update the environment variables config file ``` $ sudo nano /etc/environment ## OR ## $ sudo vim /etc/environment ``` and set JAVA_HOME as follows: ``` JAVA_HOME="/usr/lib/jvm/java-14-openjdk-amd64" ``` #### 2. solr 7.4.0 server installation Step 1. 取得Solr的下載地址,然後使用wget命令下載 https://archive.apache.org/dist/lucene/solr/ ``` wget https://archive.apache.org/dist/lucene/solr/7.4.0/solr-7.4.0.tgz ``` Step 2. 下載完成後解壓縮檔案 ``` tar -zxvf solr-7.4.0.tgz ``` Step 3. 啟動 ``` cd solr-7.4.0 bin/solr start ``` Then~~~Happy searching! --- # 創建solr core 1. 先在`solr-7.4.0/server/solr/`中創建一個資料夾(例:test1) ![](https://i.imgur.com/lfvJpkv.png) 2. 在test1中複製一個configsets中的conf (提示有說明需存在instanceDir和dataDir 才能create core) ``` cp -r configsets/_default/conf/ test1/ ``` 3. 到Solr Core Admin中點選"Add Core", 將name及instanceDir輸入一開始建立的資料夾名(test1), then the new core(test1) will be created. ![](https://i.imgur.com/uAUTh9q.png) 4. success! ![](https://i.imgur.com/OOgKIRl.png) > 其他方式: https://wbkuo.pixnet.net/blog/post/156101696 --- # 配置schema 1. 到 `solr-7.4.0/server/solr/test1/conf/` 中打開 `managed-schema` 或 `schema.xml` 2. 將[solr7.4 with ckan 2.9 schema](https://hackmd.io/6gveBw5OR2Sgmz1DtiCAbg?view#Solr-74---Ckan-29) 貼上 3. Save it! --- > 有關solr的連結們: > https://wbkuo.pixnet.net/blog/category/2123399 > https://lucene.apache.org/solr/8_7_0/changes/Changes.html --- # Solr upgrade #### Solr 7.4 to 7.5 ##### 1. Schema Changes - 從Solr 7.0開始,Solr的schema field-guessing 已為所有的 ```_txt``` fields 創建 ```_str``` fields, 並在query(查詢)過後 return 這些 fields (by default). 從7.5開始, ```_str``` fields 在 default 不會再 return fields, 但仍可以用, 只是需要透過```fl```(某個參數)來進行查詢. - 從Solr v4開始不再運作的Standard Filter 已被 removed. ##### 2. Index Merge Policy - 使用 TieredMergePolicy (Solr 的default merge policy ) 時, ```optimize``` 以及 ```expungeDeletes``` 將遵循 ```maxMergedSegmentMB``` 的配置參數, 參數的 default 值為 5000 (5GB)。 - 如果絕對有必要控制優化後 segment 的數量, 須把 ```maxSegments```設為正整數。 (盡量把```maxSegments``` 設為高於 ```1``` )。 -  ```TieredMergePolicy``` 會比以前更積極 reclaim(收回) 超出 ```maxMergedSegmentMB``` 部分的resources。 ##### 3. UIMA(Unstructured Information Management Application) Removed - The UIMA contrib 已被永久 removed from Solr > UIMA官網: https://uima.apache.org/ ##### 4. Logging - ```server/resources/log4j2.xml``` 的default位置位於Solr的 logging configuration file 中  - Windows users 的bug已修正: Solr的範例log files(```bin/solr start -e```) 會被放到正確位置 ```example/``` 而不是 ```server``` --- #### Solr 7.5 to 7.6 ##### 1. Collections - 使用CLUSTERPROP命令以設定 cluster-wide default cluster properties 的 JSON 參數已更改。 舊的語法將 defaults nest(崁套)至 ```clusterDefaults```中,而新的語法只使用 ```defaults```. The command to use is still ```set-obj-property``` > nest(崁套): 在已有的表格、圖像或圖層中再加一個或多個表格、圖像或圖層,亦或兩個物體有裝配(可以互相組合)關係時,將一個物體嵌入另一物體的方法。 An example of the new syntax is: (JSON) ``` { "set-obj-property": { "defaults" : { "collection": { "numShards": 2, "nrtReplicas": 1, "tlogReplicas": 1, "pullReplicas": 1 } } } } ``` 到Solr 9之前仍支持舊語法,但建議用戶盡快使用新語法。 - ```min_rf```這個參數已被棄用,不再需要被提供去查看已實現的replication factor(複制因子)。replication factor 將會與 response 一起 return 給客戶端。 ##### 2. Autoscaling - 現在 autoscaling policy 被當作 default strategy, 可選擇創建 (new replicas)新副本 或 新collections副本 上的(node)節點。而所有的users都必須使用 default policy, 在default情況下, 會依據core的數量和可用的freedisk排序nodes, 這表示 "最少core數量和最高可用freedisk的node" 會被優先選擇去創建新的core。 - 以上的更改對 ```maxShardsPerNode``` 參數有兩個影響: 1. 實施 autoscaling policy 時,對```maxShardsPerNode```移除了使用限制, 現在創建collectiong時可設定此參數。 2. 移除 autoscaling policy 的default設定: ```maxShardsPerNode=1```。變成無論是否有設置autoscaling policy, 都會正確設置```maxShardsPerNode```(如果有需要的話)。 ```maxShardsPerNode``` 的default值仍為 ```1```, 但如果需要unlimited的舊行為則把 ```maxSharedsPerNode ```設為-1即可。. ##### 3. DirectoryFactory - Lucene 引入 ```ByteBuffersDirectoryFactory``` 以代替 ```RAMDirectoryFactory```( ```RAMDirectoryFactory``` 在Solr 9中會被移除)。 - 雖然現在仍然鼓勵users使用 ```NRTCachingDirectoryFactory```(可允許 Lucene 選擇最佳的 directory factory 來使用), 但如果已明確使用 ```RAMDirectoryFactory``` 來配置 Solr 的話, 建議在Solr 9 發布前更改至新的替代方式。 --- #### Solr 7.6 to 7.7 ##### 1. Admin UI - Admin UI 現在會顯示一個 login 畫面讓在 cluster (集群)中的 users 進行身分驗證。 - 有 Basic Authentication 的 clusters 會提示 users 輸入他們的 username and password. 在 clusters 使用 Kerberos Authentication  進行配置並指導 users 去配置它們的 browser 以提供適當的Kerberos ticket。 - login 畫面是裝飾用的, Admin UI 主要目的在於觸發 Solr requests, 使 7.7 以前版本的user能夠進行身分驗證且確認至今仍在使用。 ##### 2. Distributed Requests - 由於安全考量, ```shards``` 這個參數接收 distributed requests 時需手動選擇 shards 和 replicas, 以根據可接受值的whitelist(白名單) 檢查(or核對?) nodes。 - 在 SolrCloud mode 中, whitelist 會自動配置所有 live nodes。在 standalone mode(獨立模式)的 default 中, whitelist 是空的。 - 在 standalone mode 中使用 ```shards``` 參數的 users 可透過 ```solrconfig.xml``` 中的任何 ```shardHandler``` 中的```shardsWhitelist```property 來更改此值。 --- #### Solr 7.4 升級至 7.7 直接安裝solr 7.7, 創建core(參考[這裡](https://hackmd.io/aW45G9nhQ-GdCzNXgylN1A?both#%E5%89%B5%E5%BB%BAsolr-core))之後配置schema: 1. 到 `solr-7.7.0/server/solr/test1/conf/` 中打開 `managed-schema` 或 `schema.xml` 2. 將[solr7.4 with ckan 2.9 schema](https://hackmd.io/6gveBw5OR2Sgmz1DtiCAbg?view#Solr-74---Ckan-29) 貼上。 3. 存檔後即可和ckan連接使用。 --- # 目前ckan 2.9 - solr 7.7的問題 #### 1. 依照格式或標籤進行篩選 > 20210416測試時可以正常篩選 (1) 一個資料集如果有兩(或以上)個檔案的話無法依格式分類,但只有一個檔案的話可以。 (2) 可以手動設定標籤,但無法進行篩選。 #### 2. 模糊搜尋 > (英文字不分大小寫皆可搜尋, 例: 搜尋"aids"等同於搜尋"AIDS") > (中文斷詞目前好像是依照字和字之間有沒有空白分辨的, 例: "檔 案"的"檔"與"案"是分開的兩個詞, "檔案"則是同一個詞) ##### (1) 資料集標題及敘述, 檔案名稱及敘述的搜尋: "2016" - 2016腸病毒 "腸病毒" - 2016腸病毒 "16腸病毒" - 2016腸病毒 "area" - Area, Age, and Gender Statistical table - AIDS (中文敘述之間無空白) - Area, Age, and Gender Statistical table - AIDS - v2 (中文敘述之間有空白) "AIDS" - aids_diagnose - Area, Age, and Gender Statistical table - AIDS - Area, Age, and Gender Statistical table - AIDS - v2 - 愛滋病感染死亡人數統計 "愛滋病" - aids_diagnose - Area, Age, and Gender Statistical table - AIDS - v2 - 愛滋病感染死亡人數統計 "die" - 愛滋病感染死亡人數統計 (在檔案標題中找到) "統計表" - Area, Age, and Gender Statistical table - AIDS - v2 "資料集" - (沒有結果) "資 料 集" - 2 0 1 6 腸 病 毒 (在資料集敘述中找到) "有" - 2 0 1 6 腸 病 毒 (在檔案敘述中找到) "檔 案" - 2 0 1 6 腸 病 毒 (在檔案敘述中找到) ##### (2) 用副檔名搜尋: "csv" - 可搜尋副檔名為"csv"的資料 "json" - 可搜尋副檔名為"json"的資料 ---