域的詳細介紹
是否分詞:
??分詞的作用是為了索引
??需要分詞: 文件名稱, 文件內容
??不需要分詞: 不需要索引的域不需要分詞,還有就是分詞后無意義的域不需要分詞
????比如: id, 身份證號
是否索引:
??索引的的目的是為了搜索.
??需要搜索的域就一定要創建索引,只有創建了索引才能被搜索出來
??不需要搜索的域可以不創建索引
??需要索引: 文件名稱, 文件內容, id, 身份證號等
??不需要索引: 比如圖片地址不需要創建索引, e:\xxx.jpg
????因為根據圖片地址搜索無意義
是否存儲:
??存儲的目的是為了顯示.
??是否存儲看個人需要,存儲就是將內容放入Document文檔對象中保存出來,會額外占用磁盤空間, 如果搜索的時候需要馬上顯示出來可以放入document中也就是要存儲,這樣查詢顯示速度快, 如果不是馬上立刻需要顯示出來,則不需要存儲,因為額外占用磁盤空間不劃算.
域的各種類型
Field類 | 數據類型 | Analyzed是否分析 | Indexed是否索引 | Stored是否存儲 | 說明 |
---|---|---|---|---|---|
StringField(FieldName, FieldValue,Store.YES)) | 字符串 | N | Y | Y或N | 這個Field用來構建一個字符串Field,但是不會進行分析,會將整個串存儲在索引中,比如(訂單號,姓名等)是否存儲在文檔中用Store.YES或Store.NO決定 |
LongField(FieldName, FieldValue,Store.YES) | Long型 | Y | Y | Y或N | 這個Field用來構建一Long數字型Field,進行分析和索引,比如(價格)是否存儲在文檔中用Store.YES或Store.NO決定 |
StoredField(FieldName, FieldValue) | 重載方法,支持多種類型 | N | N | Y | 這個Field用來構建不同類型Field 不分析,不索引,但要Field存儲在文檔中 |
TextField(FieldName, FieldValue, Store.NO)或TextField(FieldName, reader) | 字符串或流 | Y | Y | Y或N | 如果是一個Reader, lucene猜測內容比較多,會采用Unstored的策略. |
注意:lucene底層的算法,錢數是要分詞的,因為要根據價錢進行對比
例如: 大于12.5元的小于100元的商品搜索出來
- 將前面建立索引的代碼重新修改
package cn.huahcao.lucene;
import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class IndexManagerTest {
@Test
public void testCreateIndex() throws Exception{
//采集文件系統中的文檔數據,放入lucene中
//文檔列表,保存Document
List<Document> docList = new ArrayList<Document>();
//指定文件所在的目錄
File dir = new File("G:\\Java\\JavaEE\\09_SSM\\lucene_day01\\參考資料\\searchsource");
//循環取出文件
for (File file:dir.listFiles()){
//文件名稱
String fileName = file.getName();
//文件內容
String fileContext = FileUtils.readFileToString(file);
//文件大小
Long fileSize = FileUtils.sizeOf(file);
//文檔對象。文件系統中的一個文件就是一個Document對象
Document doc = new Document();
/**
* 第一個參數:域名
* 第二個參數:域值
* 第三個參數:是否存儲,是為Yes,不存儲為No
*/
// TextField nameFiled = new TextField("fileName",fileName, Field.Store.YES);
// TextField contextFiled = new TextField("fileContent",fileContent, Field.Store.YES);
// TextField sizeFiled = new TextField("fileSize",fileSize.toString(), Field.Store.YES);
//是否分詞:要,因為它要索引,并且它不是一個整體,分詞有意義
//是否索引:要,因為要通過它來進行搜索
//是否存儲:要,因為要直接在頁面上顯示
TextField nameFiled = new TextField("fileName", fileName, Field.Store.YES);
//是否分詞: 要,因為要根據內容進行搜索,并且它分詞有意義
//是否索引: 要,因為要根據它進行搜索
//是否存儲: 可以要也可以不要,不存儲搜索完內容就提取不出來
TextField contextFiled = new TextField("fileContext", fileContext, Field.Store.NO);
//是否分詞: 要, 因為數字要對比,搜索文檔的時候可以搜大小, lunene內部對數字進行了分詞算法
//是否索引: 要, 因為要根據大小進行搜索
//是否存儲: 要, 因為要顯示文檔大小
LongField sizeFiled = new LongField("fileSize", fileSize, Field.Store.YES);
//將所有的域存入文檔中
doc.add(nameFiled);
doc.add(contextFiled);
doc.add(sizeFiled);
//將文檔存入文檔集合中
docList.add(doc);
}
//創建分詞器,StandardAnalyzer標準分詞器,標準分詞器對英文分詞效果很好,對中文是單字分詞
StandardAnalyzer analyzer = new StandardAnalyzer();
//指定索引和文檔存儲的目錄
FSDirectory directory = FSDirectory.open(new File("G:\\Java\\JavaEE\\09_SSM\\lucene_day01\\tmp"));
//創建寫對象的初始化對象
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3,analyzer);
//創建索引和文檔寫對象
IndexWriter indexWriter = new IndexWriter(directory , config);
//將文檔加入到索引和文檔的寫對象中
for (Document doc:docList){
indexWriter.addDocument(doc);
}
//提交
indexWriter.commit();
//關閉流
indexWriter.close();
}
}
運行上面代碼重新建立索引
-
使用luke查看如下:
-
查看Document
因為我們沒有存儲文件內容,所以fileContext是空的