Различные анализаторы для каждого поля - PullRequest
22 голосов
/ 16 мая 2010

Как включить разные анализаторы для каждого поля в документе, который я индексирую с помощью Lucene?Пример:

        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();

Анализатор является аргументом для IndexWriter, но я хочу использовать StandardAnalyzer для field1 и SimpleAnalyzer для field2, как я могу это сделать?То же самое относится и к поиску, конечно.Для каждого поля должен быть применен правильный анализатор.

Ответы [ 2 ]

27 голосов
/ 16 мая 2010

PerFieldAnalyzerWrapper - это то, что вы ищете. Эквивалент этого в Lucene.net: здесь .

9 голосов
/ 10 июля 2013
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);
...