2017-11-13 14 views
2

私はLucene.netを使用しています。製品のデータベース内のアイテムに異なる名前を付けたり、スペルが異なると、拡張された用語を提供するためにSynonymFilterを実装しようとしています。 "spanner"> "wrench"、または "lawnmower"> "lawn mower"を選択します。テスト・I・セットアップとしてLucene.Net複数の語句を含むSynonymFilter

SynonymMap次のように:「スパナ」または「レンチ」の検索

String base1 = "lawnmower"; 
String syn1 = "lawn mower"; 
String base2 = "spanner"; 
String syn2 = "wrench"; 

SynonymMap.Builder sb = new SynonymMap.Builder(true); 
sb.Add(new CharsRef(base1), new CharsRef(syn1), true); 
sb.Add(new CharsRef(base2), new CharsRef(syn2), true); 
SynonymMap smap = sb.Build(); 

は「芝刈り機」または「芝刈り機」を検索中のいずれかの単語をすべての用語に戻します入力検索条件に正確に一致する用語を戻します。

シノニム内の複数の語句に対して何か別のことが必要ですか?

また、「lawnmower」、「lawn mower」、「mower」、「grass cutter」などの用語を3つ以上に拡張するにはどうすればよいですか?

おかげ

答えて

2

ユニットテストでのマルチワード同義語のan exampleがあります。あなたは自分で単語を分割し、それらの間にSynonymMap.WORD_SEPARATOR(ヌル文字)を挿入する必要があります。これを容易にするために、SynonymMap.BuilderJoinメソッドがあります。

ここでは、これをすばやく行うための拡張方法を示します。同義語にスペースが含まれているかどうか

public static class SynonymMapBuilderExtensions 
{ 
    private static Regex Space = new Regex(" +", RegexOptions.Compiled); 

    public static void AddPhrase(this SynonymMap.Builder builder, string input, 
     string output, bool keepOrig) 
    { 
     CharsRef outputRef = builder.Join(Space.Split(output), new CharsRef()); 
     builder.Add(new CharsRef(input), outputRef, keepOrig); 
    } 
} 

あなたは、この拡張メソッドを使用することができ、あなたはあなたのコードのどこにそれらを必要としない場合CharsRefオブジェクトの作成を気にする必要はありません。

String base1 = "lawnmower"; 
String syn1 = "lawn mower"; 
String base2 = "spanner"; 
String syn2 = "wrench"; 

SynonymMap.Builder sb = new SynonymMap.Builder(true); 
sb.AddPhrase(base1, syn1, true); 
sb.AddPhrase(base2, syn2, true); 
SynonymMap smap = sb.Build(); 
+0

ありがとうございました。私が3つ以上の用語をすべて互いにマップしたい場合、どのようにして3つ以上の用語、例えば「芝刈り機」、「芝刈り機」、「草刈り機」、「草刈り機」に拡張するのですか?各バリエーションをお互いにマップする必要がありますか? – chilluk

+0

わかりませんが、それがうまくいく唯一の方法であることは妥当と思われます。すべてのシノニムをリストに追加し、[この組み合わせの拡張方法](https://stackoverflow.com/a/32479803/)を使用してすべてのマッピングを追加することで、すべての組み合わせを簡単に追加することができます。 – NightOwl888

+0

したがって、> b、b> a、a> c、c> a、b> c、c> bを追加する必要がありますか?私は組み込みのインデックスと入力クエリの両方でこれを行うために探していますか?私のソースデータでは、用語のバリエーションが異なる可能性があります。明らかに、人々がどのように検索するのか予測できません。または、すべての代替条件を探すためにクエリを処理するだけで十分ですか?シノニムを追加するときに元の値を保持しますか?ボンネットの下で何が起こっているのかを知るために何が作られているのかを「見る」ことができないので、ベストなアプローチをとることができます。 – chilluk

関連する問題