LuckyLuke
LuckyLuke

Reputation: 49097

Creating synonym filter programmatically

I am struggling with the creation of a SynonymFilter that I try to create programmatically. How are you supposed to tell the filter where the synonym list is?

I am using Hibernate Search, but I don't want to use the @AnalyzerDef annotation. All I can do is pass a synonym map?

private class AllAnalyzer extends Analyzer {

    private SynonymFilterFactory synonymFilterFactory = new SynonymFilterFactory();

    public AllAnalyzer() {
        ClassLoader classLoader = getClass().getClassLoader();
        String filePath = classLoader.getResource("synonyms.txt").getFile();
        HashMap<String, String> stringStringHashMap = new HashMap<String, String>();
        stringStringHashMap.put("synonyms", filePath);
        stringStringHashMap.put("format", "solr");
        stringStringHashMap.put("ignoreCase", "false");
        stringStringHashMap.put("expand", "true");
        stringStringHashMap.put("luceneMatchVersion", Version.LUCENE_36.name());
        synonymFilterFactory.init(stringStringHashMap);
    }

    @Override
    public TokenStream tokenStream(String fieldName, Reader reader) {
        TokenStream result = null;
        result = new StandardTokenizer(Version.LUCENE_36, reader);
        result = new StandardFilter(Version.LUCENE_36, result);
        result = synonymFilterFactory.create(result);
        return result;
    }
}

Unable to get it to work. When I debug it says that the map is null and I get a NPE. What is wrong?

Upvotes: 0

Views: 1458

Answers (1)

femtoRgon
femtoRgon

Reputation: 33351

Yes, you need to pass a SynonymMap to the SynonymFilter.

Sounds like you want to populate it from a file, so you'll likely want to use SolrSynonymParser to generate it. Along the lines of:

SolrSynonymParser parser = new SolrSynonymParser(true, false, analyzer);
Reader synonymFileReader = new FileRader(new File(path));
parser.add(synonymFileReader);
SynonymMap map = parser.build(); // SolrSynonymParser extends SynonymMap.Builder

Upvotes: 1

Related Questions