1. 程式人生 > >Lucene建立索引的概念

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型別

             構造一個同名的,同值域