1. 程式人生 > >Solr分面搜尋(Faceting)

Solr分面搜尋(Faceting)

分面搜尋(faceting)是基於索引詞,將搜尋結果組織到不同的分類(categories)中。表示為索引詞(terms),以及一個數值代表各個詞匹配的文件數。

*分面的欄位屬性:indexed或docValues之一必須為true, 但不是都必須為true. docValues在很多情況下更高效。

(1) 通用引數


- facet
"true" 啟用faceting計數。
"false"或blank或missing value, 不啟用faceting, 預設值是blank.

- facet.query      
可以指定Lucene語法形式的任意query來生成faceting計數。預設,自動檢查欄位的唯一term並返回計數。
使用facet.query來覆蓋預設行為,並精確指定你希望計數的詞或正則式。典型的實現中,你可以指定多個facet.query引數。
此引數對於基於數值範圍(numeric-range-based)和基於字首(prefix-based)的分面尤為有用。

(2) 欄位-值Faceting引數

有若干引數可以用來觸發在指定欄位的term上進行faceting.

對於文字(text)欄位, 如果包含分詞等處理,處理後的term可能不是你想要的。如果你想要solr對文字欄位既分析(搜尋),又做分面處理,使用copyField對欄位建立兩個版本:一個Text和一個String.

- facet.field       

指定分面欄位,可多次指定。至少指定一個,其他引數才有效果。

- facet.prefix      
限制分面term為指定字首。
 
按欄位指定引數(下同):f.<fieldname>.facet.prefix 

- facet.contains
限制分面term為包含指定子串(substring)

- facet.contains.ignoreCase    
使用facet.contains時,忽略子串大小寫

- facet.sort
count 按計數排序,最高的在前。
index 按字元順序。

如果facet.limit大於0,預設為count; 否則預設為index

- facet.limit
預設值為100, 負值表示不限.
 
- facet.offset 
預設值0

- facet.mincount
預設值0

- facet.missing
如果設定為true, 會返回匹配查詢但沒有facet的所有結果的計數。
預設為false.

- facet.method
faceting的演算法或方法
enum  列舉欄位的所有term,計算匹配term的文件和查詢結果文件的交集。推薦用於multi-valued且只有少數值的欄位。
fc    (field cache)遍歷查詢結果文件並計數。目前的實現是使用一個非倒排欄位快取,如果欄位既非多值也非tokenized. 
                   對於多值欄位,使用filterCache的term filters.
fcs   用於single-valued string欄位.

預設是fc.

- facet.enum.cache.minDF (Advanced) 
僅用於facet.method=enum時,指定filterCache使用的最小文件頻率。預設值為0
可以減小記憶體使用,但增加處理時間。

- Over-Request引數
在Solr分散式查詢中,每個分片預設請求 top "10+(1.5 * facet.limit)" 的facets. 
facet.overrequest.count 預設10
facet.overrequest.ratio 預設1.5

- facet.threads (Advanced) 
facet.threads=N, N個執行緒被使用。
0或忽略,只有主執行緒。
負數,最大Integer.MAX_VALUE個執行緒。

(3) 範圍切面(Range Faceting)
你可以在任何的日期和數值欄位上使用Range Faceting.

- facet.range
指定欄位。
facet.range=price&facet.range=age
facet.range=lastModified_dt

- facet.range.start
f.price.facet.range.start=0.0&f.age.facet.range.start=10
f.lastModified_dt.facet.range.start=NOW/DAY-30DAYS

- facet.range.end
f.price.facet.range.end=1000.0&f.age.facet.range.start=99
f.lastModified_dt.facet.range.end=NOW/DAY+30DAYS

- facet.range.gap
f.price.facet.range.gap=100&f.age.facet.range.gap=10
f.lastModified_dt.facet.range.gap=+1DAY

- facet.range.hardend
true, 最後一個範圍以facet.range.end結束。
false, 最後一個範圍以gap寬度的上限結束。

- facet.range.include
lower, 預設,[lower, upper)
upper, (lower, upper]
edge, 第一個和最後一個range包含邊界
outer, "before"和"after"包含邊界
all,  包括lower, upper, edge, outer

可以指定多次。

- facet.range.other
除了匹配的範圍之外,還應計數:
before,  第一個range之前的記錄
after,   最後一個range之後的記錄
between, 在start和end之間的所有記錄
none,    不計數
all,     包括:before,after,between

除all之外,可以多次指定,但none會覆蓋其他引數。

- facet.range.method
filter, 預設,使用filterCache
dv,     這種方法可利用docValues.

