外部ファイルとプロセス

Solr は、ExternalFileFieldType というフィールドタイプを使用して、フィールド値を外部ファイルに保存することをサポートしています。また、PreAnalyzedFieldType というフィールドタイプを使用して、既に分析済みのトークンのストリームを使用することもできます。

ExternalFileField タイプ

ExternalFileField タイプを使用すると、Solr インデックスの外部にあるファイル内のフィールドの値を指定できます。このようなフィールドの場合、ファイルにはキーフィールドからフィールド値へのマッピングが含まれています。別の言い方をすれば、インデックス作成時にドキュメントにフィールドを指定する代わりに、Solr はこのフィールドの値を外部ファイルで見つけます。

外部フィールドは検索できません。関数クエリまたは表示のみに使用できます。関数クエリに関する詳細については、関数クエリのセクションを参照してください。

ExternalFileField タイプは、多くのドキュメント内の特定のフィールドを、他のドキュメントの更新頻度よりも頻繁に更新する場合に便利です。たとえば、ビュー数に基づいてドキュメントのランク付けを実装した場合、すべてのドキュメントのランクを毎日または毎時更新する必要がある一方で、ドキュメントの残りのコンテンツははるかに低い頻度で更新される可能性があります。ExternalFileField を使用しないと、ランクを変更するだけで各ドキュメントを更新する必要があります。ExternalFileField を使用すると、特定のフィールドのすべてのドキュメント値が外部ファイルに格納されるため、必要に応じて頻繁に更新でき、はるかに効率的です。

スキーマでは、このフィールドタイプの定義は次のようになります。

<fieldType name="entryRankFile" keyField="pkId" defVal="0" stored="false" indexed="false" class="solr.ExternalFileField"/>

keyField 属性は、外部ファイルで定義されるキーを定義します。通常はインデックスの一意のキーですが、keyField はインデックス内のドキュメントを識別できれば、必ずしも一意である必要はありません。defVal は、特定のドキュメントの外部ファイルにエントリがない場合に使用されるデフォルト値を定義します。

外部ファイルの形式

ファイル自体は、デフォルトでは$SOLR_HOME/dataである Solr のインデックスディレクトリにあります。ファイルの名前はexternal_fieldnameまたはexternal_fieldname.*にする必要があります。上記の例では、ファイルの名前はexternal_entryRankFileまたはexternal_entryRankFile.txtになります。

.*(例:.txt)という名前のパターンを使用するファイルが表示された場合、(名前でソートした後)最後のファイルが使用され、以前のバージョンは削除されます。この動作は、ファイルの上書きができないシステム(たとえば、Windows でファイルが使用中の場合)での実装をサポートしています。

ファイルには、等号の左側にキーフィールド、右側に値をマッピングするエントリが含まれています。いくつかの例を示します。

doc33=1.414
doc34=3.14159
doc40=42

このファイルにリストされているキーが一意である必要はありません。ファイルはソートする必要はありませんが、ソートされている場合は、Solr がルックアップをより高速に実行できます。

外部ファイルの再ロード

検索エンジンの再読み込み時、または新しい検索エンジンの開始時に外部ファイルを再読み込みするイベントリスナーを定義できます。クエリ関連リスナーセクションで詳細を参照できますが、`solrconfig.xml` でのサンプル定義は次のようになります。

<listener event="newSearcher" class="org.apache.solr.schema.ExternalFileFieldReloader"/>
<listener event="firstSearcher" class="org.apache.solr.schema.ExternalFileFieldReloader"/>

PreAnalyzedField タイプ

`PreAnalyzedField` タイプを使用すると、Solr にシリアライズされたトークンストリーム(オプションでフィールドの独立した保存済み値を含む)を送信し、Solr で追加のテキスト処理を適用せずにこの情報を保存およびインデックス登録できます。これは、ユーザーが既存の外部テキスト処理パイプラインで既に処理されたフィールドコンテンツ(例:トークン化、アノテーション、ステミング、同義語の挿入など)を送信する場合に役立ちます。同時に、Lucene の TokenStream が提供する豊富な属性(トークンごとの属性)をすべて使用できます。

