1. 程式人生 > >搜尋引擎(Solr-搜尋詳解3)

搜尋引擎(Solr-搜尋詳解3)

開發十年,就只剩下這套架構體系了! >>>   

學習目標

掌握摺疊展開結果的用法;
掌握分組結果的用法;
瞭解solr支援的其他搜尋特性

 

摺疊展開結果

什麼是摺疊展開結果?

問:在商品搜尋中,當我們輸入關鍵字,搜尋到很多相關的商品文件,當結果中存在大量的同名商品時(不同賣家的),你是希望看到重複的商品羅列還是看到更多的不同商品(同名商品展示一個)?

摺疊結果,就是對搜尋結果根據某欄位的值進行分組去重。
展開結果:在返回結果中附帶上摺疊結果的展開列表

請看下面查詢的結果

http://localhost:8983/solr/techproducts/select?q=*:*&fq={!collapse%20field=price}&expand=true

Solr摺疊展開結果

Solr中通過Collapsing query parser 和 Expand component 的組合來提供根據某一欄位對搜尋結果進行摺疊、展開處理。Solr中還提供的結果分組元件也能實現摺疊功能,但如果僅是要做摺疊展開處理,摺疊展開結果效能要優些。

CollapsingQParser  其實是一個後置查詢過濾器,對搜尋結果根據指定的欄位進行摺疊處理。它需要的本地引數有:

field:指定摺疊欄位,必須是單值的String 、int 、float 型別的欄位。
min or max:通過min或max指定的數值欄位或函式查詢來選擇每個組的頭文件(取最大或最小值的文件)。min、max、sort只可用其一。
sort:指定組內排序規則來選擇排在第一的文件作為頭文件。預設是選取組中相關性評分最高的文件作為頭文件。
nullPolicy:對不包含摺疊欄位的文件採取什麼處理策略:
     ignore:忽略,預設選項。
     expand:獨立為一個組。
     collapse:摺疊為一個組。

摺疊結果示例

fq={!collapse field=group_field}
fq={!collapse field=group_field min=numeric_field}
fq={!collapse field=group_field max=numeric_field}
fq={!collapse field=group_field max=sum(cscore(),numeric_field)}
fq={!collapse field=group_field nullPolicy=collapse sort='numeric_field asc, score desc'}

Solr展開結果

如果你需要在結果中返回每個摺疊組的展開列表,在請求中加上引數 expand=true

q=*:*&fq={!collapse%20field=price}&expand=true

展開元件還支援如下引數:

expand.sort:組內排序規則,預設是相關性評分。
expand.rows:每組返回的文件數。預設5
還有 expand.q、expand.fq

 

結果分組

Solr結果分組

根據某個欄位對結果進行分組,每組返回一個頭文件。

http://localhost:8983/solr/techproducts/select?fl=id,name&q=solr+memory&group=true&group.field=manu_exact

結果分組請求引數說明:

group :true,對搜尋結果進行分組。
group.field :分組欄位,必須是單值、索引的欄位。
group.func:根據函式查詢結果值進行分組(分散式下不可用)。
group.query:指定分組的查詢語句,類似 facet.query。
rows:返回的分組數,預設10
start:分頁起始行
group.limit:每組返回的文件數,預設1。
group.offset:組內返回的文件的偏移量。
sort:如何排序組。
group.sort:組內排序規則
group.main:用分組結果中的文件作為主結果返回

Solr結果分組-示例

Grouping Results by Field    根據欄位進行分組

http://localhost:8983/solr/techproducts/select?fl=id,name&q=solr+memory&group=true&group.field=manu_exact

作為主結果返回

http://localhost:8983/solr/techproducts/select?fl=id,name,manufacturer&q=solr+memory&group=true&group.field=manu_exact&group.main=true

Grouping by Query 根據查詢進行分組

http://localhost:8983/solr/techproducts/select?indent=true&fl=name,price&q=memory&group=true&group.query=price:[0+TO+99.99]&group.query=price:[100+TO+*]&group.limit=3

 

其他搜尋特性介紹

Solr其他搜尋特性

Result clustering    結果聚合

http://lucene.apache.org/solr/guide/7_3/result-clustering.html

Spatial Search    地理空間搜尋

http://lucene.apache.org/solr/guide/7_3/spatial-search.html

Parallel SQL Interface   搜尋的SQL介面

http://lucene.apache.org/solr/guide/7_3/parallel-sql-interface.html