Solr中的自定义电子邮件过滤器不起作用

时间:2017-07-26 05:37:23

标签: java xml solr schema

我创建了一个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;
   }

我在schema.xml中添加了字段类型和字段

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

我已经在我的代码中添加了一些sysout来获取日志并且它可以工作!它获取令牌,只返回电子邮件令牌!

我还在Solr的分析中对其进行了测试:

my results

在我在Solr中搜索所有这些之后,它无法正常工作!

如果字段值是:&#34; aaaaemail:something@something.com"我搜索:&#34; aaaa&#34;它会返回此文档!

但它应该只在我搜索时返回:&#34; something@something.com"。我检查了架构浏览器,它只索引了电子邮件(正确的格式)。 我不知道接下来要检查什么!有谁知道我错过了什么?

1 个答案:

答案 0 :(得分:1)

无需自定义代码。您需要反转Remove email address from solr indexing

中描述的内容

因此,您将使用UAX29URLEmailTokenizer将类型元数据添加到文本的标记中,然后使用TypeTokenFilter仅让这些类型通过您喜欢的类型。在您的情况下,这只是<EMAIL>

更改 schema.xml 中的字段类型emailnormalized,如下所示

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