-  facet.mincount
小於指定計數的範圍不會返回

(4) Date切面引數 

棄用(deprecated), 參見range facet

(5) 支點(決策樹)分面 Pivot (Decision Tree) Faceting


Pivoting是一個彙總工具,能自動對資料進行排序,計數,求總數和平均。結果通常顯示在第二張表中,顯示彙總資料。

從另一個角度看,查詢產生了一個決策樹(Decision Tree), Solr告訴你"對facet A, 約束/計數為X/N, Y/M, 等. 如果約束A為X, 那麼B約束計數為S/P, T/Q, 等"
換句話說,如果限定當前的facet結果,那麼將提前告訴你欄位的下一個facet結果結合。

- facet.pivot
指定pivot欄位,多個欄位用逗號隔開。

- facet.pivot.mincount
最小數結果數,預設為1.

- Combining Stats Component With Pivots
stats=true
stats.field={!tag=piv1,piv2 min=true max=true}price  # 統計最大值,最小值
stats.field={!tag=piv2 mean=true}popularity          # 平均值
facet=true
facet.pivot={!stats=piv1}cat,inStock
facet.pivot={!stats=piv2}manu,inStock

- Combining Facet Queries And Facet Ranges With Pivot Facets
facet=true
facet.query={!tag=q1}manufacturedate_dt:[2006-01-01T00:00:00Z TO NOW]
facet.query={!tag=q1}price:[0 TO 100]
facet.pivot={!query=q1}cat,inStock

facet=true
facet.range={!tag=r1}manufacturedate_dt
facet.range.start=2006-01-01T00:00:00Z
facet.range.end=NOW/YEAR
facet.range.gap=+1YEAR
facet.pivot={!range=r1}cat,inStock

(6) 區間分面(Interval Faceting)

Interval Faceting聽起來像範圍分面(range faceting), 但此功能更接近使用了範圍查詢的分面查詢。

- facet.interval
指定欄位,可多次指定。
facet.interval=price&facet.interval=size

- facet.interval.set
指定欄位的區間值,可多次指定。
f.price.facet.interval.set=[0,10]&f.price.facet.interval.set=(10,100]

Interval語法:

(1,10]
[1,10)
[1,10]
(*,5]
(*,*)
[Abc, Bbc]

改變輸出的key名稱:
&facet.interval={!key=popularity}some_field 
&facet.interval.set={!key=bad}[0,5] 
&facet.interval.set={!key=good}[5,*]
&facet=true

(7) Faceting的本地(定製)引數

- Tagging和Excluding過濾器

下面的查詢,faceting時除doctype:pdf之外的結果全部是0:
q=mainquery&fq=status:public&fq=doctype:pdf&facet=true&facet.field=doctype

下面的查詢,Faceting時排除(不考慮)filterQuery:
q=mainquery&fq=status:public&fq={!tag=dt}doctype:pdf&facet=true&facet.field={!ex=dt}doctype

(8) Related Topics

SimpleFacetParameters
Heatmap Faceting (Spatial)

(9) BlockJoin Faceting

如果一個父文件有幾個子文件,它們對於Faceting只需要計數1次,通過父文件聚合子文件計數是一個通用的需求。

BlockJoinFacetComponent和BlockJoinDocSetFacetComponent這兩個效能有所差異的搜尋元件提供了此功能。

相關推薦

Solr搜尋(Faceting)

分面搜尋(faceting)是基於索引詞,將搜尋結果組織到不同的分類(categories)中。表示為索引詞(terms),以及一個數值代表各個詞匹配的文件數。 *分面的欄位屬性:indexed或docValues之一必須為true, 但不是都必須為true. docVal

Solr搜尋結果不準確

Solr的schema.xml預設配置分詞後條件取 OR 例如:大眾1.6T  系統會自動分詞為  【大眾】 【1.6T】(ps:不同分詞器分詞效果不同)   會搜尋出包含 【大眾 OR  1.6T】 的結果。 想要讓Solr搜尋預設為    【大眾 AND 1.6T

Solr---Facet查詢中時間區間面的坑

場景描述:        上一篇分面查詢文章中,我們提到了時間區間分面,但是在使用的過程中,遇到了很坑的事情,那就是時區。        如果忽視時區,直接設定時間,時間分面查詢的結果。很自然的你會設定起始時間都為該月1號00:00:00,但是因為時區的問題,在Solrj處理

[solr 管理界] - 索引數據刪除

with 否則 update let post數據 clas del pan 事務 刪除solr索引數據,使用XML有兩種寫法: 1) <delete><id>1</id></delete> <commit/>

