24

How can I enable different analyzers for each field in a document I'm indexing with Lucene? Example:

        RAMDirectory dir = new RAMDirectory();
        IndexWriter iw = new IndexWriter(dir, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.UNLIMITED);
        Document doc = new Document();
        Field field1 = new Field("field1", someText1, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);
        Field field2 = new Field("field2", someText2, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);
        doc.Add(field1);
        doc.Add(field2);
        iw.AddDocument(doc);
        iw.Commit();

The analyzer is an argument to the IndexWriter, but I want to use StandardAnalyzer for field1 and SimpleAnalyzer for field2, how can I do that? The same applies when searching, of course. The correct analyzer must be applied for each field.

Rabbit
  • 1,741
  • 2
  • 18
  • 27

3 Answers3

31

PerFieldAnalyzerWrapper is what you are looking for. The equivalent of this in Lucene.net is here.

femtoRgon
  • 32,893
  • 7
  • 60
  • 87
Shashikant Kore
  • 4,952
  • 3
  • 31
  • 40
10
Map<String, Analyzer> analyzerMap = new HashMap<String, Analyzer>();
analyzerMap.put(fieldone, new IKAnalyzer4PinYin(false, IKAnalyzer4PinYin.PINYIN));
analyzerMap.put(fieldtwo, new IKAnalyzer4PinYin(false, KAnalyzer4PinYin.PINYIN_SHOUZIMU));
PerFieldAnalyzerWrapper wrapper = new PerFieldAnalyzerWrapper(new IKAnalyzer4PinYin(false), analyzerMap);

IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_40 , wrapper);
Dominik Sandjaja
  • 6,326
  • 6
  • 52
  • 77
user2098849
  • 231
  • 4
  • 9
4

Necromancing.
For C#:

Lucene.Net.Util.LuceneVersion version = Lucene.Net.Util.LuceneVersion.LUCENE_48;

Dictionary<string, Lucene.Net.Analysis.Analyzer> fieldAnalyzers = 
    new Dictionary<string, Lucene.Net.Analysis.Analyzer>(System.StringComparer.OrdinalIgnoreCase);

fieldAnalyzers["YourFieldName"] = new Lucene.Net.Analysis.Core.KeywordAnalyzer();

Lucene.Net.Analysis.Miscellaneous.PerFieldAnalyzerWrapper wrapper = 
    new Lucene.Net.Analysis.Miscellaneous.PerFieldAnalyzerWrapper(
        new Lucene.Net.Analysis.Core.KeywordAnalyzer(), fieldAnalyzers);

Lucene.Net.Index.IndexWriterConfig writerConfig = new Lucene.Net.Index.IndexWriterConfig(version, wrapper);
Stefan Steiger
  • 78,642
  • 66
  • 377
  • 442