Lucene建立索引的概念
查詢(Query):對於全文搜尋,最終都是使用詞項指向一批document文件物件集合,利用對
詞項的邏輯計算可以實現不同的查詢功能;查詢時構建的物件就是Query;
文件(document):是索引檔案中的一個最小的資料單位,例如非結構化資料中的網頁將會封裝成
一個document儲存在索引檔案中,而封裝過程中寫在物件裡的所有資料都會根據邏輯
進行分詞計算,不同的結構源資料會對應建立具有不同屬性的document物件
文件的域(Field):每個文件物件根據不同的資料來源封裝Field的名稱,個數和資料,導致document
的結構可能各不相同
詞條化(tokenization):計算分詞的過程
詞項(Term):計算分詞的結果每一個詞語都是一個語項
建立一個索引檔案(空)
指向一個索引檔案的位置(指向作業系統的一個資料夾)
生成輸出物件,進行輸出
@Test public void emptyIndex() throws Exception{ //指向一個資料夾位置 Path path=Paths.get("./index01"); Directory dir=FSDirectory.open(path); //生成一個數出物件writer需要分詞計算器,配置物件 Analyzer analyzer=new IKAnalyzer6x();//中文分詞器 IndexWriterConfig config=new IndexWriterConfig(analyzer); IndexWriter writer=new IndexWriter(dir, config); //寫出到磁碟,如果沒有攜帶document,生成一個空的index檔案 writer.commit(); }
在索引中建立資料
將源資料讀取封裝成document物件,根據源資料結構定義document的給中field;
@Test
public void createDate() throws Exception {
/**
* 指向一個索引檔案 生成輸出物件 封裝document物件(手動填寫資料) 將document新增到輸出物件索引檔案的輸出
*/
// 指向一個資料夾位置
Path path = Paths.get("./index02");
Directory dir = FSDirectory.open(path);
// 生成一個輸出物件writer需要分詞計算器,配置物件
Analyzer analyzer = new IKAnalyzer6x();// 中文分詞器
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(dir, config);
// 構造document物件
Document document1 = new Document();// 新聞、作者、內容、網站連結地址
Document document2 = new Document();// 商品頁面、title、price、詳情、圖片等
document1.add(new TextField("auther", "韓寒", Store.YES));
document1.add(new TextField("content", "我是上海大金子", Store.NO));
document1.add(new StringField("address", "http://www.baidu.com", Store.YES));
document2.add(new TextField("title", "三星(SAMSUNG) 1TB Type-c USB3.1 移動固態硬碟", Store.YES));
document2.add(new TextField("price", "1699", Store.YES));
document2.add(new TextField("desc", "不怕爆炸你就買", Store.YES));
document2.add(new StringField("image", "image.jt.com/1/1.jpg", Store.YES));
//將2個document物件新增到writer中寫出到索引檔案;
writer.addDocument(document1);
writer.addDocument(document2);
//寫出到磁碟,如果沒有攜帶document,生成一個空的index檔案
writer.commit();
}
利用軟體觀察索引內容
問題1:Store.YES和NO的區別是什麼?
解:Store的yes和no的區別在於,建立索引資料時,field資料是否輸出到索引時儲存在索引檔案,按照
域的型別進行計算分詞。
在索引中,一些過大的資料,查詢不需要的資料可以不儲存在索引檔案中;
例如網頁內容;計算不計算分詞,和儲存在索引沒關係
問題2:StringField和TextField的區別是什麼
解:域的資料需要進行分詞計算,如果是字串有兩種對應的域型別
其中StringField表示不對資料進行分詞計算,以整體形勢計算索引
TextField表示對資料進行分詞計算,以詞項形勢計算索引;
問題3:顯然document中的不同域field應該儲存不同的資料型別
IntPoint
LongPoint
DoublePoint
FloatPoint
解: 資料中的型別不同,儲存的資料計算邏輯也不同;
int long double的數字資料如果使用字串型別儲存域
只能做到一件事--儲存在索引檔案上
以上幾個Point型別的域會對資料進行二進位制數字的計算;
範圍查詢,只要利用intPoint,longPoint對應域儲存到document物件後
這種型別的資料在分詞計算中就具有了數字的特性 > <
intPoint只能儲存數值,不儲存資料
如果既想記性數字特性的使用,又要儲存資料;需要使用StringField型別
構造一個同名的,同值域