2017-07-26 73 views
2

我創建了Solr過濾器來從特定文本中檢索電子郵件並僅返回電子郵件!Solr中的自定義電子郵件過濾器不起作用

這是我的代碼:

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; 
    } 

我添加

<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中的字段類型和領域有用!它獲取令牌並且只有電子郵件令牌會返回!

我也Solr中測試了分析:

my results

這一切後,當我在Solr的搜索,這是行不通的!

喜歡如果字段值是:「aaaaemail:[email protected]」,我搜索:「aaaa」它返回此文檔!

但它應該只會返回這個時,我搜索:「[email protected]」。我檢查了模式瀏覽器,它只索引了電子郵件(正確的形式)。 我不知道接下來要檢查什麼!有誰知道我錯過了什麼?

+1

嗨,你能否澄清這一點:「在索引我的數據之後,它顯示了整個文本」。什麼顯示全文?這是查詢的結果嗎? –

+0

@CliffWillsher是的,我編輯它!感謝您的注意! – saeedeh

+0

你爲什麼不能用'solr.PatternReplaceCharFilterFactory'實現這個任何理由? – MatsLindh

回答

1

無需自定義代碼。您需要反轉什麼是Remove email address from solr indexing

如此描述,你會利用UAX29URLEmailTokenizer的類型爲元數據添加到您的文字標記,然後使用TypeTokenFilter只讓那些類型通是你喜歡的。在你的情況下,這只是<EMAIL>

改變你的字段類型emailnormalizedschema.xml中如下

<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> 

創建一個在你的conf文件夾命名爲email_type.txt文件,應該是一樣的地方,你是的schema.xml居民。這個文件需要的內容

<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

謝謝非常完美! – saeedeh