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.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
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
]
}
}