1

「単語」と「語幹」の機能を備えたドキュメントがあります。1つの単語に複数の語幹がある場合があるため、位置の増分を操作する「語幹」機能にインデックスを付けます。私はそれを次のように行います:

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

コードで、フィールドを固定の文字列値で初期化して保存し、トークンストリームをその中に渡すことがわかります(このソリューションは、stackoverflowのどこかにあります)。ステムを使用してjoin_tokenごとにこれらの正確な手順を実行します。その結果、私はルークの私の単語のTermVectorを監視し、1つの単語の複数の語幹が連続して(異なる!)表示されますが、それらは1つの単一の位置を共有する必要があります。何が問題なのですか?

4

1 に答える 1

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
于 2013-03-02T20:53:54.553 に答える