トークナイザー
トークナイザーは、フィールドデータを字句単位、つまりトークンに分割する役割を担います。
各トークンは(通常)テキスト内の文字のサブシーケンスです。アナライザーは、設定されているフィールドを認識しますが、トークナイザーは認識しません。トークナイザーは文字ストリーム(Reader)から読み取り、トークンオブジェクトのシーケンス(TokenStream)を生成します。
入力ストリーム内の空白やその他の区切り文字などの文字は破棄される場合があります。また、正規化された形式へのエイリアスや省略形のマップなど、追加または置換される場合もあります。
トークンには、テキスト値に加えて、トークンがフィールド内で発生した場所など、さまざまなメタデータが含まれています。トークナイザーは入力テキストから分岐したトークンを生成する可能性があるため、トークンのテキストがフィールドで発生したテキストと同じであると仮定したり、その長さが元のテキストと同じであると仮定したりしないでください。また、複数のトークンが同じ位置を持つか、元のテキスト内の同じオフセットを参照することも可能です。フィールドテキストで検索結果を強調表示するなど、トークンメタデータを使用する場合は、この点に注意してください。
トークナイザーについて
スキーマ内のテキストフィールドタイプに対して、<analyzer>
の子として<tokenizer>
要素でトークナイザーを設定します。
名前付き
<fieldType name="text" class="solr.TextField">
<analyzer type="index">
<tokenizer name="standard"/>
<filter name="lowercase"/>
</analyzer>
</fieldType>
クラス名付き(レガシー)
<fieldType name="text" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
name/class属性は、必要に応じてトークナイザーオブジェクトをインスタンス化するファクトリクラスの名前を指定します。トークナイザーファクトリクラスは、org.apache.lucene.analysis.TokenizerFactory
を実装します。TokenizerFactory の create()
メソッドは Reader を受け入れ、TokenStream を返します。Solr がトークナイザーを作成すると、テキストフィールドのコンテンツを提供する Reader オブジェクトを渡します。
<tokenizer>
要素に属性を設定することにより、トークナイザーファクトリに引数を渡すことができます。
名前付き
<fieldType name="semicolonDelimited" class="solr.TextField">
<analyzer type="query">
<tokenizer name="pattern" pattern="; "/>
</analyzer>
</fieldType>
クラス名付き(レガシー)
<fieldType name="semicolonDelimited" class="solr.TextField">
<analyzer type="query">
<tokenizer class="solr.PatternTokenizerFactory" pattern="; "/>
</analyzer>
</fieldType>
CharFilter と TokenFilter のどちらを使用すべきか
関連する(つまり、MappingCharFilter
とASCIIFoldingFilter
)またはほぼ同一(つまり、PatternReplaceCharFilterFactory
とPatternReplaceFilterFactory
)の機能を持つ CharFilter と TokenFilter のペアがいくつかあり、どちらが最適な選択肢であるかが常に明白であるとは限りません。
どちらを使用するかについての決定は、主にどのトークナイザーを使用しているか、および文字ストリームを前処理する必要があるかどうかによって異なります。
たとえば、StandardTokenizer
などのトークナイザーがあり、全体的な動作にはかなり満足しているが、特定の文字の動作をカスタマイズしたいとします。ルールを修正して JFlex で独自のトークナイザーを再構築することもできますが、CharFilter
を使用してトークン化する前に一部の文字をマップする方が簡単かもしれません。
次のセクションでは、このリリースの Solr に含まれるトークナイザーファクトリクラスについて説明します。
標準トークナイザー
このトークナイザーは、テキストフィールドをトークンに分割し、空白と句読点を区切り文字として扱います。区切り文字は、次の例外を除き、破棄されます。
-
空白が続かないピリオド(ドット)は、インターネットドメイン名を含め、トークンの一部として保持されます。
-
「@」文字はトークン分割の句読点セットに含まれているため、メールアドレスは単一のトークンとして保持されません。
単語はハイフンで分割されることに注意してください。
標準トークナイザーは、次のトークンタイプを使用してUnicode 標準アネックス UAX#29ワード境界をサポートしています:<ALPHANUM>
、<NUM>
、<SOUTHEAST_ASIAN>
、<IDEOGRAPHIC>
、および<HIRAGANA>
。
ファクトリクラス: solr.StandardTokenizerFactory
引数
maxTokenLength
-
オプション
デフォルト:
255
Solr は、
maxTokenLength
で指定された文字数を超えるトークンを無視します。
例
名前付き
<analyzer>
<tokenizer name="standard"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>
入力: "メールでjohn.doe@foo.comに03-09までに連絡ください、件名:m37-xq。"
出力: "Please", "email", "john.doe", "foo.com", "by", "03", "09", "re", "m37", "xq"
クラシックトークナイザー
クラシックトークナイザーは、Solr バージョン 3.1 以前の標準トークナイザーと同じ動作を保持します。標準トークナイザーが使用するUnicode 標準付属書 UAX#29の単語境界ルールは使用しません。このトークナイザーは、テキストフィールドをトークンに分割する際、空白と句読点を区切り文字として扱います。区切り文字は破棄されますが、次の例外があります。
-
空白が続かないピリオド(ドット)は、トークンの一部として保持されます。
-
単語はハイフンで分割されます。ただし、単語に数字が含まれる場合は、トークンは分割されず、数字とハイフンが保持されます。
-
インターネットドメイン名とメールアドレスを認識し、単一のトークンとして保持します。
ファクトリークラス: solr.ClassicTokenizerFactory
引数
maxTokenLength
-
オプション
デフォルト:
255
Solr は、
maxTokenLength
で指定された文字数を超えるトークンを無視します。
例
名前付き
<analyzer>
<tokenizer name="classic"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.ClassicTokenizerFactory"/>
</analyzer>
入力: "メールでjohn.doe@foo.comに03-09までに連絡ください、件名:m37-xq。"
出力: "Please", "email", "john.doe@foo.com", "by", "03-09", "re", "m37-xq"
キーワードトークナイザー
このトークナイザーは、テキストフィールド全体を単一のトークンとして扱います。
ファクトリークラス: solr.KeywordTokenizerFactory
引数
maxTokenLen
-
オプション
デフォルト:
256
トークナイザーが出力するトークンの最大長。
例
名前付き
<analyzer>
<tokenizer name="keyword"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
入力: "メールでjohn.doe@foo.comに03-09までに連絡ください、件名:m37-xq。"
出力: "Please, email john.doe@foo.com by 03-09, re: m37-xq."
レタートークナイザー
このトークナイザーは、連続した文字の文字列からトークンを作成し、文字以外のすべての文字を破棄します。
ファクトリークラス: solr.LetterTokenizerFactory
引数
maxTokenLen
-
オプション
デフォルト:
255
トークナイザーが出力するトークンの最大長。
例
名前付き
<analyzer>
<tokenizer name="letter"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.LetterTokenizerFactory"/>
</analyzer>
入力: "I can’t."
出力: "I", "can", "t"
小文字トークナイザー
入力ストリームを非文字で区切り、すべての文字を小文字に変換してトークン化します。空白と非文字は破棄されます。
ファクトリークラス: solr.LowerCaseTokenizerFactory
引数
maxTokenLen
-
オプション
デフォルト:
255
トークナイザーが出力するトークンの最大長。
例
名前付き
<analyzer>
<tokenizer name="lowercase"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>
入力: "I just *LOVE* my iPhone!"
出力: "i", "just", "love", "my", "iphone"
Nグラムトークナイザー
フィールドテキストを読み取り、指定された範囲のサイズのNグラムトークンを生成します。
ファクトリークラス: solr.NGramTokenizerFactory
引数
minGramSize
-
オプション
デフォルト:
1
最小Nグラムサイズ。0より大きい必要があります。
maxGramSize
-
オプション
デフォルト:
2
最大Nグラムサイズ。
minGramSize
以上である必要があります。
例
デフォルトの動作。このトークナイザーはフィールド全体に対して動作することに注意してください。フィールドを空白で分割することはありません。結果として、空白文字はエンコーディングに含まれます。
名前付き
<analyzer>
<tokenizer name="nGram"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.NGramTokenizerFactory"/>
</analyzer>
入力: "hey man"
出力: "h", "e", "y", " ", "m", "a", "n", "he", "ey", "y ", " m", "ma", "an"
例
4〜5のNグラムサイズ範囲の場合
名前付き
<analyzer>
<tokenizer name="nGram" minGramSize="4" maxGramSize="5"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="4" maxGramSize="5"/>
</analyzer>
入力: "bicycle"
出力: "bicy", "bicyc", "icyc", "icycl", "cycl", "cycle", "ycle"
エッジNグラムトークナイザー
フィールドテキストを読み取り、指定された範囲のサイズのエッジNグラムトークンを生成します。
ファクトリークラス: solr.EdgeNGramTokenizerFactory
引数
minGramSize
-
オプション
デフォルト:
1
最小Nグラムサイズ。0より大きい必要があります。
maxGramSize
-
オプション
デフォルト:
1
最大Nグラムサイズ。
minGramSize
以上である必要があります。
例
デフォルトの動作(最小と最大はデフォルトで1)
名前付き
<analyzer>
<tokenizer name="edgeNGram"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.EdgeNGramTokenizerFactory"/>
</analyzer>
入力: "babaloo"
出力: "b"
例
2〜5のエッジNグラム範囲
名前付き
<analyzer>
<tokenizer name="edgeNGram" minGramSize="2" maxGramSize="5"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="5"/>
</analyzer>
入力: "babaloo"
出力:"ba", "bab", "baba", "babal"
ICUトークナイザー
このトークナイザーは、多言語テキストを処理し、そのスクリプト属性に基づいて適切にトークン化します。
スクリプトごとのルールファイルを指定することで、このトークナイザーの動作をカスタマイズできます。スクリプトごとのルールを追加するには、rulefiles
引数を追加します。この引数には、次の形式で、コンマ区切りのcode:rulefile
ペアのリストを含める必要があります。4文字のISO 15924スクリプトコードの後にコロン、そしてリソースパスが続きます。たとえば、ラテン語(スクリプトコード"Latn")とキリル文字(スクリプトコード"Cyrl")のルールを指定するには、Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi
と入力します。
solr.ICUTokenizerFactory
のデフォルト構成では、UAX#29単語区切りルールトークン化(solr.StandardTokenizer
と同様)が提供されますが、ヘブライ語(二重引用符と単一引用符の特別な処理)、クメール語、ラオ語、ミャンマー語の音節トークン化、およびCJK文字の辞書ベースの単語分割のためのカスタム調整も含まれています。
ファクトリークラス: solr.ICUTokenizerFactory
引数
rulefile
-
オプション
デフォルト: なし
次の形式のコンマ区切りの
code:rulefile
ペアのリスト:4文字のISO 15924スクリプトコードの後にコロン、そしてリソースパス。 cjkAsWords
-
オプション
デフォルト:
true
true
の場合、CJKテキストは辞書ベースの分割を受け、すべての漢字+ひらがな+カタカナの単語がIDEOGRAPHICとしてタグ付けされます。それ以外の場合、テキストはUAX#29のデフォルトに従って分割されます。 myanmarAsWords
-
オプション
デフォルト:
true
true
の場合、ミャンマー語テキストは辞書ベースの分割を受けます。それ以外の場合、音節としてトークン化されます。
例
名前付き
<analyzer>
<!-- no customization -->
<tokenizer name="icu"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<!-- no customization -->
<tokenizer class="solr.ICUTokenizerFactory"/>
</analyzer>
名前付き
<analyzer>
<tokenizer name="icu"
rulefiles="Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.ICUTokenizerFactory"
rulefiles="Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi"/>
</analyzer>
このトークナイザーを使用するには、Solrのクラスパスに追加の.jarファイルを追加する必要があります(プラグインのインストールのセクションで説明されています)。追加する必要があるjarファイルの情報については、 |
パス階層トークナイザー
このトークナイザーは、ファイルパス階層から同義語を作成します。
ファクトリークラス: solr.PathHierarchyTokenizerFactory
引数
delimiter
-
必須
デフォルト: なし
ファイルパス区切り文字を指定し、提供する区切り文字に置き換えることができます。これは、バックスラッシュ区切り文字を使用する場合に便利です。
replace
-
必須
デフォルト: なし
Solrがトークン化された出力で使用する区切り文字を指定します。
reverse
-
オプション
デフォルト:
false
true
の場合、トークナイザーの動作を切り替えて、「逆」順序でパス階層を構築します。これは通常、URLをトークン化するのに役立ちます。 skip
-
オプション
デフォルト:
0
出力される各トークンから削除する、左端(または reverse=trueの場合は右端)のパス要素の数。
例
デフォルトの動作
名前付き
<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer name="pathHierarchy" delimiter="\" replace="/"/>
</analyzer>
</fieldType>
クラス名付き(レガシー)
<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="\" replace="/"/>
</analyzer>
</fieldType>
入力: "c:\usr\local\apache"
出力: "c:", "c:/usr", "c:/usr/local", "c:/usr/local/apache"
例
逆順
名前付き
<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer name="pathHierarchy" delimiter="." replace="." reverse="true"/>
</analyzer>
</fieldType>
クラス名付き(レガシー)
<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="." replace="." reverse="true"/>
</analyzer>
</fieldType>
入力: "www.site.co.uk"
出力: "www.site.co.uk", "site.co.uk", "co.uk", "uk"
正規表現パターントークナイザー
このトークナイザーは、Javaの正規表現を使用して、入力テキストストリームをトークンに分割します。pattern引数で提供される式は、トークンを区切る区切り文字として解釈されるか、テキストからトークンとして抽出する必要のあるパターンに一致するように解釈できます。
Java正規表現構文の詳細については、java.util.regex.Pattern
のJavadocを参照してください。
ファクトリークラス: solr.PatternTokenizerFactory
引数
pattern
-
必須
デフォルト: なし
java.util.regex.Pattern
で定義されている正規表現。 group
-
オプション
デフォルト:
-1
トークンとして抽出する正規表現グループを指定します。値-1は、正規表現をトークンを区切る区切り文字として扱う必要があることを意味します。0以上の非負のグループ番号(>= 0)は、その正規表現グループに一致する文字シーケンスをトークンに変換する必要があることを示します。グループ0は正規表現全体を指し、0より大きいグループは、左から右に数えられた正規表現の括弧付きサブ式を指します。
例
コンマ区切りのリスト。トークンは、0個以上のスペース、コンマ、および0個以上のスペースのシーケンスで区切られます。
名前付き
<analyzer>
<tokenizer name="pattern" pattern="\s*,\s*"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*"/>
</analyzer>
入力: "fee,fie, foe , fum, foo"
出力: "fee", "fie", "foe", "fum", "foo"
例
単純な大文字の単語を抽出します。1つ以上の大文字の後に、0個以上の大文字と小文字の文字のシーケンスがトークンとして抽出されます。
名前付き
<analyzer>
<tokenizer name="pattern" pattern="[A-Z][A-Za-z]*" group="0"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="[A-Z][A-Za-z]*" group="0"/>
</analyzer>
入力: "Hello. My name is Inigo Montoya. You killed my father. Prepare to die."
出力: "Hello", "My", "Inigo", "Montoya", "You", "Prepare"
例
"SKU"、"Part"、または"Part Number"が前に付く部品番号を、大文字と小文字を区別して抽出します。オプションのセミコロン区切り文字を使用します。部品番号は、すべて数字で構成され、オプションのハイフンを使用できます。正規表現キャプチャグループは、左から右に左括弧を数えることで番号が付けられます。グループ3は、1つ以上の数字またはハイフンに一致するサブ式「[0-9-] +」です。
名前付き
<analyzer>
<tokenizer name="pattern" pattern="(SKU|Part(\sNumber)?):?\s(\[0-9-\]+)" group="3"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="(SKU|Part(\sNumber)?):?\s(\[0-9-\]+)" group="3"/>
</analyzer>
入力: "SKU: 1234, Part Number 5678, Part: 126-987"
出力 "1234", "5678", "126-987"
簡略化された正規表現パターントークナイザー
このトークナイザーは、上記で説明したPatternTokenizerFactory
に似ていますが、Lucene RegExp
パターンマッチングを使用して、入力ストリームに対して個別のトークンを構築します。構文はPatternTokenizerFactory
よりも制限されていますが、トークン化は大幅に高速です。
ファクトリークラス: solr.SimplePatternTokenizerFactory
引数
pattern
-
必須
デフォルト: なし
RegExp
javadocで定義されている、トークンに含める文字を識別する正規表現。マッチングは貪欲であり、指定されたポイントで最長のトークン一致が作成されます。空のトークンは作成されません。 determinizeWorkLimit
-
オプション
デフォルト:
10000
正規表現から計算された、決定的なオートマトンの状態数の合計制限。
例
単純な空白文字で区切られたトークンを照合するには
名前付き
<analyzer>
<tokenizer name="simplePattern" pattern="[^ \t\r\n]+"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.SimplePatternTokenizerFactory" pattern="[^ \t\r\n]+"/>
</analyzer>
簡略化された正規表現パターン分割トークナイザー
このトークナイザーは、上記で説明したSimplePatternTokenizerFactory
に似ていますが、Lucene RegExp
パターンマッチングを使用して、トークンを分割するために使用する必要がある文字シーケンスを識別します。構文はPatternTokenizerFactory
よりも制限されていますが、トークン化は大幅に高速です。
ファクトリークラス: solr.SimplePatternSplitTokenizerFactory
引数
pattern
-
必須
デフォルト: なし
RegExp
javadocで定義されている、トークンを分割する必要がある文字を識別する正規表現。マッチングは貪欲であり、指定されたポイントで最長のトークンセパレーターマッチングがマッチします。空のトークンは作成されません。 determinizeWorkLimit
-
オプション
デフォルト:
10000
正規表現から計算された、決定的なオートマトンの状態数の合計制限。
例
単純な空白文字で区切られたトークンを照合するには
名前付き
<analyzer>
<tokenizer name="simplePatternSplit" pattern="[ \t\r\n]+"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.SimplePatternSplitTokenizerFactory" pattern="[ \t\r\n]+"/>
</analyzer>
UAX29 URLメールトークナイザー
このトークナイザーは、テキストフィールドをトークンに分割し、空白と句読点を区切り文字として扱います。区切り文字は、次の例外を除き、破棄されます。
-
空白が続かないピリオド(ドット)は、トークンの一部として保持されます。
-
単語はハイフンで分割されます。ただし、単語に数字が含まれる場合は、トークンは分割されず、数字とハイフンが保持されます。
-
次を認識し、単一のトークンとして保持します。
-
トークナイザーが生成されたときにIANAルートゾーンデータベースのホワイトリストに対して検証されたトップレベルドメインを含むインターネットドメイン名
-
メールアドレス
-
file://
、http(s)://
、およびftp://
URL -
IPv4およびIPv6アドレス
-
UAX29 URL Email Tokenizer は、Unicode 標準附属書 UAX#29 の単語境界をサポートしており、以下のトークンタイプを扱います: <ALPHANUM>
, <NUM>
, <URL>
, <EMAIL>
, <SOUTHEAST_ASIAN>
, <IDEOGRAPHIC>
, および <HIRAGANA>
。
ファクトリクラス: solr.UAX29URLEmailTokenizerFactory
引数
maxTokenLength
-
オプション
デフォルト:
255
Solr は、
maxTokenLength
で指定された文字数を超えるトークンを無視します。
例
名前付き
<analyzer>
<tokenizer name="uax29URLEmail"/>
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
</analyzer>
入力: "Visit http://accarol.com/contact.htm?from=external&a=10 or e-mail bob.cratchet@accarol.com"
出力: "Visit", "http://accarol.com/contact.htm?from=external&a=10", "or", "e", "mail", "bob.cratchet@accarol.com"
空白トークナイザー
テキストストリームを空白で分割し、空白文字以外の文字の並びをトークンとして返すシンプルなトークナイザーです。句読点はトークンに含まれることに注意してください。
ファクトリクラス: solr.WhitespaceTokenizerFactory
引数
rule
-
オプション
デフォルト:
java
トークン化の目的のために、空白をどのように定義するかを指定します。有効な値は以下のとおりです。
-
java
: Character.isWhitespace(int) を使用します。 -
unicode
: Unicode の WHITESPACE プロパティを使用します。
-
maxTokenLen
-
オプション
デフォルト:
255
トークナイザーが出力するトークンの最大長。
例
名前付き
<analyzer>
<tokenizer name="whitespace" rule="java" />
</analyzer>
クラス名付き(レガシー)
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory" rule="java" />
</analyzer>
入力: "To be, or what?"
出力: "To", "be,", "or", "what?"
OpenNLP トークナイザーと OpenNLP フィルター
OpenNLP トークナイザーの使用方法と、利用可能な OpenNLP トークンフィルターに関する情報については、OpenNLP の統合を参照してください。