//索引文件类型
//.cfs文件实际上是一个虚拟文件,它将.fdt,.fdx,.fnm,frq,.nrm,.prx,.tii,.tis等等文件打包成了一个单一文件。 域(Field)的元数据信息文件(.fnm) 域(Field)的数据文件(.fdx和.fdt) 词项向量索引文件(.tvx,.tvd,.tvf) Document Index File/Document File/Filed File 词项词典索引文件(.tii,.tis) 词频倒排索引文件(.frq) 词位置倒排索引文件(.prx) //.segment_N文件保存段索引的元数据 //.segments.gen一个索引对应一个目录,索引文件都存放在目录里面(一个core对应一个索引)索引(Index):在Lucene中一个索引是放在一个文件夹中的。段(Segment):一个索引可以包含多个段,段与段之间是独立的,添加新文档可以生成新的段,不同的段可以合并。segments.gen和segments_X是段的元数据文件,也即它们保存了段的属性信息。文档(Document):文档是我们建索引的基本单位,不同的文档是保存在不同的段中的,一个段可以包含多篇文档。新添加的文档是单独保存在一个新生成的段中,随着段的合并,不同的文档合并到同一个段中。域(Field):一篇文档包含不同类型的信息,可以分开索引,比如标题,时间,正文,作者等,都可以保存在不同的域里。不同域的索引方式可以不同,在真正解析域的存储的时候,我们会详细解读。词(Term):词是索引的最小单位,是经过词法分析和语言处理后的字符串。Segments File segments.gen, segments_N 一次提交操作的信息Lock File write.lock 写入锁,防止多个indexwriter同时操作相同文件Segment Info si 存储segment信息(段的元数据)Compound File .cfs, .cfe 复合文件类型Fields .fnm 存储域信息Field Index .fdx 存储指向域数据的索引信息Field Data .fdt 存储域的元数据Term Dictionary .tim 存储词典以及域信息Term Index .tip 指向词典的索引信息Frequencies .doc 存储文档集包含词的频率信息,即某个词被文档引用的频率Positions .pos 存储词的位置信息Payloads .pay 存储附加到每个位置的元数据信息,如字符偏移量和用户的自定义信息(?)Norms .nvd, .nvm 文件和域的length和boost .nvm 文件保存索引字段加权因子的元数据 .nvd 文件保存索引字段加权数据Per-Document Values .dvd, .dvm 存储了编码了的文档和域的长度和影响因子 .dvm 存放了DocValue域的元数据,比如DocValue偏移量。 .dvd 存放了DocValue的数据。 Term Vector Index .tvx 存储term在文档中的偏移量Term Vector Documents .tvd 存储每篇文档包含的term向量 Term Vector Fields .tvf 存储term向量的域级别信息 .liv 保存有效文档的索引文件信息Deleted Documents .del 存储删除的文档
xxx.java
public class MyLucene { private static Version version = Version.LUCENE_47; private static File indexDirectory = new File("lucene_index"); public static void indexData() throws IOException{ StandardAnalyzer analyzer = new StandardAnalyzer(version);// Directory index = new RAMDirectory(); Directory index = new SimpleFSDirectory(indexDirectory); IndexWriterConfig config = new IndexWriterConfig(version, analyzer); IndexWriter w = new IndexWriter(index, config); indexDoc(w, "a.txt", "Lucene in Action", "193398817"); indexDoc(w, "b.txt", "Lucene for Dummies", "55320055Z"); indexDoc(w, "c.txt", "Managing Gigabytes", "55063554A"); indexDoc(w, "d.txt", "The Art of Computer Science", "9900333X"); w.close(); } public static void searchData(String searchStr, int hitsPerPage) throws IOException, ParseException{ StandardAnalyzer analyzer = new StandardAnalyzer(version);// Directory index = new RAMDirectory(); Directory index = new SimpleFSDirectory(indexDirectory); String[] fields = new String[]{"filename","header","content"}; QueryParser parser = new MultiFieldQueryParser(version, fields, analyzer); Query q = parser.parse(searchStr); IndexReader reader = DirectoryReader.open(index); IndexSearcher searcher = new IndexSearcher(reader); TopDocs docs = searcher.search(q, hitsPerPage); ScoreDoc[] hits = docs.scoreDocs; System.out.println("Found " + hits.length + " hits."); for (int i = 0; i < hits.length; ++i) { int docId = hits[i].doc; Document d = searcher.doc(docId); System.out.println((i + 1) + ". " + hits[i].score + "\t" + d.get("filename") + "\t" + d.get("header") + "\t" + d.get("content")); } reader.close(); } private static void indexDoc(IndexWriter w, String filename, String header, String content) throws IOException { Document doc = new Document(); doc.add(new Field("filename", filename, Field.Store.YES, Index.ANALYZED)); doc.add(new Field("header", header, Field.Store.YES, Index.ANALYZED)); doc.add(new Field("content", content, Field.Store.YES, Index.ANALYZED)); w.addDocument(doc); }}
xxTest.java
@Test public void testIndex() throws IOException { MyLucene lucene = new MyLucene(); lucene.indexData(); } @Test public void testSearch() throws IOException, ParseException { MyLucene lucene = new MyLucene(); String searchStr = "lucene"; int hitsPerPage = 10; lucene.searchData(searchStr, hitsPerPage); }