練習 1:索引 Techproducts 資料

本練習將引導您了解如何將 Solr 作為雙節點叢集(兩個節點都在同一部機器上)啟動,並在啟動期間建立集合。然後,您將索引 Solr 附帶的一些範例資料,並進行一些基本搜尋。

以 SolrCloud 模式啟動 Solr

若要啟動 Solr,請在 Unix 或 MacOS 上執行:bin/solr start -e cloud;在 Windows 上執行:bin\solr.cmd start -e cloud

這將啟動一個互動式工作階段,在您的機器上啟動兩個 Solr「伺服器」。此命令有一個選項可以執行而不提示您輸入 (--no-prompt),但我們想要修改兩個預設值,因此我們現在不會使用該選項。

$ bin/solr start -e cloud

Welcome to the SolrCloud example!

This interactive session will help you launch a SolrCloud cluster on your local workstation.
To begin, how many Solr nodes would you like to run in your local cluster? (specify 1-4 nodes) [2]:

第一個提示會詢問我們要執行多少個節點。請注意最後一行的結尾處的 [2];這是預設的節點數。兩個是我們這個範例想要的數量,所以您只需按下 Enter

Ok, let's start up 2 Solr nodes for your example SolrCloud cluster.
Please enter the port for node1 [8983]:

這是第一個節點執行的埠。除非您知道您的機器上的埠 8983 上有其他程式在執行,否則也請按下 Enter 接受此預設選項。如果已有其他程式正在使用該埠,系統會要求您選擇另一個埠。

Please enter the port for node2 [7574]:

這是第二個節點將執行的埠。同樣地,除非您知道您的機器上的埠 7574 上有其他程式在執行,否則也請按下 Enter 接受此預設選項。如果已有其他程式正在使用該埠,系統會要求您選擇另一個埠。

Solr 現在會初始化自身並開始在這兩個節點上執行。腳本會列印它使用的命令,以供您參考。

Starting up 2 Solr nodes for your example SolrCloud cluster.

Creating Solr home directory /solr-{solr-full-version}/example/cloud/node1/solr
Cloning /solr-{solr-full-version}/example/cloud/node1 into
   /solr-{solr-full-version}/example/cloud/node2

Starting up Solr on port 8983 using command:
"bin/solr" start --cloud -p 8983 -s "example/cloud/node1/solr"

Waiting up to 180 seconds to see Solr running on port 8983 [\]
Started Solr server on port 8983 (pid=34942). Happy searching!


Starting up Solr on port 7574 using command:
"bin/solr" start --cloud -p 7574 -s "example/cloud/node2/solr" -z localhost:9983

Waiting up to 180 seconds to see Solr running on port 7574 [\]
Started Solr server on port 7574 (pid=35036). Happy searching!

INFO  - 2017-07-27 12:28:02.835; org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; Cluster at localhost:9983 ready

請注意,Solr 的兩個執行個體已在兩個節點上啟動。由於我們是以 SolrCloud 模式啟動,而且沒有定義任何關於外部 ZooKeeper 叢集的詳細資訊,Solr 會啟動自己的 ZooKeeper,並將兩個節點連接到它。

啟動完成後,系統會提示您建立一個集合,用於索引資料。

Now let's create a new collection for indexing documents in your 2-node cluster.
Please provide a name for your new collection: [gettingstarted]

這是我們第一次偏離預設選項的地方。本教學課程會要求您索引 Solr 附帶的一些範例資料,稱為「techproducts」資料。讓我們將我們的集合命名為「techproducts」,這樣可以很容易地與稍後建立的其他集合區分開來。在提示符號中輸入 techproducts,然後按下 Enter

How many shards would you like to split techproducts into? [2]

這裡會詢問您想要將索引分割到兩個節點上的多少個分片。「2」(預設值) 表示我們會將索引相對均勻地分割到兩個節點上,這是一個好的開始方式。請按下 Enter 接受預設值。

How many replicas per shard would you like to create? [2]

副本是索引的複本,用於容錯移轉(另請參閱Solr 詞彙表定義)。同樣地,預設的「2」也可以在這裡開始使用,因此請按下 Enter 接受預設值。

Please choose a configuration for the techproducts collection, available options are:
_default or sample_techproducts_configs [_default]

我們又到了另一個將偏離預設選項的地方。Solr 有兩組現成的範例設定檔(稱為 configset)。

