Terms コンポーネント

Terms コンポーネントは、フィールド内のインデックス付き用語と、各用語に一致するドキュメントの数へのアクセスを提供します。これは、自動提案機能や、検索またはドキュメントレベルではなく用語レベルで動作するその他の機能を構築するのに役立ちます。インデックス順で用語を取得することは、実装がLuceneのTermEnumを直接使用して用語辞書を反復処理するため、非常に高速です。

ある意味で、この検索コンポーネントは、ベースクエリやフィルターによって制限されず、インデックス全体に対して高速なフィールドファセットを提供します。返されるドキュメント頻度は、削除対象としてマークされているが、まだインデックスから削除されていないドキュメントを含む、用語に一致するドキュメントの数です。

Terms コンポーネントの設定

Terms コンポーネントは、デフォルトの検索コンポーネントの1つであり、solrconfig.xmlで定義する必要はありません。

定義は次のようになります

<searchComponent name="terms" class="solr.TermsComponent"/>

リクエストハンドラーでの Terms コンポーネントの使用

Solrには、(Termsコンポーネントのみを有効にする) 暗黙的なリクエストハンドラー定義/termsが付属しています。

別のリクエストハンドラーを使用するときにTermsコンポーネントを有効にする場合は、リクエスト中にterms=trueパラメーターを渡すか、ハンドラーのデフォルトで設定する必要があります。

Terms コンポーネントのパラメータ

以下のパラメータを使用すると、返される用語を制御できます。また、これらのいずれかをリクエストハンドラーで構成して、永続的に設定することもできます。または、クエリリクエストに追加することもできます。これらのパラメータは次のとおりです

terms

オプション

デフォルト: false

trueに設定すると、Termsコンポーネントが有効になります。

例: 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.ttftrueに設定されている場合は、合計用語頻度も返されます。複数の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

termsリクエストへの応答は、用語とそのドキュメント頻度値のリストです。

また、TermsComponent javadocにも興味があるかもしれません。

Terms Componentの例

次のサンプルクエリはすべて、Solrの「bin/solr -e techproducts」の例で動作します。

上位10件の用語を取得する

このクエリは、nameフィールドの最初の10個の用語を要求します。

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個の用語を、ドキュメント数による上位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>

リクエストハンドラーでTerms Componentを使用する

このクエリは、用語情報を使用して通常の検索を補強します。

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");

自動提案機能にTerms Componentを使用する

Suggesterがニーズに合わない場合は、SolrのTermsコンポーネントを使用して、独自の検索アプリケーションに同様の機能を構築できます。ユーザーがこれまでにタイプした文字をプレフィックスとして指定するクエリを送信するだけです。たとえば、ユーザーが「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
    ]
  }
}