シリアライズ形式は、PreAnalyzedParser インターフェースの実装を使用してプラグイン可能です。すぐに使用できる実装が2つあります。

  • JsonPreAnalyzedParser:名前が示すように、フィールドのコンテンツを表すために JSON を使用するコンテンツを解析します。フィールドタイプが別に構成されていない場合は、使用するデフォルトのパーサーです。

  • SimplePreAnalyzedParser:単純な厳格なプレーンテキスト形式を使用します。状況によっては、JSON よりも作成が簡単です。

構成パラメーターは `parserImpl` のみです。このパラメーターの値は、PreAnalyzedParser インターフェースを実装するクラスの完全修飾クラス名にする必要があります。このパラメーターのデフォルト値は `org.apache.solr.schema.JsonPreAnalyzedParser` です。

デフォルトでは、このタイプのフィールドに対するクエリ時のアナライザーは、シリアライズされた事前分析済みテキストを期待するインデックス時のアナライザーと同じです。事前分析されていないクエリで分析を実行するには、fieldType にクエリタイプのアナライザーを追加する必要があります。以下の例では、インデックス時のアナライザーはデフォルトの JSON シリアライズ形式を期待し、クエリ時のアナライザーは StandardTokenizer/LowerCaseFilter を使用します。

<fieldType name="pre_with_query_analyzer" class="solr.PreAnalyzedField">
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

JsonPreAnalyzedParser

これは、PreAnalyzedField タイプで使用されるデフォルトのシリアライズ形式です。次のキーを持つトップレベルの JSON マップを使用します。

キー 説明 必須

v

バージョンキー。現在サポートされているバージョンは `1` です。

必須

str

フィールドの保存された文字列値。`str` または `bin` のうち、最大 1 つを使用できます。

オプション

bin

フィールドの保存されたバイナリ値。バイナリ値は Base64 エンコードされている必要があります。

オプション

tokens

シリアライズされたトークンストリーム。これは JSON リストです。

オプション

その他のトップレベルキーは、黙って無視されます。

トークンストリームのシリアライズ

トークンストリームは、JSON マップの JSON リストとして表現されます。各トークンのマップは、次のキーと値で構成されます。

キー 説明 Lucene 属性 必須?

t

トークン

CharTermAttribute

現在のトークンを表す UTF-8 文字列

必須

s

開始オフセット

OffsetAttribute

非負の整数

オプション

e

終了オフセット

OffsetAttribute

非負の整数

オプション

i

位置増分

PositionIncrementAttribute

非負の整数 - デフォルトは `1`

オプション

p

ペイロード

PayloadAttribute

Base64 エンコードされたペイロード

オプション

y

字句の種類

TypeAttribute

UTF-8 文字列

オプション

f

フラグ

FlagsAttribute

16 進数の整数値を表す文字列

オプション

その他のキーは、黙って無視されます。

JsonPreAnalyzedParser の例

{
  "v":"1",
  "str":"test ąćęłńóśźż",
  "tokens": [
    {"t":"two","s":5,"e":8,"i":1,"y":"word"},
    {"t":"three","s":20,"e":22,"i":1,"y":"foobar"},
    {"t":"one","s":123,"e":128,"i":22,"p":"DQ4KDQsODg8=","y":"word"}
  ]
}

SimplePreAnalyzedParser

`parserImpl` 構成パラメーターを介してこの形式を指定する場合に使用する完全修飾クラス名は `org.apache.solr.schema.SimplePreAnalyzedParser` です。

SimplePreAnalyzedParser の構文

このパーサーでサポートされているシリアライズ形式は次のとおりです。