集合必須具有 configset,其中至少包括 Solr 的兩個主要設定檔:綱要檔案(命名為 managed-schema.xmlschema.xml)和 solrconfig.xml。這裡的問題是您想要從哪個 configset 開始。_default 是一個精簡的選項,但請注意,有一個選項的名稱包含「techproducts」,與我們將集合命名的名稱相同。此 configset 是專門設計來支援我們想要使用的範例資料,因此請在提示符號中輸入 sample_techproducts_configs,然後按下 Enter

此時,Solr 會建立集合,並再次將它發出的命令輸出到畫面上。

Created collection 'techproducts' with 2 shard(s), 2 replica(s) with config-set 'techproducts'

SolrCloud example running, please visit: https://127.0.0.1:8983/solr

恭喜! Solr 已準備好接收資料!

您可以透過在網頁瀏覽器中啟動 Solr 管理 UI 來查看 Solr 是否正在執行:https://127.0.0.1:8983/solr/。這是管理 Solr 的主要起點。

Solr 現在將執行兩個「節點」,一個在 7574 連接埠上,另一個在 8983 連接埠上。有一個自動建立的集合,techproducts,這是一個具有兩個分片,每個分片有兩個副本的集合。

管理 UI 中的雲端索引標籤清楚地繪製了集合的圖表。

tutorial solrcloud
圖 1. SolrCloud 圖表

為 Techproducts 資料建立索引

您的 Solr 伺服器已啟動並執行,但它尚未包含任何資料,因此我們無法執行任何查詢。

Solr 包含 bin/solr post 工具,以便於輕鬆地為各種文件類型建立索引。我們將在以下索引範例中使用此工具。

您需要一個命令 shell 來執行以下一些範例,該 shell 紮根於 Solr 安裝目錄中;您啟動 Solr 的 shell 也可以正常工作。

我們要建立索引的資料位於 example/exampledocs 目錄中。這些文件採用混合的文件格式(JSON、CSV 等),幸運的是,我們可以一次為它們全部建立索引。

