Lucene setPositionIncrement не работает

У меня есть документы с функциями «слово» и «стебель». У одного слова может быть несколько основ, поэтому я индексирую признаки «основы», управляя приращением позиции. Я делаю это следующим образом:

FieldType type = new FieldType();
type.setIndexed(true);
type.setStored(true);
type.setOmitNorms(true);
type.setTokenized(true);
type.setStoreTermVectorOffsets(true);
type.setStoreTermVectorPositions(true);
type.setStoreTermVectors(true);

String join_token = tok.nextToken(); // token is like "stem1 stem2 stem3"
TokenStream stream = new WhitespaceTokenizer(Version.LUCENE_41, new StringReader(join_token));
PositionIncrementAttribute attr = stream.addAttribute(PositionIncrementAttribute.class);
attr.setPositionIncrement(0);
stream.addAttribute(OffsetAttribute.class);
stream.addAttribute(CharTermAttribute.class);
feature = new Field(name,
                    join_token,
                    type);
feature.setTokenStream(stream);
doc.add(feature);

Вы видите в коде, что я инициализирую поле с фиксированным значением String для его сохранения, а затем передаю в него поток токенов (я нашел это решение где-то здесь, в stackoverflow). Я выполняю эти точные шаги для каждого join_token со стеблями. В результате я смотрю на TermVector моих слов в Луке, и несколько основ для одного слова появляются последовательно (разные!), В то время как они должны занимать одну позицию. Что пойдет не так?


person Igor Shalyminov    schedule 02.03.2013    source источник
comment
являются ли они последовательными с точки зрения значений «положения» или значений «смещения»?   -  person phanin    schedule 02.03.2013


Ответы (1)


Похоже, ваша проблема в том, что вы на самом деле не инициализируете TokenStream, поэтому, когда вы делаете attr.setPositionIncrement(0);, он не устанавливает его для каждого токена в потоке. Если бы вы хотели сделать это вручную, вам пришлось бы перебирать каждый токен в потоке и setPositionIncrement(0) для каждого.

Однако вы можете изучить использование PositionFilter вместо этого. Он будет обрабатывать установку приращения позиции на 0 для вас по мере использования потока.

Это будет выглядеть следующим образом:

String join_token = tok.nextToken(); // token is like "stem1 stem2 stem3"
TokenStream stream = new WhitespaceTokenizer(Version.LUCENE_41, new StringReader(join_token));
stream = new PositionFilter(stream, 0); // 0 also happens to be the default
person smerchek    schedule 02.03.2013