域的詳細(xì)介紹
是否分詞:
??分詞的作用是為了索引
??需要分詞: 文件名稱, 文件內(nèi)容
??不需要分詞: 不需要索引的域不需要分詞,還有就是分詞后無(wú)意義的域不需要分詞
????比如: id, 身份證號(hào)
是否索引:
??索引的的目的是為了搜索.
??需要搜索的域就一定要?jiǎng)?chuàng)建索引,只有創(chuàng)建了索引才能被搜索出來(lái)
??不需要搜索的域可以不創(chuàng)建索引
??需要索引: 文件名稱, 文件內(nèi)容, id, 身份證號(hào)等
??不需要索引: 比如圖片地址不需要?jiǎng)?chuàng)建索引, e:\xxx.jpg
????因?yàn)楦鶕?jù)圖片地址搜索無(wú)意義
是否存儲(chǔ):
??存儲(chǔ)的目的是為了顯示.
??是否存儲(chǔ)看個(gè)人需要,存儲(chǔ)就是將內(nèi)容放入Document文檔對(duì)象中保存出來(lái),會(huì)額外占用磁盤(pán)空間, 如果搜索的時(shí)候需要馬上顯示出來(lái)可以放入document中也就是要存儲(chǔ),這樣查詢顯示速度快, 如果不是馬上立刻需要顯示出來(lái),則不需要存儲(chǔ),因?yàn)轭~外占用磁盤(pán)空間不劃算.
域的各種類型
Field類 | 數(shù)據(jù)類型 | Analyzed是否分析 | Indexed是否索引 | Stored是否存儲(chǔ) | 說(shuō)明 |
---|---|---|---|---|---|
StringField(FieldName, FieldValue,Store.YES)) | 字符串 | N | Y | Y或N | 這個(gè)Field用來(lái)構(gòu)建一個(gè)字符串Field买鸽,但是不會(huì)進(jìn)行分析,會(huì)將整個(gè)串存儲(chǔ)在索引中,比如(訂單號(hào),姓名等)是否存儲(chǔ)在文檔中用Store.YES或Store.NO決定 |
LongField(FieldName, FieldValue,Store.YES) | Long型 | Y | Y | Y或N | 這個(gè)Field用來(lái)構(gòu)建一Long數(shù)字型Field照瘾,進(jìn)行分析和索引耕魄,比如(價(jià)格)是否存儲(chǔ)在文檔中用Store.YES或Store.NO決定 |
StoredField(FieldName, FieldValue) | 重載方法桌粉,支持多種類型 | N | N | Y | 這個(gè)Field用來(lái)構(gòu)建不同類型Field 不分析宣脉,不索引喷市,但要Field存儲(chǔ)在文檔中 |
TextField(FieldName, FieldValue, Store.NO)或TextField(FieldName, reader) | 字符串或流 | Y | Y | Y或N | 如果是一個(gè)Reader, lucene猜測(cè)內(nèi)容比較多,會(huì)采用Unstored的策略. |
注意:lucene底層的算法,錢(qián)數(shù)是要分詞的,因?yàn)橐鶕?jù)價(jià)錢(qián)進(jìn)行對(duì)比
例如: 大于12.5元的小于100元的商品搜索出來(lái)
- 將前面建立索引的代碼重新修改
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{
//采集文件系統(tǒng)中的文檔數(shù)據(jù),放入lucene中
//文檔列表酗宋,保存Document
List<Document> docList = new ArrayList<Document>();
//指定文件所在的目錄
File dir = new File("G:\\Java\\JavaEE\\09_SSM\\lucene_day01\\參考資料\\searchsource");
//循環(huán)取出文件
for (File file:dir.listFiles()){
//文件名稱
String fileName = file.getName();
//文件內(nèi)容
String fileContext = FileUtils.readFileToString(file);
//文件大小
Long fileSize = FileUtils.sizeOf(file);
//文檔對(duì)象积仗。文件系統(tǒng)中的一個(gè)文件就是一個(gè)Document對(duì)象
Document doc = new Document();
/**
* 第一個(gè)參數(shù):域名
* 第二個(gè)參數(shù):域值
* 第三個(gè)參數(shù):是否存儲(chǔ),是為Yes,不存儲(chǔ)為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);
//是否分詞:要,因?yàn)樗饕?并且它不是一個(gè)整體,分詞有意義
//是否索引:要,因?yàn)橐ㄟ^(guò)它來(lái)進(jìn)行搜索
//是否存儲(chǔ):要,因?yàn)橐苯釉陧?yè)面上顯示
TextField nameFiled = new TextField("fileName", fileName, Field.Store.YES);
//是否分詞: 要,因?yàn)橐鶕?jù)內(nèi)容進(jìn)行搜索,并且它分詞有意義
//是否索引: 要,因?yàn)橐鶕?jù)它進(jìn)行搜索
//是否存儲(chǔ): 可以要也可以不要,不存儲(chǔ)搜索完內(nèi)容就提取不出來(lái)
TextField contextFiled = new TextField("fileContext", fileContext, Field.Store.NO);
//是否分詞: 要, 因?yàn)閿?shù)字要對(duì)比,搜索文檔的時(shí)候可以搜大小, lunene內(nèi)部對(duì)數(shù)字進(jìn)行了分詞算法
//是否索引: 要, 因?yàn)橐鶕?jù)大小進(jìn)行搜索
//是否存儲(chǔ): 要, 因?yàn)橐@示文檔大小
LongField sizeFiled = new LongField("fileSize", fileSize, Field.Store.YES);
//將所有的域存入文檔中
doc.add(nameFiled);
doc.add(contextFiled);
doc.add(sizeFiled);
//將文檔存入文檔集合中
docList.add(doc);
}
//創(chuàng)建分詞器,StandardAnalyzer標(biāo)準(zhǔn)分詞器,標(biāo)準(zhǔn)分詞器對(duì)英文分詞效果很好,對(duì)中文是單字分詞
StandardAnalyzer analyzer = new StandardAnalyzer();
//指定索引和文檔存儲(chǔ)的目錄
FSDirectory directory = FSDirectory.open(new File("G:\\Java\\JavaEE\\09_SSM\\lucene_day01\\tmp"));
//創(chuàng)建寫(xiě)對(duì)象的初始化對(duì)象
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3,analyzer);
//創(chuàng)建索引和文檔寫(xiě)對(duì)象
IndexWriter indexWriter = new IndexWriter(directory , config);
//將文檔加入到索引和文檔的寫(xiě)對(duì)象中
for (Document doc:docList){
indexWriter.addDocument(doc);
}
//提交
indexWriter.commit();
//關(guān)閉流
indexWriter.close();
}
}
運(yùn)行上面代碼重新建立索引
-
使用luke查看如下:
-
查看Document
因?yàn)槲覀儧](méi)有存儲(chǔ)文件內(nèi)容蜕猫,所以fileContext是空的