我创建了一个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的分析中对其进行了测试:
在我在Solr中搜索所有这些之后,它无法正常工作!
如果字段值是:&#34; aaaaemail:something@something.com"我搜索:&#34; aaaa&#34;它会返回此文档!
但它应该只在我搜索时返回:&#34; something@something.com"。我检查了架构浏览器,它只索引了电子邮件(正确的格式)。 我不知道接下来要检查什么!有谁知道我错过了什么?
答案 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>