シリアライズ形式
content ::= version (stored)? tokens
version ::= digit+ " "
; stored field value - any "=" inside must be escaped!
stored ::= "=" text "="
tokens ::= (token ((" ") + token)*)*
token ::= text ("," attrib)*
attrib ::= name '=' value
name ::= text
value ::= text

"text" 値の特殊文字は、エスケープ文字 `\` を使用してエスケープできます。次のエスケープシーケンスが認識されます。

エスケープシーケンス 説明

\

リテラル スペース文字

\,

リテラル `,` 文字

\=

リテラル `=` 文字

\\

リテラル `\` 文字

\n

改行

\r

復帰

\t

水平タブ

Unicode シーケンス(例:`\u0001`)はサポートされていません。

サポートされている属性

次のトークン属性がサポートされており、短いシンボリック名で識別されます。

名前 説明 Lucene 属性 値形式

i

位置増分

PositionIncrementAttribute

整数

s

開始オフセット

OffsetAttribute

整数

e

終了オフセット

OffsetAttribute

整数

y

字句の種類

TypeAttribute

文字列

f

フラグ

FlagsAttribute

16 進数整数

p

ペイロード

PayloadAttribute

16 進数のバイト; ホワイトスペースは無視されます。

トークン位置は追跡され、トークンストリームに暗黙的に追加されます。開始オフセットと終了オフセットは、用語テキストとホワイトスペースのみを考慮し、トークン属性によって占められるスペースを除外します。

トークンストリームの例

1 one two three
  • version: 1

  • stored: null

  • token: (term=`one`,startOffset=0,endOffset=3)

  • token: (term=`two`,startOffset=4,endOffset=7)

  • token: (term=`three`,startOffset=8,endOffset=13)

1 one  two    three
  • version: 1

  • stored: null

  • token: (term=`one`,startOffset=0,endOffset=3)

  • token: (term=`two`,startOffset=5,endOffset=8)

  • token: (term=`three`,startOffset=11,endOffset=16)

1 one,s=123,e=128,i=22 two three,s=20,e=22
  • version: 1

  • stored: null

  • token: (term=`one`,positionIncrement=22,startOffset=123,endOffset=128)

  • token: (term=`two`,positionIncrement=1,startOffset=5,endOffset=8)

  • token: (term=`three`,positionIncrement=1,startOffset=20,endOffset=22)

1 \ one\ \,,i=22,a=\, two\=

\n,\ =\ \
  • version: 1

  • stored: null

  • token: (term=`one ,`,positionIncrement=22,startOffset=0,endOffset=6)

  • token: (term=`two=`,positionIncrement=1,startOffset=7,endOffset=15)

  • token: (term=`\`,positionIncrement=1,startOffset=17,endOffset=18)

不明な属性とその値は無視されるため、この例では、最初のトークンの "a" 属性と 2 番目のトークンの " "(エスケープされたスペース)属性は、サポートされている属性名に含まれていないため、その値とともに無視されます。

1 ,i=22 ,i=33,s=2,e=20 ,
  • version: 1

  • stored: null

  • token: (term=,positionIncrement=22,startOffset=0,endOffset=0)

  • token: (term=,positionIncrement=33,startOffset=2,endOffset=20)

  • token: (term=,positionIncrement=1,startOffset=2,endOffset=2)

1 =This is the stored part with \=
\n \t escapes.=one two three
  • version: 1

  • stored: `This is the stored part with = \t escapes.`

  • token: (term=`one`,startOffset=0,endOffset=3)

  • token: (term=`two`,startOffset=4,endOffset=7)

  • token: (term=`three`,startOffset=8,endOffset=13)

上記の保存済み値の `\t` はリテラルではありません。保存済み値にある実際のタブ文字を視覚的に示すために、このように表示されています。

1 ==
  • version: 1

  • stored: ""

  • (トークンなし)

1 =this is a test.=
  • version: 1

  • stored: `this is a test.`

  • (トークンなし)