概述
本文針對已經入門的同學,提供各種類型的場景查詢demo,以及一些分析統計型的查詢demo。
如果未接觸過solr的同學,可以先參考
Solr快速入門文檔閱讀推薦文章快速入門學習一下solr。
本demo積累為企業使用者使用咨詢時整理的,并不是特别多,正因如此,說明大部分企業查詢檢索功能都是solr的基礎功能,上手簡單。還有少許排序導出、分析統計的demo。
基礎任意查詢功能demo
下載下傳git項目
aliyun-apsaradb-hbase-demo,在solr子產品中,包含了常用的每種簡單查詢SolrJ api使用方式,還有cursor分頁、facet統計等demo,可以基于此直接改造使用者業務合适的查詢邏輯使用。
資料準備:
- 建立collection
- 使用SolrAddDocumentDemo.java示例插入100行示例資料
SolrQueryDemo.java包含的查詢demo清單:
- match all query 全比對查詢
- term query 詞彙精确查詢
- wildcard query 通配符查詢
- fuzzy query 模糊查詢
- phrase query 短語查詢
- proximity query 鄰近查詢
- range query 範圍查詢
- multi condition query 多條件任意組合
- pagination 正常分頁與cursor深翻
- facet統計&function query等
全量比對與導出demo
以下兩個demo使用預先插入資料如下
{"id":"1","group_s":"group1","test_i":"5","test_l":"10"},
{"id":"2","group_s":"group1","test_i":"5","test_l":"1000"},
{"id":"3","group_s":"group1","test_i":"5","test_l":"1000"},
{"id":"4","group_s":"group1","test_i":"10","test_l":"10"},
{"id":"5","group_s":"group2","test_i":"5","test_l":"10"},
{"id":"6","group_s":"group2","test_i":"5","test_l":"10"},
{"id":"7","group_s":"group2","test_i":"5","test_l":"1000"},
{"id":"8","group_s":"group2","test_i":"5","test_l":"1000"},
{"id":"9","group_s":"group2","test_i":"10","test_l":"10"},
{"id":"10","group_s":"group3","test_i":"4","test_l":"7"},
{"id":"11","group_s":"group3","test_i":"3","test_l":"9"}
Demo1 全量導出複雜條件并帶排序的比對結果資料集合
例如:某公司400億資料根據各種比對條件,并按照時間排序導出結果資料清單,再提供第三方機構二次利用。
CloudSolrClient solrClient = new CloudSolrClient.Builder().withZkHost("localhost:9983").withZkChroot("/").build();
String collection = "test";
String currentMark = null;
String nextCursorMark = CursorMarkParams.CURSOR_MARK_START;
do {
currentMark = nextCursorMark;
SolrQuery solrQuery = new SolrQuery("test_i:5 AND test_l:[999 TO *]");
solrQuery.setParam("sort","test_i desc,id desc");
solrQuery.add(CursorMarkParams.CURSOR_MARK_PARAM, currentMark);
solrQuery.setRows(1);
QueryResponse response = solrClient.query(collection, solrQuery);
nextCursorMark = response.getNextCursorMark();
System.out.println(response);
} while (!nextCursorMark.equals(currentMark));
solrClient.close();
Demo2 分組後取每個分組取min test_i的一條記錄,并全量導出所有group
public static void main(String[] args) throws Exception{
CloudSolrClient solrClient = new CloudSolrClient.Builder().withZkHost("localhost:9983").withZkChroot("/").build();
String collection = "test";
String currentMark = null;
String nextCursorMark = CursorMarkParams.CURSOR_MARK_START;
do {
currentMark = nextCursorMark;
SolrQuery solrQuery = new SolrQuery("*:*");
solrQuery.setParam("fq","{!collapse field=group_s sort=$sort}");
solrQuery.setParam("sort","test_i desc,id asc");
solrQuery.add(CursorMarkParams.CURSOR_MARK_PARAM, currentMark);
solrQuery.setRows(1);
QueryResponse response = solrClient.query(collection, solrQuery);
nextCursorMark = response.getNextCursorMark();
System.out.println(response);
} while (!nextCursorMark.equals(currentMark));
solrClient.close();
}
聚合統計
{"id":"1","group_s":"group1","test_i":"5","test_l":"10"},
{"id":"2","group_s":"group1","test_i":"5","test_l":"1000"},
{"id":"3","group_s":"group1","test_i":"5","test_l":"1000"},
{"id":"4","group_s":"group1","test_i":"10","test_l":"10"},
{"id":"5","group_s":"group2","test_i":"5","test_l":"10"},
{"id":"6","group_s":"group2","test_i":"5","test_l":"10"},
{"id":"7","group_s":"group2","test_i":"5","test_l":"1000"},
{"id":"8","group_s":"group2","test_i":"5","test_l":"1000"},
{"id":"9","group_s":"group2","test_i":"10","test_l":"10"},
{"id":"10","group_s":"group3","test_i":"4","test_l":"7"},
{"id":"11","group_s":"group3","test_i":"3","test_l":"9"}
Demo1 求min、max、avg、sum,單個field 與多個條件function處理的case
最大值如下:
curl "http://localhost:8983/solr/test/query" -d 'q=*:*&rows=0&json.facet={x:"max(sub(test_l,test_i))"}'
平均值如下:
curl "http://localhost:8983/solr/test/query" -d 'q=*:*&rows=0&json.facet={x:"avg(sub(test_l,test_i))"}'
其中sub(test_l,test_i)即為 "test_l - test_i"的意思,更多函數可以參考
Solr官方文檔function Query部分Demo2 針對結果進行facet分類統計,做側邊導航
需求背景為常見的部落格、電商網站搜尋欄,輸入關鍵字後,除了比對結果清單給使用者展示外,對這些結果能進行二次分類統計,作為二次導航,友善使用者快速搜尋更相關的内容。場景如下圖:

阿裡雲栖社群搜尋”solr”關鍵字的結果展示中,除了出現右邊的相關文章清單外,還對所有比對solr關鍵字的結果,進行一個分類統計,例如左上角的框框中,展示這些相關的文章中,部落格、問答、聚能聊等主題的比對條數,如果使用者此時需要的是問答相關的文章,那麼他就可以快速點選這個問答的tab進一步搜尋想要的内容,進而提升了使用者搜尋體驗。
實作方式可以參考
中SolrQueryDemo.java的 facetRangeDemo、facetFieldDemo 兩個示例,可以自定義各種類型的查詢,來對比對結果的二次分類統計。
小結
本文整理了常用的solr 查詢demo代碼,以及部分需要分析統計的查詢示例,如有其他查詢需求與疑問,可以留言提問,後續更新可以增加上,友善其他使用者拿來即用。