Solr入門學習(二)—— Solr 的基本查詢
Server : Ubuntu 16.04
Java Version : 1.8
Solr Version : 7.4.0
資料準備
Solr 剛剛安裝後,是沒有任何資料的,所以此時我們無法進行任何查詢。幸運的是,官方為使用者提供了索引工具以及樣本資料,方便新手快速建立索引。
首先,我們先看一下索引工具和樣本資料分別位於哪個位置。
- 索引工具:
/{solr_home}/bin/post
- 樣本資料:
/{solr_home}/example/exampledocs
在樣本資料中,包含了 json
、csv
、xml
、html
等多種格式的資料。儘管如此,官方提供的 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 的管理頁面,如下圖所示:
進行查詢前,我們首先要選擇集合。選中集合後,點選集合下的 Query
選項卡:
此時,頁面上會彈出如下圖所示的查詢視窗。點選 Execute Query
按鈕,即可在頁面右側看到 Solr 返回的資料。預設情況下,Solr 會以 JSON
格式返回 10 條記錄。
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
按鈕。此時,我們可以在頁面上看到如下結果:
如果想使用 url 方式完成相同的查詢,只需將預設的 q=*:*
替換成 q=foundation
即可。完整的 URL 為:http://localhost:8983/solr/testCollection/select?q=*:*
。
2. 欄位查詢
有時候,我們想通過某個欄位的值來查詢文件,正如我們當初使用 SQL 語句 select * from table where field = 'xxx'
查詢資料庫記錄一樣。此時,我們只需要將 q
引數預設的 *:*
改為 欄位名:欄位值
即可。
例如,我們現在在管理介面 q
引數輸入框中輸入 cat:electronics
,可以看到如下結果:
如果使用 url 完成此查詢,只需在瀏覽器輸入完整的 URL : http://localhost:8983/solr/testCollection/select?q=cat:electronics
。
3. 片語查詢
有時候,我們不僅想依賴於某個單詞來查詢文件,而是想通過片語(單詞間有空格)來完成查詢工作。如果此時我們想使用管理介面完成該查詢,首先要使用雙引號將片語包含起來,然後再輸入到輸入框中。
例如,我們輸入片語 "CAS latency"
,得到如下結果:
另一方面,如果我們想使用 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
來匹配同時包含electronics
和music
的文件。 - 通過加上字首
+
將多個查詢條件連線起來。例如,我們可以輸入+electronics +music
實現相同的查詢。
我們注意到,上述兩個組合查詢,都是用於查詢同時存在 electronics
和 music
的文件。但如果我們的需求發生變化了呢?比如說,我們現在希望能找到存在 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