インデックスと検索の分析
テキスト分析は2つのタイミングで行われます:
- インデックス時
- ドキュメントがインデックスされると、任意の
text
フィールドの値が分析されます。 - 検索時
text
フィールドに対して フルテキスト検索 を実行する際、クエリ文字列(ユーザーが検索しているテキスト)が分析されます。
検索時はクエリ時とも呼ばれます。
各タイミングで使用されるアナライザーまたは分析ルールのセットは、それぞれ インデックスアナライザー または 検索アナライザー と呼ばれます。
インデックスアナライザーと検索アナライザーの連携
ほとんどの場合、インデックス時と検索時に同じアナライザーを使用するべきです。これにより、フィールドの値とクエリ文字列が同じトークン形式に変換されます。これにより、検索中にトークンが期待通りに一致することが保証されます。
例
ドキュメントは、text
フィールドに次の値でインデックスされます:
テキスト
The QUICK brown foxes jumped over the dog!
フィールドのインデックスアナライザーは、値をトークンに変換し、それらを正規化します。この場合、各トークンは単語を表します:
テキスト
[ quick, brown, fox, jump, over, dog ]
これらのトークンはその後インデックスされます。
後に、ユーザーは同じ text
フィールドを次のように検索します:
テキスト
"Quick fox"
ユーザーは、この検索が以前にインデックスされた文に一致することを期待しています、The QUICK brown foxes jumped over the dog!
。
しかし、クエリ文字列にはドキュメントの元のテキストで使用された正確な単語が含まれていません:
Quick
vsQUICK
fox
vsfoxes
これに対処するために、クエリ文字列は同じアナライザーを使用して分析されます。このアナライザーは次のトークンを生成します:
テキスト
[ quick, fox ]
検索を実行するために、Elasticsearchはこれらのクエリ文字列トークンを text
フィールドにインデックスされたトークンと比較します。
トークン | クエリ文字列 | text フィールド |
---|---|---|
quick |
X | X |
brown |
X | |
fox |
X | X |
jump |
X | |
over |
X | |
dog |
X |
フィールドの値とクエリ文字列が同じ方法で分析されたため、類似のトークンが生成されました。トークン quick
と fox
は正確に一致します。これは、検索が "The QUICK brown foxes jumped over the dog!"
を含むドキュメントに一致することを意味し、ユーザーの期待通りです。
異なる検索アナライザーを使用するタイミング
あまり一般的ではありませんが、インデックス時と検索時に異なるアナライザーを使用することが理にかなっている場合があります。これを可能にするために、Elasticsearchは 別の検索アナライザーを指定することを許可します。
一般的に、フィールド値とクエリ文字列に同じトークン形式を使用すると予期しないまたは無関係な検索一致が生じる場合にのみ、別の検索アナライザーを指定するべきです。
例
Elasticsearchは、提供された接頭辞で始まる単語のみを一致させる検索エンジンを作成するために使用されます。たとえば、tr
の検索は tram
または trope
を返すべきですが、taxi
または bat
は決して返さないべきです。
ドキュメントが検索エンジンのインデックスに追加されます。このドキュメントには、text
フィールドにそのような単語が1つ含まれています:
テキスト
"Apple"
フィールドのインデックスアナライザーは、値をトークンに変換し、それらを正規化します。この場合、各トークンは単語の潜在的な接頭辞を表します:
テキスト
[ a, ap, app, appl, apple]
これらのトークンはその後インデックスされます。
後に、ユーザーは同じ text
フィールドを次のように検索します:
テキスト
"appli"
ユーザーは、この検索が appli
で始まる単語、たとえば appliance
または application
のみと一致することを期待しています。検索は apple
とは一致しないべきです。
しかし、インデックスアナライザーがこのクエリ文字列を分析するために使用されると、次のトークンが生成されます:
テキスト
[ a, ap, app, appl, appli ]
Elasticsearchがこれらのクエリ文字列トークンを apple
にインデックスされたものと比較すると、いくつかの一致が見つかります。
トークン | appli |
apple |
---|---|---|
a |
X | X |
ap |
X | X |
app |
X | X |
appl |
X | X |
appli |
X |
これは、検索が誤って apple
に一致することを意味します。それだけでなく、a
で始まる任意の単語にも一致します。
これを修正するために、text
フィールドで使用されるクエリ文字列に対して異なる検索アナライザーを指定できます。
この場合、接頭辞のセットではなく単一のトークンを生成する検索アナライザーを指定できます:
テキスト
[ appli ]
このクエリ文字列トークンは、appli
で始まる単語のトークンのみと一致し、ユーザーの検索期待により適合します。