项目实训——全文索引的建立

使用lucene对文段内容建立全文索引,让用户可以对书籍进行检索。

创建索引过程:

创建一个IndexWriter 用来写索引文件,它有几个参数,INDEX_DIR 就是索引文件所存放的位置,Analyzer 便是用来对文档进行词法分析和语言处理的。
创建一个Document 代表我们要索引的文档。
将不同的Field 加入到文档中。我们知道,一篇文档有多种信息,如题目,作者,修改时间,内容等。不同类型的信息用不同的Field 来表示,在本例子中,一共有两类信息进行了索引,一个是文件路径,一个是文件内容。其中FileReader 的SRC_FILE 就表示要索引的源文件。
IndexWriter 调用函数addDocument 将索引写到索引文件夹中。

1、分词器的选择

英文分词使用标准分词器即可完成,中文分词器选择IKAnalyzer,需要自定义字典,从存储Result的数据库中取出所有中文名建立字典,为IK分词器配置字典

分词器的配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典-->
    <entry key="ext_dict">Chext.dic;</entry>
    <!--用户可以在这里配置自己的扩展停止词字典 -->
    <entry key="ext_stopwords">stopword.dic; ext_stopword.dic</entry>
</properties>

2、依赖注入

        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>4.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-highlighter</artifactId>
            <version>4.8.0</version>
        </dependency>
        <!--lucene的查询解析器 对分词索引查询解析-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>4.8.0</version>
        </dependency>
        <!--中文分词器-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-smartcn</artifactId>
            <version>4.8.0</version>
        </dependency>
        <dependency>
            <groupId>com.janeluo</groupId>
            <artifactId>ikanalyzer</artifactId>
            <version>2012_u6</version>
        </dependency>

3、创建索引过程

创建索引过程:

创建一个IndexWriter 用来写索引文件,它有几个参数,INDEX_DIR 就是索引文件所存放的位置,Analyzer 便是用来对文档进行词法分析和语言处理的。
创建一个Document 代表我们要索引的文档。
将不同的Field 加入到文档中。我们知道,一篇文档有多种信息,如题目,作者,修改时间,内容等。不同类型的信息用不同的Field 来表示,在本例子中,一共有两类信息进行了索引,一个是文中文/英文文段,一个是书名(方便后面进行设计范围检索)。其中FileReader 的SRC_FILE 就表示要索引的源文件。
IndexWriter 调用函数addDocument 将索引写到索引文件夹中。

4、创建中文索引

首先从数据库中将信息取出来

    public List<String[]> getCont(String book){ // 找出当前文本内容
        collection=mongoDatabase.getCollection(book);
        FindIterable<Document> findIterable = collection.find();
        MongoCursor<Document> mongoCursor = findIterable.iterator();
        List<String[]> text=new ArrayList<>();

        Document mongoCursor1;
        while(mongoCursor.hasNext()) {
            mongoCursor1=mongoCursor.next();
            String[] strings=new String[4];
            strings[0]=mongoCursor1.get("_id").toString();
            strings[1]=mongoCursor1.getString("ch");
            strings[2]=mongoCursor1.getString("eng");
            strings[3]=mongoCursor1.getString("book");
            text.add(strings);
        }
        return text;
    }

传入文段即可建立索引

    public void createindex(List<String[]> list) throws IOException {
        long t1 = System.currentTimeMillis();
        //2 索引目录类,指定索引在硬盘中的位置
        Directory directory = FSDirectory.open(new File(indexdir));
        //3 创建分词器对象
        Analyzer analyzer = new IKAnalyzer(true);
        //4 索引写出工具的配置对象
        IndexWriterConfig conf = new IndexWriterConfig(LUCENE_48, analyzer);
        conf.setOpenMode(IndexWriterConfig.OpenMode.CREATE); // 创建模式打开)
        //5 创建索引的写出工具类。参数:索引的目录和配置信息
        IndexWriter indexWriter = new IndexWriter(directory, conf);
        indexWriter.deleteAll();
        //1 创建文档对象
        for(String[] s:list){
            Document document=new Document();
            document.add(new StoredField("oid", s[0])); // objectid
            document.add(new TextField("ch", s[1], YES));
            document.add(new StoredField("eng", s[2]));
            document.add(new StringField("book", s[3], YES)); // simpleid
            // 创建并添加字段信息。参数:字段的名称、字段的值、是否存储,这里选Store.YES代表存储到文档列表。Store.NO代表不存储
            //6 把文档交给IndexWriter
            indexWriter.addDocument(document);
        }
        //7 提交
        indexWriter.commit();
        //8 关闭
        indexWriter.close();
        long t2 = System.currentTimeMillis();
        System.out.println("createIndex need"+(t2-t1));
    }

4、创建英文索引

    public void createEngindex(List<String[]> list) throws IOException {
        Directory directory = FSDirectory.open(new File(indexdir));
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_48); // 无参构造函数
        IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_48,analyzer); // 新的IndexWriter配置类
        iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE); // 创建模式打开
        iwc.setRAMBufferSizeMB(256.0); // 设置内存缓存的大小,提高索引效率,不过如果修改过大的值,需要修改JVM的内存值
        IndexWriter writer = new IndexWriter(directory, iwc); // 创建IndexWriter
        writer.deleteAll();
        //1 创建文档对象
        for(String[] s:list){
            Document document=new Document();
            document.add(new StoredField("oid", s[0])); // objectid
            document.add(new StoredField("ch", s[1]));
            document.add(new TextField("eng", s[2], YES));
            document.add(new StoredField("book", s[3])); // simpleid
            //6 把文档交给IndexWriter
            writer.addDocument(document);
        }
        writer.commit();
        writer.close();
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值