$ bin/solr post -c techproducts example/exampledocs/*

您應該會看到類似以下的輸出

Posting files to [base] url https://127.0.0.1:8983/solr/techproducts/update...
Entering auto mode. File endings considered are xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log
POSTing file books.csv (text/csv) to [base]
POSTing file books.json (application/json) to [base]/json/docs
POSTing file gb18030-example.xml (application/xml) to [base]
POSTing file hd.xml (application/xml) to [base]
POSTing file ipod_other.xml (application/xml) to [base]
POSTing file ipod_video.xml (application/xml) to [base]
POSTing file manufacturers.xml (application/xml) to [base]
POSTing file mem.xml (application/xml) to [base]
POSTing file money.xml (application/xml) to [base]
POSTing file monitor.xml (application/xml) to [base]
POSTing file monitor2.xml (application/xml) to [base]
POSTing file more_books.jsonl (application/json) to [base]/json/docs
POSTing file mp500.xml (application/xml) to [base]
POSTing file sample.html (text/html) to [base]/extract
POSTing file sd500.xml (application/xml) to [base]
POSTing file solr-word.pdf (application/pdf) to [base]/extract
POSTing file solr.xml (application/xml) to [base]
POSTing file test_utf8.sh (application/octet-stream) to [base]/extract
POSTing file utf8-example.xml (application/xml) to [base]
POSTing file vidcard.xml (application/xml) to [base]
20 files indexed.
COMMITting Solr index changes to https://127.0.0.1:8983/solr/techproducts/update...
Time spent: 0:00:00.822

再次恭喜!您的 Solr 中有資料了!

現在我們準備開始搜尋了。

基本搜尋

可以透過 REST 用戶端、curl、wget、Chrome POSTMAN 等,以及許多程式語言可用的原生用戶端來查詢 Solr。

Solr 管理 UI 包含一個查詢產生器介面,位於 techproducts 集合的「查詢」索引標籤中(位於https://127.0.0.1:8983/solr/#/techproducts/query)。如果您在表單中不進行任何變更的情況下按一下執行查詢按鈕,您將會以 JSON 格式取得 10 個文件。

Solr Quick Start: techproducts Query screen with results
圖 2. 查詢畫面

管理 UI 發送至 Solr 的 URL 顯示在上述螢幕擷取畫面右上方的淺灰色區域中。如果您按一下它,您的瀏覽器將會顯示原始回應。

若要使用 curl,請在命令列中以引號提供瀏覽器中顯示的相同 URL。

$ curl "https://127.0.0.1:8983/solr/techproducts/select?indent=on&q=*:*"

這裡發生的情況是,我們正在使用 Solr 的查詢參數 (q) 以及特殊語法,該語法請求索引中的所有文件 (*:*)。但是,並非所有文件都會傳回給我們,因為有一個稱為 rows 的參數預設值,您可以在表單中看到它是 10。您可以視需要在 UI 中或在預設值中變更此參數。

Solr 具有非常強大的搜尋選項,本教學課程無法涵蓋所有選項。但我們可以涵蓋一些最常見的查詢類型。

搜尋單一詞彙

若要搜尋詞彙,請在 Solr 管理 UI 的查詢畫面中,將其輸入為 q 參數值,並將 *:* 取代為您要尋找的詞彙。

輸入 "foundation" 並再次按一下執行查詢

如果您偏好使用 curl,請輸入類似以下的內容

$ curl "https://127.0.0.1:8983/solr/techproducts/select?q=foundation"

您會看到類似以下的內容

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":8,
    "params":{
      "q":"foundation"}},
  "response":{"numFound":4,"start":0,"maxScore":2.7879646,"docs":[
      {
        "id":"0553293354",
        "cat":["book"],
        "name":"Foundation",
        "price":7.99,
        "price_c":"7.99,USD",
        "inStock":true,
        "author":"Isaac Asimov",
        "author_s":"Isaac Asimov",
        "series_t":"Foundation Novels",
        "sequence_i":1,
        "genre_s":"scifi",
        "_version_":1574100232473411586,
        "price_c____l_ns":799}]
}}

回應指出有 4 個符合的項目 ("numFound":4)。我們在上述範例輸出中僅包含一個文件,但由於 4 個符合項目低於要傳回的 rows 參數預設值 10,因此您應該會看到全部 4 個文件。

請注意文件之前的 responseHeader。此標頭將包含您為搜尋設定的參數。依預設,它只會顯示您為此查詢設定的參數,在本例中,只有您的查詢詞彙。

我們取回的文件包括每個文件中已建立索引的所有欄位。這也是預設行為。如果您想要限制回應中的欄位,可以使用 fl 參數,此參數會採用以逗號分隔的欄位名稱清單。這是管理 UI 中查詢表單上可用的欄位之一。

在 "fl" 方塊中輸入 "id"(不含引號),然後再次按一下執行查詢。或者,使用 curl 指定它

$ curl "https://127.0.0.1:8983/solr/techproducts/select?q=foundation&fl=id"

您應該只會看到傳回的相符記錄 ID。

欄位搜尋

所有 Solr 查詢都會使用某個欄位來尋找文件。您通常想要同時跨多個欄位進行查詢,這就是我們目前使用 "foundation" 查詢所做的。這可透過使用複製欄位來實現,這些欄位已透過這組組態設定好。我們將在練習 2中稍微詳細地介紹複製欄位。

但是,有時您想要將查詢限制為單一欄位。這可以提高查詢的效率,並使結果對使用者更具相關性。

我們的小型範例資料集中的大部分資料都與產品相關。假設我們要尋找索引中所有 "electronics" 產品。在查詢畫面中,在 q 方塊中輸入 "electronics"(不含引號),然後按一下執行查詢。您應該會得到 14 個結果,例如

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":6,
    "params":{
      "q":"electronics"}},
  "response":{"numFound":14,"start":0,"maxScore":1.5579545,"docs":[
      {
        "id":"IW-02",
        "name":"iPod & iPod Mini USB 2.0 Cable",
        "manu":"Belkin",
        "manu_id_s":"belkin",
        "cat":["electronics",
          "connector"],
        "features":["car power adapter for iPod, white"],
        "weight":2.0,
        "price":11.5,
        "price_c":"11.50,USD",
        "popularity":1,
        "inStock":false,
        "store":"37.7752,-122.4232",
        "manufacturedate_dt":"2006-02-14T23:55:59Z",
        "_version_":1574100232554151936,
        "price_c____l_ns":1150}]
}}

此搜尋會尋找所有在已建立索引的欄位中任何位置包含詞彙 "electronics" 的文件。但是,我們從上方可以看到有一個 cat 欄位(代表「類別」)。如果我們將搜尋限制為只搜尋類別為 "electronics" 的文件,則結果將會更精確,更符合我們的使用者需求。

在管理 UI 的 q 欄位中更新您的查詢,使其為 cat:electronics。現在您會得到 12 個結果

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":6,
    "params":{
      "q":"cat:electronics"}},
  "response":{"numFound":12,"start":0,"maxScore":0.9614112,"docs":[
      {
        "id":"SP2514N",
        "name":"Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133",
        "manu":"Samsung Electronics Co. Ltd.",
        "manu_id_s":"samsung",
        "cat":["electronics",
          "hard drive"],
        "features":["7200RPM, 8MB cache, IDE Ultra ATA-133",
          "NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor"],
        "price":92.0,
        "price_c":"92.0,USD",
        "popularity":6,
        "inStock":true,
        "manufacturedate_dt":"2006-02-13T15:26:37Z",
        "store":"35.0752,-97.032",
        "_version_":1574100232511160320,
        "price_c____l_ns":9200}]
     }}

若使用 curl,此查詢看起來會像這樣

curl "https://127.0.0.1:8983/solr/techproducts/select?q=cat:electronics"

若要搜尋多詞彙語句,請將其括在雙引號中:q="multiple terms here"。例如,在管理 UI 的 q 方塊中輸入引號括住的 "CAS latency",以搜尋該語句。

如果您使用 curl 進行操作,請注意,詞彙之間的空格必須在 URL 中轉換為 "+",如下所示

$ curl "https://127.0.0.1:8983/solr/techproducts/select?q=\"CAS+latency\""

我們得到 2 個結果

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":7,
    "params":{
      "q":"\"CAS latency\""}},
  "response":{"numFound":2,"start":0,"maxScore":5.937691,"docs":[
      {
        "id":"VDBDB1A16",
        "name":"A-DATA V-Series 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - OEM",
        "manu":"A-DATA Technology Inc.",
        "manu_id_s":"corsair",
        "cat":["electronics",
          "memory"],
        "features":["CAS latency 3,   2.7v"],
        "popularity":0,
        "inStock":true,
        "store":"45.18414,-93.88141",
        "manufacturedate_dt":"2006-02-13T15:26:37Z",
        "payloads":"electronics|0.9 memory|0.1",
        "_version_":1574100232590852096},
      {
        "id":"TWINX2048-3200PRO",
        "name":"CORSAIR  XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail",
        "manu":"Corsair Microsystems Inc.",
        "manu_id_s":"corsair",
        "cat":["electronics",
          "memory"],
        "features":["CAS latency 2,  2-3-3-6 timing, 2.75v, unbuffered, heat-spreader"],
        "price":185.0,
        "price_c":"185.00,USD",
        "popularity":5,
        "inStock":true,
        "store":"37.7752,-122.4232",
        "manufacturedate_dt":"2006-02-13T15:26:37Z",
        "payloads":"electronics|6.0 memory|3.0",
        "_version_":1574100232584560640,
        "price_c____l_ns":18500}]
  }}

組合搜尋

依預設,當您在單一查詢中搜尋多個詞彙和/或語句時,Solr 只會要求其中一個詞彙或語句存在,文件才能符合。包含較多詞彙的文件會在結果清單中排序較高。

您可以要求詞彙或語句必須存在,方法是在其前面加上 +(加號);相反地,若要禁止詞彙或語句存在,請在其前面加上 -(減號)。

若要尋找同時包含詞彙 "electronics" 和 "music" 的文件,請在管理 UI 查詢索引標籤的 q 方塊中輸入 +electronics +music

如果您使用 curl,則必須編碼 ` 字元,因為它在 URL 中具有保留的用途(編碼空格字元)。` 的編碼為 %2B,如下所示

$ curl "https://127.0.0.1:8983/solr/techproducts/select?q=%2Belectronics%20%2Bmusic"

您應該只會得到單一結果。

若要搜尋包含詞彙 "electronics",但包含詞彙 "music" 的文件,請在管理 UI 的 q 方塊中輸入 electronics -music。若使用 curl,則再次將 ` 的 URL 編碼為 %2B,如下所示

$ curl "https://127.0.0.1:8983/solr/techproducts/select?q=%2Belectronics+-music"

這次您會得到 13 個結果。

關於搜尋的詳細資訊

我們僅略為介紹 Solr 中可用的搜尋選項。如需更多 Solr 搜尋選項,請參閱查詢語法和剖析器

練習 1 總結

此時,您已了解 Solr 如何為資料建立索引,並執行了一些基本查詢。您現在可以選擇繼續下一個範例,其中將介紹更多 Solr 概念,例如分面結果和管理您的結構描述,或者您可以自行探索。

如果您決定不繼續本教學課程,到目前為止我們已建立索引的資料可能對您沒有任何價值。您可以刪除您的安裝並重新開始,或者您可以使用我們開始使用的 bin/solr 指令碼來刪除此集合。

$ bin/solr delete -c techproducts

然後建立新的集合。

$ bin/solr create -c <yourCollection> -s 2 -rf 2

若要停止我們啟動的兩個 Solr 節點,請發出以下命令

$ bin/solr stop --all

如需有關使用 bin/solr 啟動/停止和集合選項的詳細資訊,請參閱Solr 控制指令碼參考