solr布式索引【實戰一、分片配置讀取:工具類configUtil.java,讀取配置代碼片段,配置實例】

hset fileinput string lose eas hash hashset mod bject 1 private static Properties prop = new Properties(); 2 3 private stati

solr管理界下統計多個時間段的數據 facet.query

span 情況 tro -s amp 多個 round cnblogs alt 在Raw Query Parameters參數裏面輸入時間段即可 如下圖所示: facet.query=publishTime:[2017-06-05T00:00:00Z TO 2017-06-

(二)Solr——Solr介紹

內存 刪除索引 宋體 cal 修改 data 編碼 commit 創建 1. Dashboard 儀表盤,顯示了該Solr實例開始啟動運行的時間、版本、系統資源、jvm等信息。 2. Logging Solr運行日誌信息 3. Cloud Cloud即Solr

Lucene筆記12-Lucene的搜尋-複習和再查詢搜尋

一、Lucene的分頁搜尋 Lucene的分頁不像資料庫中的limit的方式,而是提供了一種“再查詢”的方式。什麼是“再查詢”呢?就是第一次把所有的資料都取出來,第二次查詢再根據需求,從第幾條取到第幾條,分兩步進行查詢,所以叫“再查詢”。 二、測試程式碼 package com.ws

ElasticSearch最佳入門實踐(三十五)搜尋以及deep paging效能問題深度揭祕

1、如何使用es進行分頁搜尋的語法 size,from GET /_search?size=10 GET /_search?size=10&from=0 GET /_search?size=10&from=20 假設將這6條資料分成3頁,每一頁是2

ggplot2_`facet_xxx()`系統

作者:Li_Yuhui 四川大學研究生在讀 本文是ggplot2_視覺化_速成的第4節 第2節:coor_xxx()座標系變換 第3節:scale_xxx()標度調整 第5節:Guides圖例與增加座標軸 第6節:themes主題系統 文章目錄

《商城專案05》--用Solr實現商品搜尋功能

一, Solr的安裝配置 1, 下載資源  (solr-4.10.3.tgz.tgz) 貼個連結參考:  連結:https://pan.baidu.com/s/1rMkFTdoSALB8Q-7jCcb4YA  提取碼:6ken   

solr站內搜尋之suggest和詞頻統計

solr站內搜尋與詞頻統計 一、suggest關鍵字搜尋(帶聯想建議提示功能) 二、autocompleter外掛的使用 三、詞頻統計   package com.product.pojo; import java.io.Serializable; import java.util

TP5 自帶搜尋功能實現

HTML部分: <form class="layui-form" > <div class="layui-form-item"> <label class="la

1110 Complete Binary Tree (25 )(搜尋)

1110 Complete Binary Tree (25 分) Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each input file co

Solr實現商城搜尋高亮顯示

package com.pinyougou.search.service.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; im

solr極速搜尋

一 。solr簡介 solr是以lucene為核心開發的企業級搜尋應用 應用程式可以通過http請求方式來提交索引,查詢索引,提供了比lucene更豐富的查詢語言,是 一個高效能,高可用環境全文搜尋引擎 二 。solr安裝配置 1》下載solr安裝包 solr所有版本

SSM+solr 通過商品搜尋學習solr的簡單使用

  學習了一下https://github.com/TyCoding/ssm-redis-solr這個github上的solr搜尋功能,現在來記錄一下。 我的理解就是solr有點類似於資料庫,但它是有索引的資料庫,按很多欄位建立索引,可能是b+樹或者雜湊索引,然後就能夠實現海量資料的查詢。sol

ComboGrid(資料表格下拉框)[頁+搜尋+多選]

注意:後臺控制層接收該控制元件的引數名必須是  //likeName:根據需求可有可無需要模糊條件查詢時新增 (String likeName,Integer page, Integer rows

solr頁查詢和高亮

二、Solr理論 1、 solr基礎 因為 Solr 包裝並擴充套件了 Lucene,所以它們使用很多相同的術語。更重要的是,Solr 建立的索引與 Lucene 搜尋引擎庫完全相容。通過對 Solr 進行適當的配置,某些情況下可能需要進行編碼,Solr 可以閱讀和使

thymeleaf實現簡單的條件搜尋搜尋功能

首先看一下模板: 大致就是可以通過上面的某個或者多個條件實現按條件分頁搜尋的功能。因為前端介面用的是HTML並沒有用jsp所以沒辦法使用c:標籤,那麼怎麼通過thymeleaf實現jsp的功能呢? 好吧看一下程式碼: <form th:action="@{/per