詞彙元件

詞彙元件提供存取欄位中已索引的詞彙以及符合每個詞彙的文件數。這對於建置自動建議功能或任何其他在詞彙層級而非搜尋或文件層級運作的功能非常有用。以索引順序擷取詞彙非常快速,因為實作直接使用 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
    ]
  }
}