Lucene setPositionIncrement не работи

Имам документи с функции "word" и "stem". Една дума може да има няколко корена, така че аз индексирам характеристиките на "ствола", манипулиращи стъпките на позицията. Правя го по следния начин:

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

Виждате в кода, че аз инициализирам Field с фиксирана стойност на 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