天天看點

solr常用檢索查詢業務demo概述基礎任意查詢功能demo全量比對與導出demo聚合統計小結

概述

本文針對已經入門的同學,提供各種類型的場景查詢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常用檢索查詢業務demo概述基礎任意查詢功能demo全量比對與導出demo聚合統計小結

阿裡雲栖社群搜尋”solr”關鍵字的結果展示中,除了出現右邊的相關文章清單外,還對所有比對solr關鍵字的結果,進行一個分類統計,例如左上角的框框中,展示這些相關的文章中,部落格、問答、聚能聊等主題的比對條數,如果使用者此時需要的是問答相關的文章,那麼他就可以快速點選這個問答的tab進一步搜尋想要的内容,進而提升了使用者搜尋體驗。

實作方式可以參考

中SolrQueryDemo.java的 facetRangeDemo、facetFieldDemo 兩個示例,可以自定義各種類型的查詢,來對比對結果的二次分類統計。

小結

本文整理了常用的solr 查詢demo代碼,以及部分需要分析統計的查詢示例,如有其他查詢需求與疑問,可以留言提問,後續更新可以增加上,友善其他使用者拿來即用。

繼續閱讀