私たちは映画とシリーズのデータベースを持っており、さまざまな信頼性のある情報源から得られたデータなので、エピソードのタイトルにファジーストリングマッチングをしたいと思っています。私たちはアプリケーションでSolrを使用していますが、デフォルトのマッチングメカニズムは単語レベルで動作します。短い文字列にはタイトルのようには機能しません。n-gramsをSolrと近似マッチングする方法は?
私は過去にnグラム近似マッチングを使用していました。 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" />
しかし、これは期待どおりに機能しません。クエリ分析は と正しく見えますが、私は 何かがインデックス時に起きると信じさせる(つまり、タイトルは trigramフィールドの代わりにデフォルトの文字列フィールドのように索引付けされています)。
私がしようとしているクエリが
title:"guy walks into a psychiatrist office"
(タイプミスでまたは2)
のようなもので、それは「ガイは、精神科医のオフィスに歩く」と一致する必要があります。
(私は、クエリが正しいかどうか、本当にわからない。)
また、私は実際にはもっと何かをできるようにしたいと思います。 文字列を小文字にして、すべての句読点と空白を削除して、 英語のストップワードを削除してから、文字列をトライグラムに変更します。ただし、 フィルタは文字列がトークン化された後にのみ適用されます。
ご回答いただきありがとうございます。
あなたが使用しているクエリを投稿することができますか? – olle
質問を編集して質問例を追加しました。 –