2222import org .apache .lucene .analysis .Analyzer ;
2323import org .apache .lucene .analysis .TokenStream ;
2424import org .apache .lucene .analysis .Tokenizer ;
25- import org .elasticsearch .index .analysis .CustomAnalyzerProvider .AnalyzerComponents ;
2625
2726import java .io .Reader ;
2827
29- public class CustomAnalyzer extends Analyzer {
28+ public final class CustomAnalyzer extends Analyzer implements TokenFilterComposite {
3029
30+ private final String tokenizerName ;
31+ private final TokenizerFactory tokenizerFactory ;
32+
33+ private final CharFilterFactory [] charFilters ;
34+
35+ private final TokenFilterFactory [] tokenFilters ;
36+
37+ private final int positionIncrementGap ;
38+ private final int offsetGap ;
3139 private final AnalysisMode analysisMode ;
32- protected volatile AnalyzerComponents components ;
3340
3441 public CustomAnalyzer (String tokenizerName , TokenizerFactory tokenizerFactory , CharFilterFactory [] charFilters ,
35- TokenFilterFactory [] tokenFilters ) {
36- this (new AnalyzerComponents (tokenizerName , tokenizerFactory , charFilters , tokenFilters , 0 , -1 ), GLOBAL_REUSE_STRATEGY );
42+ TokenFilterFactory [] tokenFilters ) {
43+ this (tokenizerName , tokenizerFactory , charFilters , tokenFilters , 0 , -1 );
44+ }
45+
46+ public CustomAnalyzer (String tokenizerName , TokenizerFactory tokenizerFactory , CharFilterFactory [] charFilters ,
47+ TokenFilterFactory [] tokenFilters , int positionIncrementGap , int offsetGap ) {
48+ this .tokenizerName = tokenizerName ;
49+ this .tokenizerFactory = tokenizerFactory ;
50+ this .charFilters = charFilters ;
51+ this .tokenFilters = tokenFilters ;
52+ this .positionIncrementGap = positionIncrementGap ;
53+ this .offsetGap = offsetGap ;
54+ // merge and transfer token filter analysis modes with analyzer
55+ AnalysisMode mode = AnalysisMode .ALL ;
56+ for (TokenFilterFactory f : tokenFilters ) {
57+ mode = mode .merge (f .getAnalysisMode ());
58+ }
59+ this .analysisMode = mode ;
60+ }
61+
62+ /**
63+ * The name of the tokenizer as configured by the user.
64+ */
65+ public String getTokenizerName () {
66+ return tokenizerName ;
67+ }
68+
69+ public TokenizerFactory tokenizerFactory () {
70+ return tokenizerFactory ;
3771 }
3872
39- CustomAnalyzer (AnalyzerComponents components , ReuseStrategy reuseStrategy ) {
40- super (reuseStrategy );
41- this .components = components ;
42- this .analysisMode = calculateAnalysisMode (components );
73+ public TokenFilterFactory [] tokenFilters () {
74+ return tokenFilters ;
4375 }
4476
45- public AnalyzerComponents getComponents () {
46- return this . components ;
77+ public CharFilterFactory [] charFilters () {
78+ return charFilters ;
4779 }
4880
4981 @ Override
5082 public int getPositionIncrementGap (String fieldName ) {
51- return this .components . getPositionIncrementGap () ;
83+ return this .positionIncrementGap ;
5284 }
5385
5486 @ Override
5587 public int getOffsetGap (String field ) {
56- if (this . components . getOffsetGap () < 0 ) {
88+ if (offsetGap < 0 ) {
5789 return super .getOffsetGap (field );
5890 }
59- return this .components . getOffsetGap () ;
91+ return this .offsetGap ;
6092 }
6193
6294 public AnalysisMode getAnalysisMode () {
@@ -65,20 +97,18 @@ public AnalysisMode getAnalysisMode() {
6597
6698 @ Override
6799 protected TokenStreamComponents createComponents (String fieldName ) {
68- final AnalyzerComponents components = getComponents ();
69- Tokenizer tokenizer = components .getTokenizerFactory ().create ();
100+ Tokenizer tokenizer = tokenizerFactory .create ();
70101 TokenStream tokenStream = tokenizer ;
71- for (TokenFilterFactory tokenFilter : components . getTokenFilters () ) {
102+ for (TokenFilterFactory tokenFilter : tokenFilters ) {
72103 tokenStream = tokenFilter .create (tokenStream );
73104 }
74105 return new TokenStreamComponents (tokenizer , tokenStream );
75106 }
76107
77108 @ Override
78109 protected Reader initReader (String fieldName , Reader reader ) {
79- final AnalyzerComponents components = getComponents ();
80- if (components .getCharFilters () != null && components .getCharFilters ().length > 0 ) {
81- for (CharFilterFactory charFilter : components .getCharFilters ()) {
110+ if (charFilters != null && charFilters .length > 0 ) {
111+ for (CharFilterFactory charFilter : charFilters ) {
82112 reader = charFilter .create (reader );
83113 }
84114 }
@@ -87,42 +117,18 @@ protected Reader initReader(String fieldName, Reader reader) {
87117
88118 @ Override
89119 protected Reader initReaderForNormalization (String fieldName , Reader reader ) {
90- final AnalyzerComponents components = getComponents ();
91- for (CharFilterFactory charFilter : components .getCharFilters ()) {
92- reader = charFilter .normalize (reader );
93- }
94- return reader ;
120+ for (CharFilterFactory charFilter : charFilters ) {
121+ reader = charFilter .normalize (reader );
122+ }
123+ return reader ;
95124 }
96125
97126 @ Override
98127 protected TokenStream normalize (String fieldName , TokenStream in ) {
99- final AnalyzerComponents components = getComponents ();
100- TokenStream result = in ;
101- for (TokenFilterFactory filter : components .getTokenFilters ()) {
102- result = filter .normalize (result );
103- }
104- return result ;
105- }
106-
107- private static AnalysisMode calculateAnalysisMode (AnalyzerComponents components ) {
108- // merge and transfer token filter analysis modes with analyzer
109- AnalysisMode mode = AnalysisMode .ALL ;
110- for (TokenFilterFactory f : components .getTokenFilters ()) {
111- mode = mode .merge (f .getAnalysisMode ());
112- }
113- return mode ;
114- }
115-
116- /**
117- * Factory method that either returns a plain {@link CustomAnalyzer} if the components used for creation are supporting index and search
118- * time use, or a {@link ReloadableCustomAnalyzer} if the components are intended for search time use only.
119- */
120- static CustomAnalyzer create (AnalyzerComponents components ) {
121- AnalysisMode mode = calculateAnalysisMode (components );
122- if (mode .equals (AnalysisMode .SEARCH_TIME )) {
123- return new ReloadableCustomAnalyzer (components );
124- } else {
125- return new CustomAnalyzer (components , GLOBAL_REUSE_STRATEGY );
126- }
128+ TokenStream result = in ;
129+ for (TokenFilterFactory filter : tokenFilters ) {
130+ result = filter .normalize (result );
131+ }
132+ return result ;
127133 }
128134}
0 commit comments