lucene&solr从入门到精通-----创建索引,写到索引库

来源:互联网 发布:学生借款软件 编辑:程序博客网 时间:2024/06/13 08:32

maven配置

    <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core -->        <dependency>            <groupId>org.apache.lucene</groupId>            <artifactId>lucene-core</artifactId>            <version>4.2.0</version>        </dependency>        <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-common -->        <dependency>            <groupId>org.apache.lucene</groupId>            <artifactId>lucene-analyzers-common</artifactId>            <version>4.2.0</version>        </dependency>        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->        <dependency>            <groupId>commons-io</groupId>            <artifactId>commons-io</artifactId>            <version>2.4</version>        </dependency>

创建索引大体思路:

  • 第一,需要创建一个流,这个流需要指定索引仓库(Directory),然后还需要一个配置对象(IndexWriterConfig),这个配置对象需要一个语法解析器(Analyzer)
  • 第二,需要一个文档对象(Document),然后把文件对象有关的信息,比如名字,大小,内容,路径等得到然后new相对应的字段(Field)
  • 第三,把字段添加到文档对象
  • 第四,把文档对象添加到流
  • 第五,关闭流
  • 索引库得到一些乱七八糟的文件就是刚刚创建的索引及文档重点内容

搜索索引的大体思路

  1. 第一,需要指定索引库的位置(Directory)
  2. 第二,需要创建一个读索引库的流(indexReader)
  3. 第三,需要一个搜索对象(indexsearcher),然后指定一个流
  4. 第四,创建一个搜索关键词对象(TermQuery),需要指定域和想搜索的关键词
  5. 第五,执行查询,查询出来的是对象是前几个文档(TopDocs),然后这个对象有个scoreDocs()方法得到一个数组ScoreDoc[]
  6. 第六,ScoreDoc[]有个doc()的方法得到文档id,
  7. 第七,根据所得到id,int类型的值,得到具体的文档indexSearcher.doc(id),然后知道文档了,那之前怎么放进去的就怎么拿出啦了。
package com.itheima.lucene;import static org.junit.Assert.*;import java.io.File;import org.apache.commons.io.FileUtils;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.TokenStream;import org.apache.lucene.analysis.cjk.CJKAnalyzer;import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.document.Field.Store;import org.apache.lucene.document.LongField;import org.apache.lucene.document.StoredField;import org.apache.lucene.document.TextField;import org.apache.lucene.index.DirectoryReader;import org.apache.lucene.index.IndexReader;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.index.Term;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.Query;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.TermQuery;import org.apache.lucene.search.TopDocs;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.store.RAMDirectory;import org.apache.lucene.util.Version;import org.junit.Test;import org.wltea.analyzer.lucene.IKAnalyzer;/** * Lucene 入门 创建索引 查询索引 *  * @author lx * */public class FirstLucene {    // 创建索引    @Test    public void testIndex() throws Exception {        // 第一步:创建一个java工程,并导入jar包。        // 第二步:创建一个indexwriter对象。        Directory directory = FSDirectory.open(new File("D:\\temp\\index"));        // Directory directory = new RAMDirectory();//保存索引到内存中 (内存索引库)//      Analyzer analyzer = new StandardAnalyzer();// 官方推荐        Analyzer analyzer = new IKAnalyzer();// 官方推荐        IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);        IndexWriter indexWriter = new IndexWriter(directory, config);        // 1)指定索引库的存放位置Directory对象        // 2)指定一个分析器,对文档内容进行分析。        // 第三步:创建field对象,将field添加到document对象中。        File f = new File("D:\\Lucene&solr\\searchsource");        File[] listFiles = f.listFiles();        for (File file : listFiles) {            // 第三步:创建document对象。            Document document = new Document();            // 文件名称            String file_name = file.getName();            Field fileNameField = new TextField("fileName", file_name, Store.YES);            // 文件大小            long file_size = FileUtils.sizeOf(file);            Field fileSizeField = new LongField("fileSize", file_size, Store.YES);            // 文件路径            String file_path = file.getPath();            Field filePathField = new StoredField("filePath", file_path);            // 文件内容            String file_content = FileUtils.readFileToString(file);            Field fileContentField = new TextField("fileContent", file_content, Store.NO);            document.add(fileNameField);            document.add(fileSizeField);            document.add(filePathField);            document.add(fileContentField);            // 第四步:使用indexwriter对象将document对象写入索引库,此过程进行索引创建。并将索引和document对象写入索引库。            indexWriter.addDocument(document);        }        // 第五步:关闭IndexWriter对象。        indexWriter.close();    }    // 搜索索引    @Test    public void testSearch() throws Exception {        // 第一步:创建一个Directory对象,也就是索引库存放的位置。        Directory directory = FSDirectory.open(new File("D:\\temp\\index"));// 磁盘        // 第二步:创建一个indexReader对象,需要指定Directory对象。        IndexReader indexReader = DirectoryReader.open(directory);        // 第三步:创建一个indexsearcher对象,需要指定IndexReader对象        IndexSearcher indexSearcher = new IndexSearcher(indexReader);        // 第四步:创建一个TermQuery对象,指定查询的域和查询的关键词。        Query query = new TermQuery(new Term("fileName", "lucene"));        // 第五步:执行查询。        TopDocs topDocs = indexSearcher.search(query, 10);        // 第六步:返回查询结果。遍历查询结果并输出。        ScoreDoc[] scoreDocs = topDocs.scoreDocs;        for (ScoreDoc scoreDoc : scoreDocs) {            int doc = scoreDoc.doc;            Document document = indexSearcher.doc(doc);            // 文件名称            String fileName = document.get("fileName");            System.out.println(fileName);            // 文件内容            String fileContent = document.get("fileContent");            System.out.println(fileContent);            // 文件大小            String fileSize = document.get("fileSize");            System.out.println(fileSize);            // 文件路径            String filePath = document.get("filePath");            System.out.println(filePath);            System.out.println("------------");        }        // 第七步:关闭IndexReader对象        indexReader.close();    }    // 查看标准分析器的分词效果    @Test    public void testTokenStream() throws Exception {        // 创建一个标准分析器对象//      Analyzer analyzer = new StandardAnalyzer();//      Analyzer analyzer = new CJKAnalyzer();//      Analyzer analyzer = new SmartChineseAnalyzer();        Analyzer analyzer = new IKAnalyzer();        // 获得tokenStream对象        // 第一个参数:域名,可以随便给一个        // 第二个参数:要分析的文本内容//      TokenStream tokenStream = analyzer.tokenStream("test",//              "The Spring Framework provides a comprehensive programming and configuration model.");        TokenStream tokenStream = analyzer.tokenStream("test",                "高富帅可以用二维表结构来逻辑表达实现的数据");        // 添加一个引用,可以获得每个关键词        CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);        // 添加一个偏移量的引用,记录了关键词的开始位置以及结束位置        OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);        // 将指针调整到列表的头部        tokenStream.reset();        // 遍历关键词列表,通过incrementToken方法判断列表是否结束        while (tokenStream.incrementToken()) {            // 关键词的起始位置            System.out.println("start->" + offsetAttribute.startOffset());            // 取关键词            System.out.println(charTermAttribute);            // 结束位置            System.out.println("end->" + offsetAttribute.endOffset());        }        tokenStream.close();    }}