[ 
https://issues.apache.org/jira/browse/LUCENE-8651?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16748522#comment-16748522
 ] 

Alan Woodward commented on LUCENE-8651:
---------------------------------------

OK, I see what's happening.  The root tokenstream is generated from an 
Analyzer, which calls setReader on its Tokenizer implementation before 
returning it.  This then gets passed to your 
ConcatenatingTokenFilterFactory.create() method, which wraps the tokenstream 
but also adds the decorator - in this case a Tokenizer.

We only go through TokenFilterFactory.create() once though.  Analyzers cache 
the output of TokenStreamComponents for re-use; when the tokenstream comes to 
be re-used, the Analyzer will call setReader on the root again, but it doesn't 
go through TFF.create() again so setReader() doesn't get called on the 
KeywordTokenizer.

I think the solution here is to pull Field$StringTokenStream out to be a 
top-level class that can be used in these sort of cases.

> Tokenizer implementations can't be reset
> ----------------------------------------
>
>                 Key: LUCENE-8651
>                 URL: https://issues.apache.org/jira/browse/LUCENE-8651
>             Project: Lucene - Core
>          Issue Type: Bug
>          Components: modules/analysis
>            Reporter: Dan Meehl
>            Priority: Major
>         Attachments: LUCENE-8650-2.patch, LUCENE-8651.patch
>
>
> The fine print here is that they can't be reset without calling setReader() 
> every time before reset() is called. The reason for this is that Tokenizer 
> violates the contract put forth by TokenStream.reset() which is the following:
> "Resets this stream to a clean state. Stateful implementations must implement 
> this method so that they can be reused, just as if they had been created 
> fresh."
> Tokenizer implementation's reset function can't reset in that manner because 
> their Tokenizer.close() removes the reference to the underlying Reader 
> because of LUCENE-2387. The catch-22 here is that we don't want to 
> unnecessarily keep around a Reader (memory leak) but we would like to be able 
> to reset() if necessary.
> The patches include an integration test that attempts to use a 
> ConcatenatingTokenStream to join an input TokenStream with a KeywordTokenizer 
> TokenStream. This test fails with an IllegalStateException thrown by 
> Tokenizer.ILLEGAL_STATE_READER.
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to