Luence
是Apache软件基金会的一个项目,是一个开发源码的全文检索引擎工具包,是一个全文检索引擎的一个架构。提供了完成的查询引擎和检索引擎,部分文本分析引擎。
全文检索程序库,虽然与搜索引擎相关,但是不能混淆。
官方网址:https://lucene.apache.org/
帮助文档:https://lucene.apache.org/core/4_9_1/index.html
官方解释:
Lucene is a Java full-text search engine. Lucene is not a complete application, but rather a code library and API that can easily be used to add search capabilities to applications.
倒排索引
了解Luence要知道倒排索引;
通俗解释,我们通常都是通过查找文件位置及文件名,再查找文件的内容。倒排索引可以理解为通过文件内容来查找文件位置及文件名的。
倒排索引是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。
倒排索引也是lucence的索引核心。
文件内容可以表示一个field,文件名称可以表示一个field,将整个field进行分词,然后根据分词创建索引,建立一个个term;
如:文件的内容作为一个field,命名为"contents",将文件内容进行分词,假设文件内容为"A B",分词结果为"A","B",这样term的信息就为两条,field的内容为"contents",term对应的文本内容分别为"A"和"B"。
当查找指定分词的时候就可以获取这个分词所在的doc,并获取doc相关的信息。
demo编程
例子参考官方demo; package位置:org.apache.lucene.demo
自己写了一个demo
依赖的jar包:
commons-io-2.4.jar
lucene-analyzers-common-4.9.1.jar
lucene-core-4.9.1.jar
lucene-queries-4.9.1.jar
lucene-queryparser-4.9.1.jar
MyIndexFiles.java
import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test; import java.io.File;
import java.io.IOException; /**
* Created by Edward on 2016/7/25.
*/
public class MyIndexFiles { public static void main(String[] args) throws IOException { //文件方式存储索引文件
FSDirectory directory = FSDirectory.open(new File("D:\\documents\\Lucene\\MyDemo\\index")); //文本解析器,分词器
Analyzer analyzer= new StandardAnalyzer(Version.LUCENE_4_9); //索引写配置,要指定解析器及版本信息
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_4_9, analyzer); //创建写索引
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig ); //路径
File path = new File("D:\\documents\\Lucene\\MyDemo\\docs");
//文件列表
File[] listFile = path.listFiles();
for(File file: listFile){
//创建doc
Document doc = new Document(); //获取文件属性信息
String filename = file.getName();
long lastModified = file.lastModified(); //通过commons-io-2.4.jar包中的FileUtils方法,读文件内容转化为String
String readFile2Sting = FileUtils.readFileToString(file); //将field添加到doc
//StringField不进行分词,当做一个分词
//Field的有索引和存储属性,
//Field.Store.NO代表数据不进行存储,仅能索引到,多用来处理文本内容,可获取文件名然后通过文件位置打开文件获取内容
//Field.Store.YES代表存储数据,通常用来直接获取文件路径
doc.add(new StringField("filename", filename, Field.Store.YES));
doc.add(new LongField("modify", lastModified, Field.Store.YES));
doc.add(new TextField("contents",readFile2Sting, Field.Store.NO)); //新增的方式
//indexWriter.addDocument(doc); //更新的方式, 更新与term匹配的docs
indexWriter.updateDocument(new Term("filename", file.getName()), doc);
}
indexWriter.close();
} @Test
public void serach() throws IOException, ParseException { //本地索引文件
Directory directory = FSDirectory.open(new File("D:\\documents\\Lucene\\MyDemo\\index")); //读索引目录
IndexReader indexReader = DirectoryReader.open(directory); //创建索引搜索对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader); Analyzer analyzer= new StandardAnalyzer(Version.LUCENE_4_9); //查询解析 指定查询的item,解析器,版本
QueryParser queryParse = new QueryParser(Version.LUCENE_4_9, "contents", analyzer); //查询内容
Query query = queryParse.parse("111"); //查询指定条数
int num = 6;
TopDocs topDocs= indexSearcher.search(query, num); //采集数
ScoreDoc[] docs = topDocs.scoreDocs; for(ScoreDoc doc:docs){ //获取doc编号
int i = doc.doc; //通过文档编号获取文档信息
Document d = indexSearcher.doc(i); //打印文档信息
System.out.println(d.get("filename"));
System.out.println(d.get("modify"));
System.out.println(d.get("contents"));
}
indexReader.close();
} }
Luence的更多相关文章
-
Luence学习笔记
1.Luence的核心索引类 IndexWriter:建立索引的核心组件 Directory:代表一个lucene索引项的位置,是一个抽象类其子类有FSDirectory和RAMDirectory F ...
-
Luence简单实现1
初步认识Luence,简单按照官方文档做了个例子,大牛绕开,仅供小白路过参考.如有错误,欢迎指正批评. 建一个简单工程,并且加入这几个小奶瓶,如下图: 注:版本不同,可能对jdk的需求是不同的,这个需 ...
-
Luence简单实现2
上一篇是基于内存存储的,这次的例子是基于本地存储索引库. 上一次的代码稍微修改,代码如下: //创建词法分析器 Analyzer analyzer = new StandardAnalyzer(); ...
-
luence全文检索(数据库检索)
注解:从数据库中查询所有数据然后放入luence中,然后在luence来检索 package com.zhu.demo; import java.io.IOException; import java ...
-
luence全文检索(简介)
刚开始做全文检索也是找了很多资料但是网上的都不是很齐全luence是个很不多的工具 Lucene4.0的官网文档:http://lucene.apache.org/core/4_0_0/core/ov ...
-
(二)Luence——代码实现索引及搜索
完成需求:使用Lucene完成对数据库中图书信息的索引和搜索功能. 1. 环境准备及工程搭建 1.1 环境准备 mysql5.5+java8+lucene4.10.3(目前最新7.0.1,这里够用就好 ...
-
luence优化速度
一. .索引优化背景 很多网站都有自己的搜索引擎,比如百度,搜狗等等,而他们每天添加的索引量可想而知多么庞大,所以为了能提升用户的搜索响应速度,好的优化方案必不可少:当然对于一些网站的站内搜索也很有必 ...
-
【NLP】十分钟快览自然语言处理学习总结
十分钟学习自然语言处理概述 作者:白宁超 2016年9月23日00:24:12 摘要:近来自然语言处理行业发展朝气蓬勃,市场应用广泛.笔者学习以来写了不少文章,文章深度层次不一,今天因为某种需要,将文 ...
-
logstash日志分析的配置和使用
logstash是一个数据分析软件,主要目的是分析log日志.整一套软件可以当作一个MVC模型,logstash是controller层,Elasticsearch是一个model层,kibana是v ...
随机推荐
-
ASP.NET MVC 从零开始 - Web.config
这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 在上一篇中,我们从零开始创建了一个非常简单的 ASP.NET MVC 应用程序.接下来,你是不是期望我 ...
-
(Hibernate进阶)Hibernate搭建开发环境+简单实例(二)
hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和 ...
-
8款必备的免费移动Web开发框架(HTML5/JS)
标签:JavaScript HTML5 移动开发 Web开发 jQuery 应用程序框架 插件 概述:随着智能手机和平板电脑的普及,移动开发逐渐成为众多开发者追逐的潮流.拥有一款优秀的移动Web开发框 ...
-
tcpdump来抓取执行的sql语句
# tcpdump -n -nn -tttt -i eth1 -s 65535 'port 3306' -w tcpdump_mysql.ret -C 100 一个TCP包中包含多个mysql协议包, ...
-
ZOJ Monthly, March 2013
A题 题目大意:给出一棵树,一开始节点值均为0,先要求完成在线操作:将某子树所有节点值取反,或者查询某子树总点权. 题解:很基础的线段树题,既然两个操作都是子树操作,那么就先树链剖分一下,将子树操作转 ...
-
jquery简单封装
对Raphael画图标的一个jquery简单封装 公司要做一个项目的demo,要求地图上可以插红旗,所以就用到了Raphael. 因为是个demo,所以地图就用了一张图片,效果如下: 所以为了更好的封 ...
-
mac系统 安装pip,用python读写excel(xlrd、xlwt)安装
1: 先安装python, 下载地址:https://www.python.org/downloads/release/python-372/ 2: 安装pip 下载一个get-pip.py的文件 ...
-
使用Java解析XML
一.解析的对象 <?xml version="1.0" encoding="UTF-8"?> <users> <user id=& ...
-
MYSQL CASCADE DELETE 引发的思考
MYSQL CASCADE DELETE :级联删除.这个概念还是学习Oracle时得到的. 就是主键记录删除时,相关的有外键的表里的记录,也删除. https://dev.mysql.com/doc ...
-
STM32硬件IIC驱动设计(转)
源: STM32硬件IIC驱动设计 参考: STM32—硬件IIC主机通信 STM32’s I2C 硬件BUG引发的血案(qzm) 解决STM32 I2C接口死锁在BUSY状态的方法讨论