Lucene语言的常用API的使用

Lucene

获得文档

  • 原始文档:要基于原始文档的数据内容建立索引
  • 搜索引擎:使用爬虫获得原始文档
  • 站内搜索:数据库内的数据查询

构建文档对象

  • 对应每个文件创建document对象
  • 每个document对象都包含多个域(field)
  • 域中保存就是原始文档的数据,域包括名称和数据。
  • 每一个文档都包含一个编号ID

分析文档

  • 分词:根据空格进行拆分句子,得到单词的列表
  • 把单词转为小写
  • 去掉标点符号
  • 去掉一些停用词(the a等)
  • 每个关键词都封装到一个Term对象当中,Term中包含两部分,关键词所在的域和关键词本身。不同域里面拆分出来的程序是不一样的因为域的名称是不同的,比如文件名内部拆分的关键词域名是文件名,文件路径中的域名是路径名。

创建索引

  • 基于关键词创建索引关系
  • 索引库中包含
    • 关键词列表
    • Document文档
    • 对应关系(一个关键词对应一个链表,从链表中获取到文章ID)
    • 倒排索引:通过词语找文章

查询索引

用户查询接口

  • 用户输入查询条件的地方

关键词封装为查询对象

  • 要查询的域:指定某个域
  • 要搜索的关键词

执行查询

  • 根据关键词到相应的域上面进行搜索
  • 找到关键词,根据关键词找到对应的文档

渲染结果

  • 根据文档的ID找到文档对象
  • 将搜索结果反馈给用户,例如highlight

实际操作

创建索引库步骤:

  1. 设置一个director对象,指定索引库保存的位置
  2. 基于Directory对象创建一个IndexWriter对象
  3. 读取磁盘上的文件,对应每个文件构建一个文档对象
  4. 向文档对象中添加域
  5. 关闭IndexWriter对象
public class Lucene {
	//1. 设置一个director对象,指定索引库保存的位置
	//可以指定索引保存在内存或是磁盘当中
	Directory direct = FSDirectory.open(new File("PATH").toPath()); 
	//2. 基于Directory对象创建一个IndexWriter对象
	IndexWriter indexw = new IndexWriter(direct, new IndexWriterConfig());
	//3. 读取磁盘上的文件,对应每个文件构建一个文档对象
	File dir = new File("PATHNAME");
	File[] files = dir.ListFiles();
	for (File f :
           files) {
        //取文件名
        String fileName = f.getName();
        //文件的路径
        String filePath = f.getPath();
        //文件的内容
        String fileContent = FileUtils.readFileToString(f, "utf-8");
        //文件的大小
        long fileSize = FileUtils.sizeOf(f);
        //创建Field
        //参数1:域的名称,参数2:域的内容,参数3:是否存储
        Field fieldName = new TextField("name", fileName, Field.Store.YES);
        //Field fieldPath = new TextField("path", filePath, Field.Store.YES);
        Field fieldPath = new StoredField("path", filePath);
        Field fieldContent = new TextField("content", fileContent, Field.Store.YES);
        //Field fieldSize = new TextField("size", fileSize + "", Field.Store.YES);
        Field fieldSizeValue = new LongPoint("size", fileSize);
        Field fieldSizeStore = new StoredField("size", fileSize);
        //创建文档对象
        Document document = new Document();
        //向文档对象中添加域
        document.add(fieldName);
        document.add(fieldPath);
        document.add(fieldContent);
        //document.add(fieldSize);
        document.add(fieldSizeValue);
        document.add(fieldSizeStore);
        //5、把文档对象写入索引库
        indexWriter.addDocument(document);
	  }
	    //6、关闭indexwriter对象
	    indexWriter.close();
	//4. 向文档对象中添加域
	//5. 关闭IndexWriter对象
}

Store.YES 保存 可以查询 可以打印内容

Field storeYes = new Field(“storeyes”,“storeyes”,Store.YES,Index.TOKENIZED);

Store.NO 不保存 可以查询 不可打印内容 由于不保存内容所以节省空间,但是这个索引是存在的,可以通过这个索引去检索

Field storeNo = new Field(“storeno”,“storeno”,Store.NO,Index.TOKENIZED);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值