特定のテキストから電子メールを取得して電子メールのみを返すSolrフィルタを作成しました。私は私のログを取得するためのコードと、いくつかのSYSOUTを追加しましたSolrのカスタムメールフィルタが機能しません
<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でのフィールド型とフィールドを追加しました
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;
}
:
この
は私のコードですできます!それはトークンを取得し、電子メールトークンだけが返されます!私はまた、Solrの中分析にそれをテストしてみた:私はSolrの中で検索した場合、このすべての後
、それは動作しません!
フィールド値が "aaaaemail:[email protected]"で、I検索: "aaaa"がこのドキュメントを返すような場合
しかし、「[email protected]」を検索すると、これが返されます。私はそれが電子メール(正しい形式)だけをインデックスしているスキーマブラウザをチェックしました。 私は次に何をチェックするのか分かりません!誰か私が逃していることを知っていますか?
こんにちは、このすべての後で私のデータにインデックスを付けると、全体のテキストが表示されます。全文を表示するものは何ですか?それはクエリの結果ですか? –
@CliffWillsherはい私はそれを編集しました!気づいてくれてありがとう! – saeedeh
これを 'solr.PatternReplaceCharFilterFactory'で実装できなかった理由はありますか? – MatsLindh