2009-08-20 9 views
9

私たちは映画とシリーズのデータ​​ベースを持っており、さまざまな信頼性のある情報源から得られたデータなので、エピソードのタイトルにファジーストリングマッチングをしたいと思っています。私たちはアプリケーションで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)

のようなもので、それは「ガイは、精神科医のオフィスに歩く」と一致する必要があります。

(私は、クエリが正しいかどうか、本当にわからない。)

また、私は実際にはもっと何かをできるようにしたいと思います。 文字列を小文字にして、すべての句読点と空白を削除して、 英語のストップワードを削除してから、文字列をトライグラムに変更します。ただし、 フィルタは文字列がトークン化された後にのみ適用されます。

ご回答いただきありがとうございます。

+0

あなたが使用しているクエリを投稿することができますか? – olle

+0

質問を編集して質問例を追加しました。 –

答えて

3

解決策は非常に簡単であることが判明しました:ANDがデフォルトの演算子として設定され、ngramのいずれかが一致しなかった場合、クエリ全体が失敗しました。したがって、スキーマ定義には、

<solrQueryParser defaultOperator="OR" /> 

を追加するだけで十分でした。

+5

あなたの答えは、事後確率がnグラムとは関係がないように見えます。私は正しい? –

+2

@RyszardSzopa「OR」は、nグラム分析と挑戦的ではありません。 'OR'では多くの結果が得られますが、一般的にはかなり悪い結果になります。 –

9

あなたの質問の最後に答えてください:solrにはngramフィルタもあります。だから、NGRAMトークナイザ(しかし、例えば「WhitespaceTokenizer」のようなもの)を使用するすべての事前のngramフィルタを適用し、これを追加しないでください。

<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" /> 
関連する問題