AttributeFactory
創建AttributeImpl
s,它們是Attribute
s的來源。屬性控制TokenStream
的行爲,這是用於讀取/跟蹤StandardTokenizer
的數據流的基礎機制。
小已從4.x的改變相對於該AttributeFactory
到5.x - 兩個版本中,您可以創建一個StandardTokenizer
與AttributeFactory
,如果你願意,或者如果你不指定一個,然後AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY
最終會被使用。
最大的區別是你也可以在輸入流中傳入Reader
作爲構造函數的一部分。這意味着在4.x中,您將不得不爲每個想要處理的輸入流創建一個新的StreamTokenizer,而這又必須重新初始化AttributeFactory
中的屬性。
我不是Lucene的開發者,但我的猜測是,這只是一個重組,鼓勵在多個流的閱讀中重用屬性。如果您看看TokenStream的內部結構和默認的AttributesFactory實現,那麼創建和設置屬性會涉及很多反射。如果我不得不猜測,剛剛刪除了帶讀者的構造函數,以鼓勵重用標記器及其屬性,因爲這些屬性的初始化相對昂貴。
編輯
添加一個期待已久的例子 - 抱歉,沒有這個領導:
// Define your attribute factory (or use the default) - same between 4.x and 5.x
AttributeFactory factory = AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY;
// Create the tokenizer and prepare it for reading
// Lucene 4.x
StandardTokenizer tokenizer =
new StandardTokenizer(factory, new StringReader("Tokenize me!"));
tokenizer.reset();
// Lucene 5.x
StandardTokenizer tokenizer = new StandardTokenizer(factory);
tokenizer.setReader(new StringReader("Tokenizer me!"));
tokenizer.reset();
// Then process tokens - same between 4.x and 5.x
// NOTE: Here I'm adding a single expected attribute to handle string tokens,
// but you would probably want to do something more meaningful/elegant
CharTermAttribute attr = tokenizer.addAttribute(CharTermAttribute.class);
while(tokenizer.incrementToken()) {
// Grab the term
String term = attr.toString();
// Do something crazy...
}
你試過路過的單身'AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY'?或者使用無參數構造函數? – sisve
嗨西蒙感謝提示。它可以處理這個代碼: Tokenizer tokenStream = new StandardTokenizer(); tokenStream.setReader(new StringReader(input)); 當你應用你的過濾器時,你會得到一個TokenStream。 TokenStream的工作流程也發生了變化,您現在需要調用reset();在開始使用此流之前。 – samy
這個問題的答案呢? – soulcheck