0

今日の課題は、私のストアの製品データベースの検索エンジンを作成することです。

多くの製品が手作業で、多くの異なる手によって作成されています!

したがって、「i-phone 3gs」、「iPhone4」、「iphone5」が見つかる可能性があります。

私が欲しいのは、「iPhone」を検索して、上記の3つの製品結果の例を見つけることです。

それは私に「あいまい検索」を思い出させました。私はそれらをすぐに使用しようとしましたが、成功しませんでした。

「同義語」の結果を取得するには、この種の例(ドキュメント本文内の特殊文字または空白)にインデックスを付けて検索する必要がありますか?

例えば

iPhone=>「i-phone」

"special 40" => "special40"

4

2 に答える 2

0

Luceneを使用する場合、私がお勧めするオプションがいくつかあります。

1つは、 KeywordAnalyzerを使用して商品IDにインデックスを付けてから、ファジークエリを使用して提案どおりにクエリを実行することです。

または、カスタムアナライザーを作成することもできます。このアナライザーでは、WordDelimiterFilter変更時にトークンを作成し、ダッシュとスペース(トークナイザーを通過した後にトークンに存在する場合)を追加します。重要な注意点として、StandardAnalyzer、SimpleAnalyzer、または同様のものを使用している場合は、のWordDelimiterFilter前にが適用されていることを確認する必要がありLowercaseFilterます。もちろん、それを実行するLowercaseFilterと、ラクダのケーシングに基づいて用語を分割することができなくなります。もう1つの注意点として、「I」は一般的な英語のストップワードであるため、 StopFilterをカスタマイズすることをお勧めします。

カスタムアナライザーでは、主にをオーバーライドする必要がありますcreateComponents()。たとえばWordDelimiterFilter、StandardAnalyzerのフィルタセットに機能を追加する場合は、次のようにします。

@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
    Tokenizer tokenizer = new StandardTokenizer(Version.LUCENE_40,reader);
    TokenStream filter = new StandardFilter(Version.LUCENE_40,tokenizer);
    //Take a look at the WordDelimiterFactory API for other options on this filter's behavior
    filter = new WordDelimiterFilter(filter,WordDelimiterFilter.GENERATE_WORD_PARTS,null);
    filter = new LowercaseFilter(Version.LUCENE_40,filter);
    //As mentioned, create a CharArraySet of your stopwords, since the default will likely cause problems for you
    filter = new StopFilter(Version.LUCENE_40,filter,myStopWords);
    return new TokenStreamComponents(tokenizer, filter);
}
于 2013-03-22T18:41:21.017 に答える
0

Solrを使用する場合は、サンプルチュートリアルと対応するschema.xmlを必ず確認してください。そこには、非常によく似たユースケースを示す2つの型定義(en_splittingとen_splitting_tightだと思います)があることがわかります。

具体的には、 LowerCaseFilterおよび場合によってはSynonymFilterによって拡張されたWordDelimiterFilterを見ています。ただし、特に複数単語の同等物との間でマッピングする場合は、SynonymFiltersに少し注意する必要があります。

于 2013-03-22T18:58:27.657 に答える