問題
- アイテム選択時に、ドキュメントファイルやメディアファイルをより速く見つけたい。
- 検索用語にファイル名の一部を指定しても、正しい結果が返されないか、何も返されません。
- 検索語の先頭にワイルドカードを使用しても、使い勝手は向上しません。
環境
- Liferay DXP
解決
- 検索中、検索エンジンはテキスト分析を実行して検索対象のキーワードをトークン化し、インデックス化されたドキュメントに属するトークンと一致させようとします。 Liferayは各言語の標準言語アナライザーを使ってこの分析を行います。 (英語ロケールの場合は、英語アナライザーが使用されます)。 アナライザーは、トークンを分割するために探す「ストップワード」のリストを持っています。たとえば、単語の中に「-」があると、そのトークンは2つの別々のトークンに分割される。
-
実際にどのように見えるのか - シナリオの例:
この場合、"_"は "stopword "ではなありません。つまり、"icon_checkBoux "として一緒にトークン化されているが、検索されたトークン "check "や "Boux "とは一致しない。
アナライザーがトークンをどのように解析しているかを見るには、次のようなコマンドを使用できます:POST _analyze
{
"analyzer": "english",
"text": "icon_checkbox"
}
## which returns
{
"tokens" : [
{
"token" : "icon_checkbox",
"start_offset" : 0,
"end_offset" : 13,
"type" : "<ALPHANUM>",
"position" : 0
}
]
} - 実際にどのように見えるか - 「デフォルト」の使用例:
"-"や" "など他の区切り文字を使うと、"check "と一致する別のトークンができてしまうことに注意してください。
POST _analyze
{
"analyzer": "english",
"text": "icon-checkbox"
}
## which returns
{
"tokens" : [
{
"token" : "icon",
"start_offset" : 0,
"end_offset" : 4,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "checkbox",
"start_offset" : 5,
"end_offset" : 13,
"type" : "<ALPHANUM>",
"position" : 1
}
]
} -
Elasticsearch アナライザーの "stopwords "をカスタマイズすることで、(ファイルの命名スキームを変更する以外に)この挙動を緩和する方法があります。 そのための基本的なステップを紹介します:
1. 言語とアナライザーを特定する:
> ストップワードを変更したい言語を特定します。
> Elasticsearch のコンフィギュレーションから対応するアナライザーを見つけます。この情報は、フィールドマッピングを調べることで見つけることができます。
2. Elasticsearch ドキュメントに従ってアナライザーをカスタマイズしてください:
>> stopwords_path プロパティを持つ新しい stop フィルタを定義します。
>> このフィルタをカスタムアナライザの設定に組み込みます。
3. Liferay のカスタムアナライザーを適用するには、マッピングをオーバーライドし、デフォルトのアナライザーを新しいカスタムアナライザーに変更します。
4. 新しいアナライザーをコンテンツに適用するために、完全な再インデックスを開始します。
追加情報
-
ワイルドカード検索の使用はLPS-130375: Discontinue "two star" wildcard search queries とそれに関連するチケットの廃止により、Liferayから削除されました。
- このトピックに関する追加情報:Elasticsearchのストップワードであるため、特定の用語を検索しても結果が返されない