分享一些关于Lucene的心得
Lucene的概述
Lucene是一个全文搜索框架,而不是应用产品。因此它并不像http://www.baidu.com/ 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。
lucene能做什么
lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你你要搜索的关键词出现在哪里。知道了这个本质,你就可以发挥想象做任何符合这个条件的事情了。你可以把站内新闻都索引了,做个资料库;你可以把一个数据库表的若干个字段索引起来,那就不用再担心因为“%like%”而锁表了;你也可以写个自己的搜索引擎……
2 lucene的工作方式
lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源。
写入流程
1.源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。
2.将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。
3.将索引写入存储器,存储器可以是内存或磁盘。
主要关键字【作用】
a) Analysis:分词器
Analysis包含一些内建的分析器,例如按空白字符分词的WhitespaceAnalyzer,添加了stopwrod过滤的StopAnalyzer,最常用的StandardAnalyzer。
b) Documet:文档
就是我们的源数据的封装结构,我们需要把源数据分成不同的域,放入到documet里面,到时搜索时也可以指定搜索哪些域(Field)了。
c) Directory : 目录,这是对目录的一个抽象,这个目录可以是文件系统上面的一个dir(FSDirectory),也可以是内存的一块(RAMDirectory),MmapDirectory为使用内存映射的索引。
放在内存的话就会避免IO的操作耗时了,根据需要选择就是了。
d) IndexWriter : 索引书写器,也就是维护器,对索引进行读取和删除操作的类
e) IndexReader : 索引读取器,用于读取指定目录的索引。
f) IndexSearcher : 索引的搜索器,就是把用户输入拿到索引列表中搜索的一个类
需要注意的是,这个搜索出来的就是(TopDocs)索引号,还不是真正的文章。
g) Query : 查询语句,我们需要把我们的查询String封装成Query才可以交给Searcher来搜索 ,查询的最小单元是Term,Lucene的Query有很多种,根据不同的需求选用不同的Query就是了.
i. TermQuery:
如果你想执行一个这样的查询:“在content域中包含‘lucene’的document”,那么你可以用TermQuery:
ii. BooleanQuery:多个query的【与或】关系的查询
如果你想这么查询:“在content域中包含java或perl的document”,那么你可以建立两个TermQuery并把它们用BooleanQuery连接起来:
iii. WildcardQuery : 通配符的查询
如果你想对某单词进行通配符查询,你可以用WildcardQuery,通配符包括’?’匹配一个任意字符和’*’匹配零个或多个任意字符,例如你搜索’use*’,你可能找到’useful’或者’useless’:
Query query = new WildcardQuery(new Term("content", "use*");
iv. PhraseQuery : 在指定的文字距离内出现的词的查询
你可能对中日关系比较感兴趣,想查找‘中’和‘日’挨得比较近(5个字的距离内)的文章,超过这个距离的不予考虑,你可以:
PhraseQuery query = new PhraseQuery();
query.setSlop(5);
query.add(new Term("content ", “中”));
query.add(new Term(“content”, “日”));
那么它可能搜到“中日合作……”、“中方和日方……”,但是搜不到“中国某高层领导说日本欠扁”。
v. PrefixQuery : 查询词语是以某字符开头的
如果你想搜以‘中’开头的词语,你可以用PrefixQuery:
PrefixQuery query = new PrefixQuery(new Term("content ", "中");
vi. FuzzyQuery : 相似的搜索
FuzzyQuery用来搜索相似的term,使用Levenshtein算法。假设你想搜索跟‘wuzza’相似的词语,你可以:
Query query = new FuzzyQuery(new Term("content", "wuzza");
你可能得到‘fuzzy’和‘wuzzy’。
vii. TermRangeQuery : 范围内搜索
你也许想搜索时间域从20060101到20060130之间的document,你可以用TermRangeQuery:
TermRangeQuery query2 = TermRangeQuery.newStringRange("time", "20060101", "20060130", true, true);
最后的true表示用闭合区间。
viii.
h) TopDocs :结果集,就是searcher搜索的结果,里面就是一些ScoreDoc,这个对象的doc成员就是这个Id了!
要想得到文章,那么就得需要用这个Id去取文章了,searcher提供了用id得到document的方法,于是就取到了数据了
//庖丁分析器
Analyzer analyzer = new PaodingAnalyzer();
List<Article> resu = docRecordService.wx();//取元数据
//创建Directory
Directory dir = FSDirectory.open(new File(indexDir));
//创建Writer
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_44, analyzer);
iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);//设置索引维护的方式
IndexWriter writer = new IndexWriter(dir, iwc);
try {
for (int i = ; i < resu.size(); i++) {
//文档实体类
DocRecord drec = new DocRecord();
//创建文档
Document document = new Document();
drec.setFileName(resu.get(i).getPid());
drec.setDocType("weixin");
drec.setLastModify(System.currentTimeMillis());
drec.setTitle(resu.get(i).getTitle());
try {
System.out.println("开始分词工作 : ------> " + i);
long time = resu.get(i).getPublishTimeMillis();
if((time+"").length()<){
time = time*;
}
String tag = resu.get(i).getArticleTag();
//得到时间戳
dateTime = resu.get(i).getPublishTimeMillis();
FieldType testType = new FieldType();
testType.setIndexed(false);
testType.setTokenized(false);
testType.setStored(true);
//创建文章 标题,标签,简介,分类,时间,封面图地址,原文地址
document.add(new StringField("fileName", resu.get(i).getPid(), Field.Store.YES));
document.add(new TextField("abstracts", resu.get(i).getAbstracts()==null?"":resu.get(i).getAbstracts(), Field.Store.YES));
if(null!=resu.get(i).getPublisher() && !"".equals(resu.get(i).getPublisher())){
document.add(new StringField("author", resu.get(i).getPublisher(), Field.Store.YES));
}else{
document.add(new StringField("author", resu.get(i).getAuthor(), Field.Store.YES));
}
document.add(new StringField("categoryCode", resu.get(i).getCategoryCode(), Field.Store.YES));
document.add(new StringField("categoryName", resu.get(i).getCategoryName()==null?"":resu.get(i).getCategoryName(), Field.Store.YES));
document.add(new Field("imageUrl", resu.get(i).getThemeImageUrls(), testType));
document.add(new Field("sourceUrl", resu.get(i).getSourceUrl(), testType));
document.add(new StringField("isCopyRight", resu.get(i).getIsCopyRight(), Field.Store.YES));
document.add(new StringField("source", resu.get(i).getSource(), Field.Store.YES));
document.add(new TextField("title", resu.get(i).getTitle(), Field.Store.YES));
document.add(new LongField("date",time , Field.Store.YES)); //这里的yes表示可以建立索引搜索
if(null!=resu.get(i).getSn() && !"".equals(resu.get(i).getSn())){
document.add(new StringField("sn",resu.get(i).getSn() , Field.Store.YES));
}
if(null!=tag && !"".equals(tag)){
document.add(new StringField("tag", tag, Field.Store.YES));
} writer.updateDocument(new Term("fileName",(resu.get(i).getPid())!=null?(resu.get(i).getPid()):""), document);
//更新数据库is_index字段,说明数据已做索引
// int id = docRecordService.createDoc(drec);
System.out.println("完成分词工作 : ------> " + i);
} catch (Exception e) {
e.printStackTrace();
}
} writer.close();
dir.close();
} catch (Exception e) {
e.printStackTrace();
}
分享一些关于Lucene的心得的更多相关文章
- 本文分享一下ehcache的使用心得,本文主要讲以广播的形式同步缓存。
本文分享一下ehcache的使用心得,本文主要讲以广播的形式同步缓存. 下面讲述主要分为两个部分,一个是配置文件,一个是Java代码. 1.准备jar包: slf4j-api-1.7.12.jar,e ...
- 分享一下学习css,js心得
简化代码,使页面简洁! web前端开发——将界面更好呈现给用户! 要了解在不同浏览器上的兼容情况.渲染原理和存在的bug! 网站性能优化.SEO: 代码的可维护性.性能: 网站重构的本质:建立一个前端 ...
- 分享一个Panda C-60 维修心得
昨天丰臣国际搞了个汽车后备箱市场,说白了就是一帮闲的没事儿的"白领"大热天把自家闲置的东西拿过来练练摊,这个形式还是不错的,中间看到了一个熊猫的CD机,一眼就看上了,虽说CD早就过 ...
- 我的WebX框架学习总结与心得分享
最近学习了webx框架, 利用博客园跟大家分享一下自己的学习心得; 周建旭 2014-08-21 网上关于webx的资料少的可怜, 怎么办? 这种情况下不用去求助别人求人只会耽误时间, 不用畏惧; ...
- 【腾讯Bugly干货分享】美团大众点评 Hybrid 化建设
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/rNGD6SotKoO8frmxIU8-xw 本期 T ...
- 开始android博客分享
现在开始写博客,分享android开发中的心得.
- freemarker的使用心得
freemarker眼下尽管使用的公司不多,可是在某些时候就必须使用,当须要遍历json数据的时候,眼下市面上的好多显示组件都达不到要求唯一能用的也就仅仅有freemarker了.在java里使用的模 ...
- mycat学习心得
最近老大要求我们学习mycat,并运用到实际项目中.现在简单分享下自己的学习心得,也算是只是积累吧. 什么是mycat? 用我的话理解就是:mycat是一种技术,采用mycat后可以提高程序的速度,也 ...
- 好文推荐:转载一篇别人kaggle的经验分享
转载:https://www.toutiao.com/i6435866304363627010/ 笔者参加了由Quora举办的Quora Question Pairs比赛,并且获得了前1%的成绩.这是 ...
随机推荐
- CI框架3.0版本以后,前后台分离的方法。
笔者认为,CI框架官方其实并没有考虑这个前后台分离的问题,所以没有官方的分离方法.而且,2.0版本的分离,也被官方认为这是一个bug.所以在前后台分离这个问题上,其实并不如thinkphp框架. 在C ...
- VC OnCtlColor函数来修改控件背景颜色
CWnd::OnCtlColor afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor ); 返回值:OnCtlColor必须 ...
- Windows对象、句柄与MFC对象
windowsmfc编程c 目录(?)[-] Windows对象句柄与MFC对象 windows对象 句柄 mfc对象 杂谈 Windows对象.句柄与MFC对象 (2009-04-28 22:11: ...
- 天梯赛L2-006. 树的遍历L3-010. 是否完全二叉搜索树
L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...
- CentOS 下部署Nginx+Gunicorn+Supervisor部署Flask项目
原本之前有一部分东西是在Windows Server,但是由于Gunicorn不支持Windows部署起来颇为麻烦.最近转战CentOS,折腾一段时间,终于简单部署成功.CentOS新手,作为一个总结 ...
- Spring Security认证提供程序
1.简介 本教程将介绍如何在Spring Security中设置身份验证提供程序,与使用简单UserDetailsService的标准方案相比,提供了额外的灵活性. 2. The Authentica ...
- Java代码读取文件
用Java代码读取文件时,保持文件本来的格式(主要是保持换行),这点有时候比较重要.用代码实现也相当简单. private static void readFile() { StringBuilder ...
- sublime配置nodejs运行调试js
node.js调试javascript的配置 1. 首先到 nodejs.org 下载 Node.js 安装包并安装.2. 打开 Sublime Text 编辑器.选择菜单 Tools --> ...
- Centos7.x 安装 pptp
VPN 1:检查是否支持PPTP #返回OK && echo ok ok 2:安装ppp yum install -y ppp 3:导入EPEL源 rpm -ivh http://dl ...
- Linux操作学习笔记1
Linux只有一个根目录/,所有的文件和设备都当成是文件进行管理: pwd 打印当前工作目录 (print working directory) whoami ls 列出当前目录面的文件 ls -l ...