热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

全文索引(二)lucene索引管理

lucene是一个提供搜索的工具,并不能实现内容的抓取。所有内容的获取完全依赖于自己的应用程序去实现或者第三方的工具来做。在apachelucene下面有一个子项目,Solr可以实现从关系型数据库中


lucene是一个提供搜索的工具,并不能实现内容的抓取。所有内容的获取完全依赖于自己的应用程序去实现或者第三方的工具来做。在apache lucene下面有一个子项目,Solr可以实现从关系型数据库中获取原始数据。只要拿到原始的文本数据,lucene就可以负责建立相关的索引。

 


创建索引

 

1.Field.Store.YES (NO)存储域选项

 

设置为Y表示把这个域中的内容完全存储到文件中,方便进行文本的还原

设置为N表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完全还原

 

2.Field.Index(索引选项)


Index.ANALYZED:进行分词和索引,适用于标题、内容等

Index.NOT_ANALYZED:进行素引,但是不进行分词,如果身份证号,姓名,lp等.适用干精确搜素

Index.ANALYZED_NOT_NORMS:进行分词但是不存储norms信息.,norms中包括了创建索引的时间和权值等信息。

Index.NOT_ANALYZED_NOT_NORMS:即不进行分词也不存储norms信息.

Index.NO:不进行索引。

 


/**
* 创建索引-cfl-2015年5月26日
*/
public void createIndex(){

//用于写入索引文件的writer对象
IndexWriter writer =null;

try {

//载入writer配置
writer=new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));
Document doc=null;

//遍历数组写入域信息
for(int i=0;i
doc=new Document();
doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field("name",names[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field("mail",mails[i],Field.Store.YES,Field.Index.ANALYZED_NO_NORMS));
doc.add(new Field("content",contents[i],Field.Store.NO,Field.Index.ANALYZED_NO_NORMS));
writer.addDocument(doc);

//取得含有特定字符的数组
String strMail=mails[i].substring(mails[i].lastIndexOf("@")-1);
System.out.println(strMail);

//为指定域添加权重
if(scoreMap.containsKey(strMail)){
doc.setBoost(scoreMap.get(i));
}else{
doc.setBoost(0.5f);
}

}

System.out.println("索引创建成功!");

} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
closeWriter(writer);
}



}


在配置IndexWriterConfig时,需要注意的是配置指定的版本号。这里还是体现了lucene开发者成熟的设计理念的。为用户在自行选择版本的给于了充分的自由度的。


创建索引过程类似于关系型数据库中的记录、字段的创建,创建doc相当于创建一条条的数据库记录。而field的创建对应着字段的创建。


下图是索引建立后的文件



ps:当删除某个索引之后,生成.del文件


查询

1.一般查询

 

/**
* 查询索引的值-cfl-2015年5月26日
*/
public void queryIndex(){
//1.创建indexReader
IndexReader reader=null;
try {
//可以有效通过reader获取文档的数量
reader=IndexReader.open(directory);
System.out.println("maxDocs:"+reader.maxDoc());
System.out.println("numDocs:"+reader.numDocs());
System.out.println("deleteDocs:"+reader.numDeletedDocs());
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
closeReader(reader);
}

}


利用IndexReader来获取索引文件目录中总文件数,索引文件数,已删除文件数信息。



2.根据关键词Term查询


 

/**
* 精确查询索引根据关键字-cfl-2015年5月27日
*/
public void queryIndexByTerm(){
IndexReader reader=null;
try {
reader=IndexReader.open(directory);
IndexSearcher searcher=new IndexSearcher(reader);
TermQuery query=new TermQuery(new Term("content","bootst"));
TopDocs topDocs=searcher.search(query, 10);
for(ScoreDoc td:topDocs.scoreDocs){
System.out.println(td.toString());
System.out.println(searcher.doc(td.doc).get("name"));
}
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
closeReader(reader);
}

}

查询存在于content域中含有关键词bootst的数据。


IndexSearcher searcher=new IndexSearcher(reader);
TermQuery query=new TermQuery(new Term("content","bootst"));
TopDocs topDocs=searcher.search(query, 10);

这样的一个过程类似在关系数据库查询过程中


1.利用reader建立searcher对象

2.配置Term关键词

3.查询10条数据



删除

 

1.指定删除

 


/**
* 删除指定索引-cfl-2015年5月26日
*/
public void deleteIndex(){
IndexWriter writer=null;
try {
writer=new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));
//term精确查找的值
writer.deleteDocuments(new Term("id","01"));
System.out.println("已删除指定索引!" );
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
closeWriter(writer);
}
}

利用还是Term关键词来删除指定域数据。


2.删除所有

 

/**
* 删除所有索引-cfl-2015年5月26日
*/
public void deleteAllIndex(){
IndexWriter writer=null;
try {
writer=new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));
writer.deleteAll();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
closeWriter(writer);
}
}

这里删除所有的,则直接利用Writer对象即可。需要注意的是这里其实类似在windows中的操作,将资源放在了回收站中并没有彻底删除。


3.强制删除(从回收站中清空)

 

/**
* 强制删除-cfl-2015年5月27日
*/
public void forceDelete() {
IndexWriter writer = null;
try {
writer = new IndexWriter(directory, new IndexWriterConfig(
Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));
writer.forceMergeDeletes();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
closeWriter(writer);
}
}

这里强制删除会牺牲一些机器的性能,不推荐使用。lucene在索引增多之后,会根据情况来自动整理。这里删除之后不会再恢复。



恢复

 

从回收站中恢复索引文件

 

/**
* 恢复索引-cfl-2015年5月26日
*/
public void unDeleteIndex(){
IndexReader reader=null;

try {
//取得指定目录文件夹下,设置只读为false
reader=IndexReader.open(directory,false);
reader.undeleteAll();
System.out.println("已恢复所有删除的索引!");
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
closeReader(reader);
}

}


直接利用reader自带的方法undeleteAll()即可。



设置权重

 

提高被搜索出的频率,类似百度做的seo


//为指定域添加权重
if(scoreMap.containsKey(strMail)){
doc.setBoost(scoreMap.get(i));
}else{
doc.setBoost(0.5f);
}





推荐阅读
  • Mysql调优的顺序及面试问题总结
    文章目录一、调优相关1.第一步:本地explain线上查询遇到的第一个坑:遇到的第二个坑:2.第二步:覆盖索引3.第三步&# ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • mysql  GROUP_CONCAT获取分组的前几名
    如果是oracle应该很容易用Partition By实现。比如说要获取班级的前3名,就可以用GROUP_CONCAT+ GROUPBY + substring_index实现。考 ... [详细]
author-avatar
乖扬123_829
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有