スペルチェック
スペルチェックコンポーネントは、他の類似した用語に基づいてインラインクエリの候補を提供するように設計されています。
これらの候補の基礎は、Solr のフィールド内の用語、外部で作成されたテキストファイル、または他の Lucene インデックス内のフィールドです。
SpellCheckComponent の設定
solrconfig.xml でのスペルチェックの定義
最初のステップは、solrconfig.xml
で用語のソースを指定することです。Solr でのスペルチェックには 3 つのアプローチがあり、以下で説明します。
IndexBasedSpellChecker
IndexBasedSpellChecker
は、スペルチェックに使用される並列インデックスの基礎として Solr インデックスを使用します。インデックスト用語の基礎としてフィールドを定義する必要があります。一般的な方法は、いくつかのフィールド (title
、body
など) からスペルチェック用に作成された別のフィールドに用語をコピーすることです。IndexBasedSpellChecker
を使用した solrconfig.xml
の設定の簡単な例を次に示します。
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="classname">solr.IndexBasedSpellChecker</str>
<str name="spellcheckIndexDir">./spellchecker</str>
<str name="field">content</str>
<str name="buildOnCommit">true</str>
<!-- optional elements with defaults
<str name="distanceMeasure">org.apache.lucene.search.spell.LevenshteinDistance</str>
<str name="accuracy">0.5</str>
-->
</lst>
</searchComponent>
最初の要素は、solr.SpellCheckComponent
を使用する searchComponent
を定義します。classname
は SpellCheckComponent の特定の実装であり、この場合は solr.IndexBasedSpellChecker
です。classname
の定義はオプションです。定義しない場合は、デフォルトで IndexBasedSpellChecker
になります。
spellcheckIndexDir
はスペルチェックインデックスを保持するディレクトリの場所を定義し、field
はスペルチェック用語のソースフィールド (スキーマで定義) を定義します。スペルチェックインデックスのフィールドを選択する際は、より正確な結果を得るために、処理が重いフィールドは避けることをお勧めします。フィールドに、シノニムやステミングの処理による単語のバリエーションが多い場合、辞書は、より有効なスペルデータに加えて、これらのバリエーションで作成されます。
最後に、buildOnCommit は、コミットごと (つまり、新しいドキュメントがインデックスに追加されるたび) にスペルチェックインデックスを作成するかどうかを定義します。これはオプションであり、false
に設定する場合は省略できます。
DirectSolrSpellChecker
DirectSolrSpellChecker
は、IndexBasedSpellChecker
のように並列インデックスを構築せずに、Solr インデックスの用語を使用します。このスペルチェッカーには、定期的に構築する必要がないという利点があります。つまり、用語は常にインデックス内の用語と最新の状態に保たれます。これを solrconfig.xml
で構成する方法を次に示します。
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="name">default</str>
<str name="field">name</str>
<str name="classname">solr.DirectSolrSpellChecker</str>
<str name="distanceMeasure">internal</str>
<float name="accuracy">0.5</float>
<int name="maxEdits">2</int>
<int name="minPrefix">1</int>
<int name="maxInspections">5</int>
<int name="minQueryLength">4</int>
<int name="maxQueryLength">40</int>
<float name="maxQueryFrequency">0.01</float>
<float name="thresholdTokenFrequency">.01</float>
</lst>
</searchComponent>
このスペルチェッカーのクエリ対象となる field
を選択する場合は、分析 (特にステミングなどの分析) が比較的少ないフィールドを選択する必要があります。提案に使用するフィールドを指定する必要があるため、IndexBasedSpellChecker
と同様に、title
、body
などのフィールドから、スペル提案の提供専用のフィールドにデータをコピーする必要があります。
パラメータの多くは、このスペルチェッカーが用語の提案のためにインデックスをどのようにクエリするかに関連しています。distanceMeasure
は、スペルチェッククエリ中に使用するメトリックを定義します。値「internal」は、デフォルトのレーベンシュタインメトリックを使用します。これは、他のスペルチェッカー実装で使用されるメトリックと同じです。
このスペルチェッカーはメインインデックスをクエリしているため、ユーザーのクエリとのパフォーマンスの競合を回避するために、インデックスをクエリする頻度を制限する必要がある場合があります。accuracy
設定は、有効な提案のしきい値を定義し、maxEdits
は許可する用語の変更回数を定義します。ほとんどのスペルミスは 1 文字だけずれているため、これを 1 に設定すると、候補の数が減ります (ただし、デフォルトは 2 です)。値は 1 または 2 のいずれかしか設定できません。minPrefix
は、用語が共有する必要がある最小文字数を定義します。これを 1 に設定すると、スペル提案はすべて同じ文字で始まるようになります (例)。
maxInspections
パラメーターは、結果を返す前にレビューする可能性のある最大一致数を定義します。デフォルトは 5 です。minQueryLength
は、提案が表示される前にクエリに含まれている必要のある文字数を定義します。デフォルトは 4 です。maxQueryLength
は、スペルチェッカーが高コストな操作や例外を回避できるように、非常に長いクエリ用語をスキップできるようにします。デフォルトでは、用語の長さに制限はありません。
まず、スペルチェッカーは、インデックス内で検索することにより、受信したクエリの単語を分析します。インデックスに存在しない、または頻度が低すぎる(maxQueryFrequency
以下)クエリの単語のみが、スペルミスと見なされ、提案を見つけるために使用されます。maxQueryFrequency
より頻繁な単語は、スペルチェッカーをバイパスして変更されません。スペルミスのすべての単語に対する提案が見つかった後、thresholdTokenFrequency
を境界値として、十分に頻度が高いかどうかでフィルタリングされます。これらのパラメーター(maxQueryFrequency
と thresholdTokenFrequency
)は、1 未満の 10 進数値(例えば 0.01
または 1%
)として表されるパーセンテージ、または絶対値(例えば 4
)にすることができます。
|
FileBasedSpellChecker
FileBasedSpellChecker
は、スペリング辞書として外部ファイルを使用します。これは、Solr をスペリングサーバーとして使用する場合、またはスペリングの提案をインデックス内の実際の用語に基づいて行う必要がない場合に役立ちます。solrconfig.xml
では、searchComponent を次のように定義します。
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="classname">solr.FileBasedSpellChecker</str>
<str name="name">file</str>
<str name="sourceLocation">spellings.txt</str>
<str name="characterEncoding">UTF-8</str>
<str name="spellcheckIndexDir">./spellcheckerFile</str>
<!-- optional elements with defaults
<str name="distanceMeasure">org.apache.lucene.search.spell.LevenshteinDistance</str>
<str name="accuracy">0.5</str>
-->
</lst>
</searchComponent>
ここでの違いは、用語ファイルの場所を定義するための sourceLocation
の使用と、用語ファイルのエンコーディングを定義するための characterEncoding
の使用です。
前の例では、name は、スペルチェッカーのこの特定の定義に名前を付けるために使用されます。単一の |
WordBreakSolrSpellChecker
WordBreakSolrSpellChecker
は、隣接するクエリ用語を結合したり、用語を複数の単語に分割したりすることにより、提案を提供します。これは、Lucene の WordBreakSpellChecker
を利用した SpellCheckComponent
の拡張機能です。これは、shingle ベースの辞書を使用せずに、誤った空白の結果として生じるスペリングエラーを検出し、ユーザーが同じクエリに単語スペルのエラーと単語区切りエラーが混在している場合を含め、単語区切りエラーの照合をサポートします。また、シャードのサポートも提供します。
solrconfig.xml
での構成方法を次に示します。
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="name">wordbreak</str>
<str name="classname">solr.WordBreakSolrSpellChecker</str>
<str name="field">lowerfilt</str>
<str name="combineWords">true</str>
<str name="breakWords">true</str>
<int name="maxChanges">10</int>
</lst>
</searchComponent>
パラメーターの一部は、name
、classname
、field
など、他のスペルチェッカーの説明からわかるでしょう。このスペルチェッカーの新しいパラメーターは、単語を辞書検索で結合するかどうかを定義する combineWords
(デフォルトは true)、単語を辞書検索中に分割するかどうかを定義する breakWords
(デフォルトは true)、およびスペルチェッカーがインデックスに対して照合の可能性を確認する回数を定義する整数である maxChanges
(デフォルトは 10)です。
スペルチェッカーは、従来のチェッカー(つまり、DirectSolrSpellChecker
)で構成できます。結果は結合され、照合には両方のスペルチェッカーからの修正が混在する場合があります。
リクエストハンドラーへの追加
クエリは、リクエストハンドラーに送信されます。すべてのリクエストで提案を生成する必要がある場合は、使用している requestHandler
に以下を追加します。
<str name="spellcheck">true</str>
可能なパラメーターの 1 つは、使用する spellcheck.dictionary
であり、複数のパラメーターを定義できます。複数の辞書を使用すると、指定されたすべての辞書が参照され、結果がインターリーブされます。照合は、異なるスペルチェッカーからの組み合わせで作成され、複数の重複する修正が同じ照合で発生しないように注意が払われています。
複数の辞書を使用した例を次に示します。
<requestHandler name="spellCheckWithWordbreak" class="org.apache.solr.handler.component.SearchHandler">
<lst name="defaults">
<str name="spellcheck.dictionary">default</str>
<str name="spellcheck.dictionary">wordbreak</str>
<str name="spellcheck.count">20</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>
スペルチェックパラメーター
SpellCheck コンポーネントは、以下に説明するパラメーターを受け入れます。
spellcheck
-
オプション
デフォルト:
false
このパラメーターは、リクエストの SpellCheck 提案をオンにします。
true
の場合、スペリングの提案が生成されます。スペルチェックが必要な場合は、これが必要です。 spellcheck.q
またはq
-
オプション
デフォルト:なし
このパラメーターは、スペルチェックするクエリを指定します。
spellcheck.q
が定義されている場合は、それが使用されます。それ以外の場合は、元の入力クエリが使用されます。spellcheck.q
パラメーターは、フィールド名、ブーストなどの余分なマークアップを除いた、元のクエリであるように意図されています。q
パラメーターが指定されている場合、SpellingQueryConverter
クラスがそれをトークンに解析するために使用されます。それ以外の場合は、WhitespaceTokenizer が使用されます。どちらを使用するかは、アプリケーション次第です。基本的に、アプリケーションにスペリング「準備完了」バージョンがある場合は、
spellcheck.q
を使用する方がおそらく適切です。それ以外の場合は、Solr にジョブを実行させたいだけの場合は、q
パラメーターを使用します。
SpellingQueryConverter クラスは、非 ASCII 文字を適切に処理しません。この場合、spellcheck.q を使用するか、独自の QueryConverter を実装する必要があります。 |
spellcheck.build
-
オプション
デフォルト:
false
true
に設定すると、このパラメーターはスペルチェックに使用する辞書を作成します。一般的な検索アプリケーションでは、スペルチェックを使用する前に辞書を作成する必要があります。ただし、最初に辞書を作成する必要が必ずしもあるとは限りません。たとえば、スペルチェッカーを構成して、既存の辞書を使用することができます。辞書の作成には時間がかかるため、このパラメーターはすべてのリクエストで送信しないでください。
spellcheck.reload
-
オプション
デフォルト:
false
true
に設定すると、このパラメーターはスペルチェッカーをリロードします。結果は、SolrSpellChecker.reload()
の実装によって異なります。一般的な実装では、スペルチェッカーをリロードするということは、辞書をリロードすることを意味します。 spellcheck.count
-
オプション
デフォルト:説明を参照
このパラメーターは、スペルチェッカーが用語に対して返す提案の最大数を指定します。このパラメーターが設定されていない場合、値はデフォルトで
1
になります。パラメーターが設定されていても、数値が割り当てられていない場合、値はデフォルトで5
になります。パラメーターが正の整数に設定されている場合、その数値がスペルチェッカーによって返される提案の最大数になります。 spellcheck.queryAnalyzerFieldType
-
オプション
デフォルト:なし
Solr のスキーマからのフィールドタイプ。指定されたフィールドタイプ用に構成されたアナライザーは、
q
パラメーターの値をトークン化するために QueryConverter によって使用されます。このパラメーターで指定されたフィールドタイプは、最小限の変換を行う必要があります。通常、たとえば、アグレッシブにステミングや NGram を行うタイプは避けることをお勧めします。これらのタイプの分析はスペルチェックを混乱させる可能性があるためです。
spellcheck.onlyMorePopular
-
オプション
デフォルト:
false
true
の場合、Solr は、既存のクエリよりも多くのヒットを生成する提案を返します。与えられたクエリ用語がインデックスに存在し、「正しい」と見なされている場合でも、これはより一般的な提案を返すことに注意してください。 spellcheck.maxResultsForSuggest
-
オプション
デフォルト:なし
たとえば、これが
5
に設定されており、ユーザーのクエリが 5 つ以下の結果を返す場合、スペルチェッカーは「correctlySpelled=false」を報告し、提案(および要求された場合は照合)も提供します。これをゼロより大きく設定することは、ヒット数が少ないクエリに対して「もしかして?」の提案を作成するのに役立ちます。 spellcheck.alternativeTermCount
-
オプション
デフォルト:なし
インデックスまたは辞書に存在する各クエリ用語に対して返す提案の数を定義します。おそらく、ユーザーは docFrequency>0 の単語については提案を少なくしたいでしょう。また、この値を設定すると、コンテキスト対応のスペル提案が可能になります。
spellcheck.extendedResults
-
オプション
デフォルト:
false
true
の場合、このパラメーターにより、Solr は、インデックス内の各元の用語の頻度(origFreq
)や、インデックス内の各提案の頻度(frequency
)など、スペルチェック結果に関する追加情報を返すようになります。この結果形式は、単語に対して返される提案が実際にはリストの配列であり、各リストに提案された用語とその頻度が保持されるため、拡張されていないものとは異なることに注意してください。 spellcheck.collate
-
オプション
デフォルト:
false
true
の場合、このパラメーターは、Solr に各トークンの最適な提案(存在する場合)を取得し、提案から新しいクエリを作成するように指示します。たとえば、入力クエリが「jawa class lording」で、「jawa」の最適な提案が「java」で、「lording」が「loading」の場合、結果の照合は「java class loading」になります。
spellcheck.collate
パラメーターは、元のfq
パラメーターを適用した場合でも、再クエリするとヒットすることが保証されている照合のみを返します。これは、クエリごとに複数の修正がある場合に特に役立ちます。これは、使用するクエリのみを返します。提案されたクエリは実際には実行しません。 spellcheck.maxCollations
-
オプション
デフォルト:
1
返す照合の最大数。このパラメーターは、
spellcheck.collate
が false の場合は無視されます。 spellcheck.maxCollationTries
-
オプション
デフォルト:
0
このパラメーターは、Solr が照合の可能性をあきらめる前に試行する回数を指定します。値を小さくすると、パフォーマンスが向上します。結果を返すことができる照合を見つけるには、より高い値が必要になる場合があります。デフォルト値の
0
は、照合をチェックしないことと同じです。このパラメーターは、spellcheck.collate
が false の場合は無視されます。 spellcheck.maxCollationEvaluations
-
オプション
デフォルト:
10000
このパラメーターは、インデックスに対してテストする照合候補を決定する前に、ランク付けおよび評価する単語修正の組み合わせの最大数を指定します。これは、ユーザーがスペルミスの単語を多数含むクエリを入力した場合のパフォーマンスのセーフティネットです。
spellcheck.collateExtendedResults
-
オプション
デフォルト:
false
true
の場合、このパラメーターは、Solr が見つけた照合を詳しく説明する拡張された応答形式を返します。これは、spellcheck.collate
が false の場合は無視されます。 spellcheck.collateMaxCollectDocs
-
オプション
デフォルト:
0
このパラメーターは、インデックスに対して潜在的な照合をテストする際に収集されるドキュメントの最大数を指定します。
0
の値は、すべてのドキュメントを収集することを意味し、正確なヒットカウントが得られます。それ以外の場合、正確なヒットカウントが不要な場合にパフォーマンスを最適化するための推定値が提供されます。指定された値が大きいほど、推定値はより正確になります。spellcheck.collateExtendedResults
がfalse
の場合、1
が指定されたかのように常に最適化が使用されます。 spellcheck.collateParam.*
プレフィックス-
オプション
デフォルト:なし
このパラメータープレフィックスは、照合クエリを内部的に検証する際にスペルチェッカーで使用させたい追加のパラメーターを指定するために使用できます。たとえば、通常の検索結果が
q.op=OR
やmm=20%
のようなパラメーターを介して1つ以上のクエリ用語の緩いマッチングを許可している場合でも、spellcheck.collateParam.q.op=AND&spellcheck.collateParam.mm=100%
のようなオーバーライドパラメーターを指定して、少なくとも1つのドキュメントに含まれるすべての単語で構成される照合のみを返すように要求できます。 spellcheck.dictionary
-
オプション
デフォルト:
default
このパラメーターを使用すると、Solr はパラメーターの引数で指定された名前の辞書を使用します。このパラメーターは、リクエストごとに特定のスペルチェッカーを呼び出すために使用できます。
spellcheck.accuracy
-
オプション
デフォルト:説明を参照
スペルチェックの実装が結果が価値があるかどうかを判断するために使用する精度値を指定します。値は 0 から 1 の間の浮動小数点数です。デフォルトは
Float.MIN_VALUE
です。 spellcheck.<DICT_NAME>.key
-
オプション
デフォルト:なし
指定された辞書を処理する実装に対するキーと値のペアを指定します。渡される値は、単に
key=value
です(spellcheck.<DICT_NAME>.
は取り除かれます)。たとえば、
foo
という辞書の場合、spellcheck.foo.myKey=myValue
は、myKey=myValue
が辞書foo
を処理する実装に渡される結果になります。
スペルチェックの例
Solr の bin/solr -e techproducts
の例を使用すると、このクエリは spellcheck.q
パラメーターを使用してクエリを定義し、すべての入力用語が一致する必要があるように照合を強制する簡単なリクエストの結果を示します。
https://127.0.0.1:8983/solr/techproducts/spell?df=text&spellcheck.q=delll+ultra+sharp&spellcheck=true&spellcheck.collateParam.q.op=AND&wt=xml
結果
<lst name="spellcheck">
<lst name="suggestions">
<lst name="delll">
<int name="numFound">1</int>
<int name="startOffset">0</int>
<int name="endOffset">5</int>
<int name="origFreq">0</int>
<arr name="suggestion">
<lst>
<str name="word">dell</str>
<int name="freq">1</int>
</lst>
</arr>
</lst>
<lst name="ultra sharp">
<int name="numFound">1</int>
<int name="startOffset">6</int>
<int name="endOffset">17</int>
<int name="origFreq">0</int>
<arr name="suggestion">
<lst>
<str name="word">ultrasharp</str>
<int name="freq">1</int>
</lst>
</arr>
</lst>
</lst>
<bool name="correctlySpelled">false</bool>
<lst name="collations">
<lst name="collation">
<str name="collationQuery">dell ultrasharp</str>
<int name="hits">1</int>
<lst name="misspellingsAndCorrections">
<str name="delll">dell</str>
<str name="ultra sharp">ultrasharp</str>
</lst>
</lst>
</lst>
</lst>
分散スペルチェック
SpellCheckComponent
は、分散インデックスでのスペルチェックもサポートしています。 "/select" 以外のリクエストハンドラーで SpellCheckComponent を使用する場合は、次の2つのパラメーターを提供する必要があります。
shards
-
必須
デフォルト:なし
分散インデックス構成のシャードを指定します。分散インデックスの詳細については、Solr クラスタ タイプ を参照してください。
shards.qt
-
必須
デフォルト:なし
シャードへのリクエストに Solr が使用するリクエストハンドラーを指定します。このパラメーターは、
/select
リクエストハンドラーには必須ではありません。
例
https://127.0.0.1:8983/solr/techproducts/spell?spellcheck=true&spellcheck.build=true&spellcheck.q=toyata&shards.qt=/spell&shards=solr-shard1:8983/solr/techproducts,solr-shard2:8983/solr/techproducts
SpellCheckComponentへの分散リクエストの場合、spellcheck.count
パラメーターの値が5未満の場合でも、シャードには少なくとも5つの候補がリクエストされます。候補が収集されると、構成された距離測定 (デフォルトではレーベンシュタイン距離) でランク付けされ、次に集計頻度でランク付けされます。