11

私たちは映画とシリーズのデータ​​ベースを持っています。データはさまざまな信頼性のある多くのソースから取得されているため、エピソードのタイトルでファジー文字列マッチングを実行できるようにしたいと考えています。アプリケーションの検索に 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」と一致するはずです。

(クエリが正しいかどうかはよくわかりません。)

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

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

4

2 に答える 2

10

質問の最後の部分に答えるには、solr には ngram フィルターもあります。したがって、ngram トークナイザー (ただし、たとえば "WhitespaceTokenizer" のようなもの) を使用しないでください。すべての pre-ngram フィルターを適用してから、次のフィルターを追加してください。

<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" />
于 2009-08-23T15:03:59.487 に答える
4

解決策は非常に単純であることが判明しました。AND がデフォルトの演算子として設定され、ngram のいずれかが一致しない場合、クエリ全体が失敗しました。したがって、次を追加するだけで十分でした。

<solrQueryParser defaultOperator="OR" />

私のスキーマ定義で。

于 2009-08-22T00:32:21.840 に答える