2012-08-14 15 views
9

Trong phương pháp lập chỉ mục tôi sử dụng dòng sau:Làm thế nào để sử dụng TermVector Lucene 4,0

Field contentsField = new Field("contents", new FileReader(f), Field.TermVector.YES); 

Tuy nhiên, trong Lucene 4,0 constructor này bị phản đối và new TextField nên được sử dụng thay vì new Field.

Nhưng vấn đề với TextField là nó không chấp nhận TermVector trong các nhà xây dựng của nó.

Có cách nào để đưa Vector cụm từ vào chỉ mục của tôi trong Lucene 4.0 với các hàm tạo mới không?

Cảm ơn

Trả lời

11

TextField là một lớp học thuận tiện cho người dùng cần các lĩnh vực được lập chỉ mục mà không vectơ hạn. Nếu bạn cần các vectơ cụm từ, chỉ cần sử dụng một số Field. Phải mất thêm một vài dòng mã vì bạn cần tạo một thể hiện của FieldType trước tiên, hãy đặt storeTermVectorstokenizer thành true và sau đó sử dụng cá thể FieldType này trong hàm xây dựng Field.

12

tôi đã cùng một vấn đề, vì vậy tôi chỉ đơn giản là tạo ra Dòng của riêng tôi:

public class VecTextField extends Field { 

/* Indexed, tokenized, not stored. */ 
public static final FieldType TYPE_NOT_STORED = new FieldType(); 

/* Indexed, tokenized, stored. */ 
public static final FieldType TYPE_STORED = new FieldType(); 

static { 
    TYPE_NOT_STORED.setIndexed(true); 
    TYPE_NOT_STORED.setTokenized(true); 
    TYPE_NOT_STORED.setStoreTermVectors(true); 
    TYPE_NOT_STORED.setStoreTermVectorPositions(true); 
    TYPE_NOT_STORED.freeze(); 

    TYPE_STORED.setIndexed(true); 
    TYPE_STORED.setTokenized(true); 
    TYPE_STORED.setStored(true); 
    TYPE_STORED.setStoreTermVectors(true); 
    TYPE_STORED.setStoreTermVectorPositions(true); 
    TYPE_STORED.freeze(); 
} 

// TODO: add sugar for term vectors...? 

/** Creates a new TextField with Reader value. */ 
public VecTextField(String name, Reader reader, Store store) { 
    super(name, reader, store == Store.YES ? TYPE_STORED : TYPE_NOT_STORED); 
} 

/** Creates a new TextField with String value. */ 
public VecTextField(String name, String value, Store store) { 
    super(name, value, store == Store.YES ? TYPE_STORED : TYPE_NOT_STORED); 
} 

/** Creates a new un-stored TextField with TokenStream value. */ 
public VecTextField(String name, TokenStream stream) { 
    super(name, stream, TYPE_NOT_STORED); 
} 

}

Hope this helps