詞彙元件
詞彙元件提供存取欄位中已索引的詞彙以及符合每個詞彙的文件數。這對於建置自動建議功能或任何其他在詞彙層級而非搜尋或文件層級運作的功能非常有用。以索引順序擷取詞彙非常快速,因為實作直接使用 Lucene 的 TermEnum 來迭代詞彙字典。
從某種意義上說,此搜尋元件在整個索引上提供快速欄位分面,不受基本查詢或任何篩選器限制。傳回的文件頻率是符合該詞彙的文件數,包括任何已標示為刪除但尚未從索引中移除的文件。
設定詞彙元件
詞彙元件是預設搜尋元件之一,不需要在 solrconfig.xml
中定義。
定義等同於
<searchComponent name="terms" class="solr.TermsComponent"/>
在請求處理器中使用詞彙元件
Solr 隨附隱含請求處理器定義 /terms
,它會啟用(僅限)詞彙元件。
如果您想在使用另一個請求處理器時啟用詞彙元件,則需要在請求期間傳遞 terms=true
參數,或在處理器的預設值中設定。
詞彙元件參數
以下參數可讓您控制傳回的詞彙。您也可以使用請求處理器設定任何這些參數,如果您想永久設定它們。或者,您可以將它們新增至查詢請求。這些參數是
terms
-
選用
預設值:
false
如果設定為
true
,則啟用詞彙元件。範例:
terms=true
terms.fl
-
必要
預設值:無
指定要從中擷取詞彙的欄位。如果
terms=true
,則此參數為必要。可以多次指定此參數,以擷取不同欄位的詞彙。範例:
terms.fl=title
範例:
terms.fl=title&terms=true&terms.fl=name&terms.list=cable,sony
<response>
<lst name="responseHeader">
<bool name="zkConnected">true</bool>
<int name="status">0</int>
<int name="QTime">4</int>
</lst>
<lst name="terms">
<lst name="name">
<int name="cable">8661</int>
<int name="sony">21</int>
</lst>
<lst name="title">
<int name="cable">11387</int>
<int name="sony">3921</int>
</lst>
</lst>
</response>
terms.list
-
選用
預設值:無
擷取以逗號分隔的詞彙清單的文件頻率。詞彙一律以索引順序傳回。如果
terms.ttf
設定為true
,也會傳回它們的總詞彙頻率。如果定義了多個terms.fl
,則會針對每個請求欄位中的每個詞彙傳回這些統計資料。範例:
terms.list=termA,termB,termC
指定 terms.list
時,詞彙一律會依index
排序。除了terms.ttf
之外,指定terms.list
時不支援其他詞彙參數。 terms.limit
-
選用
預設值:
10
指定要傳回的最大詞彙數。如果限制設定為小於
0
的數字,則不強制執行最大限制。雖然這不是必要的,但必須定義此參數或terms.upper
。範例:
terms.limit=20
terms.lower
-
選用
預設值:請參閱說明
指定開始的詞彙。如果未指定,則使用空字串,導致 Solr 從欄位的開頭開始。
範例:
terms.lower=orange
terms.lower.incl
-
選用
預設值:
true
如果設定為
true
,則包含結果集中以terms.lower
指定的下限詞彙。範例:
terms.lower.incl=false
terms.mincount
-
選用
預設值:
1
指定要返回的最小文件頻率,以便將詞彙包含在查詢回應中。結果包含 mincount(即,>= mincount)。
範例:
terms.mincount=5
terms.maxcount
-
選用
預設值:
-1
指定詞彙必須具有的最大文件頻率,才能包含在查詢回應中。預設設定為
-1
,表示沒有上限。結果包含 maxcount(即,<= maxcount)。範例:
terms.maxcount=25
terms.prefix
-
選用
預設值:無
將匹配限制為以指定字串開頭的詞彙。
範例:
terms.prefix=inter
terms.raw
-
選用
預設值:
false
如果設定為
true
,則返回索引詞彙的原始字元,無論它是否為人類可讀。例如,數字的索引形式不是人類可讀的。範例:
terms.raw=true
terms.regex
-
選用
預設值:無
將匹配限制為與正規表達式匹配的詞彙。
範例:
terms.regex=.*pedist
terms.regex.flag
-
選用
預設值:無
定義在評估以
terms.regex
定義的正規表達式時要使用的 Java 正規表達式旗標。請參閱 http://docs.oracle.com/javase/tutorial/essential/regex/pattern.html 以了解每個旗標的詳細資訊。有效的選項包括-
case_insensitive
-
comments
-
multiline
-
literal
-
dotall
-
unicode_case
-
canon_eq
-
unix_lines
範例:
terms.regex.flag=case_insensitive
-
terms.stats
-
選用
預設值:
false
如果為
true
,則在結果中包含索引統計資訊。目前僅返回集合的文件數。當與terms.list
結合使用時,它提供足夠的資訊來計算詞彙列表的反向文件頻率 (IDF)。 terms.sort
-
選用
預設值:
count
定義如何對返回的詞彙進行排序。有效的選項為
count
,它會按詞彙頻率排序,詞彙頻率最高的排在最前面,或是index
,它會按索引順序排序。範例:
terms.sort=index
terms.ttf
-
選用
預設值:
false
如果設定為
true
,則針對terms.list
中每個請求的詞彙返回df
(docFreq) 和ttf
(totalTermFreq) 統計資訊。在這種情況下,回應格式為XML
<lst name="terms"> <lst name="field"> <lst name="termA"> <long name="df">22</long> <long name="ttf">73</long> </lst> </lst> </lst>
JSON
{ "terms": { "field": [ "termA", { "df": 22, "ttf": 73 } ] } }
terms.upper
-
選用
預設值:無
指定停止的詞彙。雖然此參數不是必需的,但必須定義此參數或
terms.limit
。範例:
terms.upper=plum
terms.upper.incl
-
選用
預設值:
false
如果設定為 true,則上限詞彙會包含在結果集中。
範例:
terms.upper.incl=true
對詞彙請求的回應是詞彙及其文件頻率值的列表。
您可能也會對 TermsComponent javadoc 感興趣。
詞彙元件範例
以下所有範例查詢都適用於 Solr 的 "bin/solr start -e techproducts" 範例。
取得前 10 個詞彙
此查詢請求 name 欄位中的前十個詞彙
https://127.0.0.1:8983/solr/techproducts/terms?terms.fl=name&wt=xml
結果
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">2</int>
</lst>
<lst name="terms">
<lst name="name">
<int name="one">5</int>
<int name="184">3</int>
<int name="1gb">3</int>
<int name="3200">3</int>
<int name="400">3</int>
<int name="ddr">3</int>
<int name="gb">3</int>
<int name="ipod">3</int>
<int name="memory">3</int>
<int name="pc">3</int>
</lst>
</lst>
</response>
取得以字母 'a' 開頭的前 10 個詞彙
此查詢請求 name 欄位中的前十個詞彙,按索引順序排列(而不是按文件計數的前 10 個結果)
https://127.0.0.1:8983/solr/techproducts/terms?terms.fl=name&terms.lower=a&terms.sort=index&wt=xml
結果
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
</lst>
<lst name="terms">
<lst name="name">
<int name="a">1</int>
<int name="all">1</int>
<int name="apple">1</int>
<int name="asus">1</int>
<int name="ata">1</int>
<int name="ati">1</int>
<int name="belkin">1</int>
<int name="black">1</int>
<int name="british">1</int>
<int name="cable">1</int>
</lst>
</lst>
</response>
在請求處理常式中使用詞彙元件
此查詢使用詞彙資訊擴充常規搜尋。
https://127.0.0.1:8983/solr/techproducts/select?q=corsair&fl=id,name&rows=1&echoParams=none&wt=xml&terms=true&terms.fl=name
結果(請注意,詞彙計數不受查詢影響)
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
</lst>
<result name="response" numFound="2" start="0" numFoundExact="true">
<doc>
<str name="id">VS1GB400C3</str>
<str name="name">CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail</str></doc>
</result>
<lst name="terms">
<lst name="name">
<int name="one">5</int>
<int name="184">3</int>
<int name="1gb">3</int>
<int name="3200">3</int>
<int name="400">3</int>
<int name="ddr">3</int>
<int name="gb">3</int>
<int name="ipod">3</int>
<int name="memory">3</int>
<int name="pc">3</int>
</lst>
</lst>
</response>
SolrJ 呼叫
SolrQuery query = new SolrQuery();
query.setRequestHandler("/terms");
query.setTerms(true);
query.setTermsLimit(5);
query.setTermsLower("s");
query.setTermsPrefix("s");
query.addTermsField("terms_s");
query.setTermsMinCount(1);
QueryRequest request = new QueryRequest(query);
List<Term> terms = request.process(getSolrClient()).getTermsResponse().getTerms("terms_s");
使用詞彙元件進行自動建議功能
如果 Suggester 不符合您的需求,您可以在 Solr 中使用詞彙元件,為您自己的搜尋應用程式建構類似的功能。只需提交一個查詢,指定使用者目前為止輸入的任何字元作為前綴。例如,如果使用者輸入了 "at",則搜尋引擎的介面會提交以下查詢
https://127.0.0.1:8983/solr/techproducts/terms?terms.fl=name&terms.prefix=at&wt=xml
結果
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
</lst>
<lst name="terms">
<lst name="name">
<int name="ata">1</int>
<int name="ati">1</int>
</lst>
</lst>
</response>
您可以使用參數 omitHeader=true
從查詢回應中省略回應標頭,例如在此範例中,它也會以 JSON 格式返回回應
https://127.0.0.1:8983/solr/techproducts/terms?terms.fl=name&terms.prefix=at&omitHeader=true
結果
{
"terms": {
"name": [
"ata",
1,
"ati",
1
]
}
}