1. 程式人生 > >Solr入門學習(二)—— Solr 的基本查詢

Solr入門學習(二)—— Solr 的基本查詢

Server : Ubuntu 16.04
Java Version : 1.8
Solr Version : 7.4.0

資料準備

Solr 剛剛安裝後,是沒有任何資料的,所以此時我們無法進行任何查詢。幸運的是,官方為使用者提供了索引工具以及樣本資料,方便新手快速建立索引。

首先,我們先看一下索引工具和樣本資料分別位於哪個位置。

  • 索引工具:/{solr_home}/bin/post
  • 樣本資料:/{solr_home}/example/exampledocs

在樣本資料中,包含了 jsoncsvxmlhtml 等多種格式的資料。儘管如此,官方提供的 post 工具只需一個命令即可為上述多種格式的資料建立索引:

./post -c techproducts ../example/exampledocs/*

成功執行命令,我們看到以下資訊輸出:

SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/testCollection/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 monitor2.xml (application/xml) to [base]
POSTing file monitor.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 post.jar (application/octet-stream) to [base]/extract
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]
21 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/testCollection/update...
Time spent: 0:00:06.133

可以發現,已經有 21 份文件儲存到 Solr 當中,現在,我們可以使用 Solr 查詢資料了。


查詢方式

Solr 提供多種資料查詢方式,這裡僅介紹兩種。

1. Solr 管理介面查詢

Solr 啟動後,我們可以通過 http://localhost:8983/solr 訪問 Solr 的管理頁面,如下圖所示:

1

進行查詢前,我們首先要選擇集合。選中集合後,點選集合下的 Query 選項卡:

2

此時,頁面上會彈出如下圖所示的查詢視窗。點選 Execute Query 按鈕,即可在頁面右側看到 Solr 返回的資料。預設情況下,Solr 會以 JSON 格式返回 10 條記錄。

3

2. URL 查詢

實際上,Solr 管理頁面是通過 URL 的方式請求資料的。例如上例的查詢,轉成相應的 URL 就是 http://localhost:8983/solr/testCollection/select?q=*:*

在這個 URL 中,testCollection 表示集合名,select 表示查詢動作,引數 q 表示查詢條件。其中,引數 q 最為關鍵,它決定了哪些資料可以返回給使用者。

現在,我們在瀏覽器位址列中輸入這個 URL,即可得到 json 格式的資料。


查詢引數

除了上述提到的查詢條件 q,Solr 還有其他查詢引數,具體見下表:

引數名 描述
q 查詢條件,必填項
start 結果集第一條記錄的偏移位置,用於分頁,預設為 0
rows 返回文件的記錄數,用於分頁,預設為 10
sort 排序
fl 指定返回欄位,多個欄位用逗號或空格分隔,預設返回所有欄位
wt 指定輸出格式,例如xml、json等
fq 過濾查詢。該引數可將查詢的結果限定在某一範圍,由於 Solr 會對過濾查詢進行快取,因此它可以顯著提升複雜查詢的效率
hl 用於設定欄位的高亮顯示

運算子

與 SQL 相似,Solr 查詢語句中也包含運算子,具體見下表:

運算子 說明
: 指定欄位目標值,等同於 SQL 中的 “=” 號
? 萬用字元,替代任意單個字元
* 萬用字元,替代任意多個字元
AND 表示且,等同於 “&&”
OR 表示或,等同於 “||”
NOT 表示否
() 用於構成子查詢
[] 範圍查詢,包含頭尾
{} 範圍查詢,不包含頭尾
+ 存在運算子,表示文件中必須存在 “+” 號後的項
- 不存在運算子,表示文件中不包含 “-” 號後的項

查詢示例

1. 關鍵詞查詢

如果我們想在 Solr 中查詢包含某個關鍵詞 foundation 的文件,可以直接在管理介面的 q 引數輸入框中輸入該關鍵詞,然後點選 Execute Query 按鈕。此時,我們可以在頁面上看到如下結果:

4

如果想使用 url 方式完成相同的查詢,只需將預設的 q=*:* 替換成 q=foundation 即可。完整的 URL 為:http://localhost:8983/solr/testCollection/select?q=*:*

2. 欄位查詢

有時候,我們想通過某個欄位的值來查詢文件,正如我們當初使用 SQL 語句 select * from table where field = 'xxx' 查詢資料庫記錄一樣。此時,我們只需要將 q 引數預設的 *:* 改為 欄位名:欄位值 即可。

例如,我們現在在管理介面 q 引數輸入框中輸入 cat:electronics,可以看到如下結果:

5

如果使用 url 完成此查詢,只需在瀏覽器輸入完整的 URL : http://localhost:8983/solr/testCollection/select?q=cat:electronics

3. 片語查詢

有時候,我們不僅想依賴於某個單詞來查詢文件,而是想通過片語(單詞間有空格)來完成查詢工作。如果此時我們想使用管理介面完成該查詢,首先要使用雙引號將片語包含起來,然後再輸入到輸入框中。

例如,我們輸入片語 "CAS latency",得到如下結果:

6

另一方面,如果我們想使用 url 完成相同的查詢,就需要對空格進行處理。一般來說,有兩種處理方式:

  • 對空格進行編碼,即把 轉換為 %20,相應的 URL 為:http://localhost:8983/solr/testCollection/select?q="CAS%20latency"
  • 把空格替換為 + 號,對應的 URL 為:http://localhost:8983/solr/testCollection/select?q="CAS+latency"
4. 組合查詢

假如我們希望得到同時匹配多個關鍵詞的文件,這時候,我們該怎麼做?Solr 的組合查詢可以滿足我們的需求。這裡介紹兩種實現組合查詢的方法:

  • 使用運算子 AND 將多個查詢條件連線起來。例如,我們通過輸入 electronics AND music 來匹配同時包含 electronicsmusic 的文件。
  • 通過加上字首 + 將多個查詢條件連線起來。例如,我們可以輸入 +electronics +music 實現相同的查詢。

我們注意到,上述兩個組合查詢,都是用於查詢同時存在 electronicsmusic 的文件。但如果我們的需求發生變化了呢?比如說,我們現在希望能找到存在 electronics 但是不存在 music 的文件,那麼,我們該怎麼做?

同樣地,有兩種方式:

  • 使用運算子 NOT 排除關鍵詞。例如,我們通過輸入 electronics NOT music 來匹配包含 electronics 但是不包含 music 的文件。
  • 利用字首 - 排除關鍵詞。例如,我們可以輸入 +electronics -music 達到同樣的目的。

這裡需要注意的一點是,如果我們要用 url 的方式來實現組合查詢,那麼在使用 + 號的時候必須對其進行編碼。正如我們在片語查詢中提到的,+ 號在 url 中表示空格的含義,因此需要使用其對應的編碼 %2B 來讓 url 識別 + 號本身的運算邏輯。


更多查詢

除了上面的基本查詢,Solr 還有更多的查詢示例。這裡我們僅作簡單展示,不予深入說明。

  • 指定返回欄位 id
http://localhost:8983/solr/testCollection/select?q=${keyword}&fl=id
  • 分頁查詢
http://localhost:8983/solr/testCollection/select?q=${keyword}&start=0&row=100
  • 根據欄位 id 排序
http://localhost:8983/solr/testCollection/select?q=${keyword}&sort=id+asc
  • 指定返回格式為 XML
http://localhost:8983/solr/testCollection/select?q=${keyword}&wt=xml
  • 返回某一時間範圍內的資料
http://localhost:8983/solr/testCollection/select?q=time:%5B20180903+TO+20180904%5D

參考文章