私たちは映画とシリーズのデータベースを持っています。データはさまざまな信頼性のある多くのソースから取得されているため、エピソードのタイトルでファジー文字列マッチングを実行できるようにしたいと考えています。アプリケーションの検索に Solr を使用していますが、デフォルトのマッチング メカニズムは単語レベルで動作するため、タイトルなどの短い文字列には十分ではありません。
私は過去に n-gram 近似マッチングを使用していましたが、Lucene (および Solr) がすぐに使用できる機能をサポートしていることを知り、とてもうれしく思いました。残念ながら、正しく設定できませんでした。
これには特別なフィールド タイプが必要だと思ったので、次のフィールド タイプを schema.xml に追加しました。
<fieldType
name="trigrams"
stored="true"
class="solr.StrField">
<analyzer type="index">
<tokenizer
class="solr.analysis.NGramTokenizerFactory"
minGramSize="3"
maxGramSize="5"
/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
スキーマの適切なフィールドを次のように変更しました。
<field name="title" type="trigrams"
indexed="true" stored="true" multiValued="false" />
しかし、これは私が期待したようには機能しません。クエリ分析は正しく見えますが、結果が得られないため、インデックス時に何かが発生したと思われます (つまり、タイトルはトリグラム フィールドではなく、デフォルトの文字列フィールドのようにインデックス化されます)。
私がしようとしているクエリは次のようなものです
title:"guy walks into a psychiatrist office"
(タイプミスが 1 つまたは 2 つある場合)、「Guy Walks into a Psychiatric Office」と一致するはずです。
(クエリが正しいかどうかはよくわかりません。)
また、本当はもっと何かできるようになりたいです。文字列を小文字にし、句読点とスペースをすべて削除し、英語のストップワードを削除してから、文字列をトライグラムに変更したいと思います。ただし、フィルターは文字列がトークン化された後にのみ適用されます...
ご回答ありがとうございます。