使用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();
}