我創建了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中測試了分析:
這一切後,當我在Solr的搜索,這是行不通的!
喜歡如果字段值是:「aaaaemail:[email protected]」,我搜索:「aaaa」它返回此文檔!
但它應該只會返回這個時,我搜索:「[email protected]」。我檢查了模式瀏覽器,它只索引了電子郵件(正確的形式)。 我不知道接下來要檢查什麼!有誰知道我錯過了什麼?
嗨,你能否澄清這一點:「在索引我的數據之後,它顯示了整個文本」。什麼顯示全文?這是查詢的結果嗎? –
@CliffWillsher是的,我編輯它!感謝您的注意! – saeedeh
你爲什麼不能用'solr.PatternReplaceCharFilterFactory'實現這個任何理由? – MatsLindh