2017-07-26 10 views
2

特定のテキストから電子メールを取得して電子メールのみを返すSolrフィルタを作成しました。私は私のログを取得するためのコードと、いくつかのSYSOUTを追加しましたSolrのカスタムメールフィルタが機能しません

<fieldType name="emailnormalized" class="solr.TextField"> 
    <analyzer type="query"> 
    <tokenizer class="solr.ClassicTokenizerFactory"/> 
    <filter class="ir.pandapp.NormalizeAffliationFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="index"> 
    <tokenizer class="solr.ClassicTokenizerFactory"/> 
    <filter class="ir.pandapp.NormalizeAffliationFilterFactory"/> 
<filter class="ir.pandapp.NormalizeAffliationFilterFactory"/> 
<filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

<field name="mods.affiliation" type="emailnormalized" indexed="true" stored="true" multiValued="true"/> 

のschema.xmlでのフィールド型とフィールドを追加しました

public final class NormalizeAffliationFilter extends TokenFilter { 
private CharTermAttribute charTermAttr; 
    protected NormalizeAffliationFilter(TokenStream ts) { 
    super(ts); 
    this.charTermAttr = addAttribute(CharTermAttribute.class); 
    } 
    @Override 
    public boolean incrementToken() throws IOException { 
    if (!input.incrementToken()) { 
     return false; 
    } 

    String token =charTermAttr.toString(); 
     Pattern pattern = Pattern.compile("([a-z0-9_.-]+)@([a-z0-9_.-]+[a-z])"); 
     Matcher matcher = pattern.matcher(token); 
     StringBuilder sb = new StringBuilder(); 
     while(matcher.find()){ 
      sb.append(matcher.group()); 
     } 
     sb.append(" "); 
    String email = sb.toString(); 
     charTermAttr.setEmpty(); 
     charTermAttr.copyBuffer(email.toCharArray(), 0, email.length()); 

    return true; 
    } 

この

は私のコードですできます!それはトークンを取得し、電子メールトークンだけが返されます!私はまた、Solrの中分析にそれをテストしてみた

:私はSolrの中で検索した場合、このすべての後

my results

、それは動作しません!

フィールド値が "aaaaemail:[email protected]"で、I検索: "aaaa"がこのドキュメントを返すような場合

しかし、「[email protected]」を検索すると、これが返されます。私はそれが電子メール(正しい形式)だけをインデックスしているスキーマブラウザをチェックしました。 私は次に何をチェックするのか分かりません!誰か私が逃していることを知っていますか?

+1

こんにちは、このすべての後で私のデータにインデックスを付けると、全体のテキストが表示されます。全文を表示するものは何ですか?それはクエリの結果ですか? –

+0

@CliffWillsherはい私はそれを編集しました!気づいてくれてありがとう! – saeedeh

+0

これを 'solr.PatternReplaceCharFilterFactory'で実装できなかった理由はありますか? – MatsLindh

答えて

1

カスタムコードは不要です。あなたは、あなたのテキストのトークンに種類のメタデータを追加し、それらのタイプがあなたの好みであることを通過させるだけにTypeTokenFilterを使用するUAX29URLEmailTokenizerを利用しますそのようにRemove email address from solr indexing

に記述されているものを反転する必要があります。あなたの場合、これは<EMAIL>です。

<fieldType name="emailnormalized" class="solr.TextField"> 
    <analyzer> 
     <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/> 
     <filter class="solr.TypeTokenFilterFactory" 
       types="email_type.txt" useWhitelist="true"/> 
     <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer> 
</fieldType> 

を次のようにあなたのschema.xmlがある同じ場所である必要があり、あなたのconfフォルダに email_type.txt という名前のファイルを作成し、あなたのschema.xmlをであなたのフィールドタイプemailnormalizedを変更居住者。このファイルには、コンテンツのちょうど1ライン

<EMAIL> 

は、あなたがそのトークナイザで使用されている区切り文字に問題があるなら、あなたはPatternReplaceCharFilterを使用していることを微調整することができます必要があります。 CharFiltersはTokenizerの前に置くことができます。これは、イメージのサンプルテキストでも機能し、コロンを空白に置き換えます。

<fieldType name="emailnormalized" class="solr.TextField"> 
    <analyzer> 
     <charFilter class="solr.PatternReplaceCharFilterFactory" 
        pattern=":" replacement=" "/> 
     <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/> 
     <filter class="solr.TypeTokenFilterFactory" types="email_type.txt" useWhitelist="true"/> 
     <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer> 
</fieldType> 
+0

を使用しています@CliffWillsherテキスト saeedeh

関連する問題