2017-07-26 69 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