Lucene4.1 视频学习
1.将路径建立在内存中 Directory d = new RAMDirectiry();
2.Filed Index(索引选项):
Index.ANALYZED:进行分词和索引,适应于标题,内容等
Index.NOT_ANALYZED:进行索引,但是不进行分词,比如说身份证号,姓名等,用于精确查找
Index.ANALYZED_NOT_NORMS 进行分词但不存储norm信息,该信息包括创建索引时间和权值等内容
Index.NOT_ANALYZED_NOT_NORMS:不进行分词也不存储norm信息
Index.NO 不进行索引
3.IndexReader indexr = IndexReader.open(directory);
读取文档数量 indexr.numDocs();
文档总数量 indexr.maxDocs();
删除的文档数量 indexr.numDeleteDocs();(通过deleteDcoument删除的文档不会彻底删除,保存在*.del文件中)
可以按如下代码恢复通过deleteDocument删掉的文档:
IndexReader index = IndexReader.open(directory,false);(布尔类型的值是设置readonly的)
reader.undeleteAll();(此时文档恢复,*.del消失)
通过forceMergeDeletes()删除的文档无法恢复(在3.5之前是通过optimize()方法来实现的,只不过消耗资源,3.5之后弃用)
4.updateDocument 操作实际上为先删除后添加
indexr.updateDocument(term,doc);
term为要删除的内容,doc为添加的内容,故两者id可以不同
5.添加数字类型的域 NumericField(String name , Store store ,boolean index)
doc.add(new NumericField("content" , Field.Store.YES , true).setIntValue("value"));
数字类型的范围查询
Query queryPrice = NumericRangeQuery.newDoubleRange(ProductIndexFields.price.toString(), Double.valueOf(priceFrom.trim()), Double.valueOf(priceTo.trim()), true, true); 参数表示的内容依次为下限,上限,下限区间的开闭,上限区间的开闭
6.doc.setBoost();添加索引的时候设置boost ,然后存储在索引文件中
search的时候获取boost是1.0 原因是两个document已经不同,一个是索引文件中存储的,一个是用search.doc(docId)获取的
7.为了节省reader打开和关闭需要的时间,可以创建一个单例的indexReader,不进行关闭,
也就是一个项目只有一个单独的indexReader
private static IndexReader reader= null ;
在构造方法内初始化reader即可
然后可以在方法中如下写:(openIfChanged方法:如果reader发生变化,则重新打开新的reader , 否则返回null)
if(reader == null){
reader = IndexReader.open(directory);
}else{
IndexReader ir = IndexReader.openIfChanged(reader);
reader.close();
if(ir != null) reader = ir ;
}
即可实现动态建立reader,查看进行更新 删除后的结果
也可以实现一个单独的indexWriter ,此时不能用indexWiter.close()来实现提交writer
改变索引之后,需要indexWriter.commit()来实现数据的实时删除更新
一般用writer删除索引内容
查询:
1.TermQuery(Term) 基本查询 精确匹配 有什么查什么
2.TermRangeQuery(field , start , end , 开区间/闭区间 , 开区间/闭区间 ) 范围查询 无法查询numField的索引
TermRangeQuery("name" , "a" ,"s" , true ,true )查询a开头s结尾的
3.NumricRangeQuery 查询数字范围的 Query query = NumricRangeQuery.newIntRange(filed , end , 开区间/闭区间 , 开区间/闭区间)
4.PrefixQuery(Term) 匹配每个单词的前缀(索引的时候会把一句话分成一个个单词)
5.WildcardQuery(Term) 可以在传入的value中使用通配符 ? 一个字符 * 任意多个字符
6.BooleanQuery 可以组合多个query
7.PhraseQuery 短语查询 可以依靠一句话中的几个单词和中间隔的位置来查询
PhraseQuery query = new PhraseQuery();
query.setSlop(1); //设置中间隔的位置数
query.add(new Term("content","i"));
query.add(new Term("content","you")); 则可以查出 I love You(index 的时候会变成 i love you)等内容
8.FuzzyQuery(Term) 模糊查询 可以匹配跟value有一个不同的模糊查询,最多两个
比如 make , 可以查出 mike jake等内容 还有其他设置可以进行
QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35))
Query query = parser.parse(keyword);
对于keyword
1.空格默认or a b 就是包含a或者b a AND b 就是包含a和b
2.name:mike 在name中搜索含有mike的
3.email:*@corezon.com 在email中查询以corezon邮箱结尾的(前提是设置parser.setAllowLeadingWildCard(true),
不然*开头会使query消耗过大而默认关闭此情况);
4.- name:mike +content:football: name中不含有mike ,但是content中含有football的
5.id:[1 TO 3] :匹配id从1 到3闭区间 也就是 1 2 3
6.id:(1 TO 3) :匹配id从1 到3开区间 也就是 2
7."\"i like football\"" :匹配含有 i like football的 短语的匹配
8."\"i football\"~1" :匹配i 和 like 之间有一个单词的
以上内容只是匹配string类型的索引的
从某一个ScoreDocs开始得到size为20的topdocs
TopDocs td = searcher.searchAfter(lastsd,query,size)
11.TokenStream 分词器做好处理之后得到的一个流,这个流中存储了分词的各种信息,
可以通过TokenStream有效的获取分词单元信息
Tokenier主要负责接收字符流reader ,将数据转化为语汇单元
Tokenfilter 对已经分好的词进行过滤 比如大小写 ……
12.主要的分词器:
StandardAnalyzer StopAnalyzer WhitespaceAnalyzer SimpleAnalyzer
13.自定义停词分词器
中文分词器
近义词分词器 需要熟悉
14.设置排序之后 评分就是消失 默认是升序
indexsearcher.search(quertstr,length,sort)
Sort.INDEXORDER 通过doc的id进行排序
Sort.RELEVANCE 使用默认的排序方式
new SortField("size",SortFiled.INT)使用某个字段的内容排序 ,比如说size的大小
new SortField("filename",SortFiled.STRING) 通过filename的首字母排序
new SortField("filename",SortFiled.STRING,true) 设置降序排序 最后参数表示是否反转
19.其他知识
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_41,analyzer);
LogMergePolicy mergePolicy = new LogByteSizeMergePolicy();
//达到3个文件时就和合并
mergePolicy.setMergeFactor(3);
iwc.setMergePolicy(mergePolicy);
Field.Store 表示“是否存储”,即该Field内的信息是否要被原封不动的保存在索引中。
Field.Index 表示“是否索引”,即在这个Field中的数据是否在将来检索时需要被用户检索到,一个“不索引”的Field通常仅是提供辅助信息储存的功能。
Field.TermVector 表示“是否切词”,即在这个Field中的数据是否需要被切词。
WildcardQuery与QueryParser不同的是:WildcardQuery的前缀可以为*,而QueryParser不行
FuzzyQuery 可以查询有两个单词不同的
// 多关键的搜索 PhrasePrefixQuery
public void phrasePrefixSearcher() throws IOException{
// 简言之,用第一个的term数组上面的每个内容匹配下面的term
IndexSearcher search = new IndexSearcher(directory); PhrasePrefixQuery query = new PhrasePrefixQuery(); // 这里两项都有可能首先被匹配
query.add(new Term[]{new Term("content","would"),new Term("content","can")}); // 只有一项必须匹配
query.add(new Term("content","help")); // If you would like to help promote OpenOffice
// can I help you
// slop因子的作用域为查询中的所有短语
query.setSlop(1); // 匹配第一项为 would 或 can 第二项为help
// solp设置为1
// If you would like to help promote OpenOffice 除去if to 外,would与help的距离=1
// can I help you 的距离也=1 所以可以搜索出两条数据 Hits hits = search.search(query); printResult(hits); search.close();
}
Term t = new Term("content", "work");
FuzzyQuery query = new FuzzyQuery(t);
//FuzzyQuery还有两个构造函数,来限制模糊匹配的程度
// 在FuzzyQuery中,默认的匹配度是0.5,当这个值越小时,通过模糊查找出的文档的匹配程度就
// 越低,查出的文档量就越多,反之亦然
FuzzyQuery query1 = new FuzzyQuery(t, 0.1f);
FuzzyQuery query2 = new FuzzyQuery(t, 0.1f, 1);
//第二个是设置匹配度,第三个是设置有多少个前缀字母完全匹配
部分代码来源:http://callan.iteye.com/blog/153553
setboost的运用:http://blog.csdn.net/yja886/article/details/6612104
Lucene4.1 视频学习的更多相关文章
- 庞锋 OpenCV 视频 学习进度备忘
书签:另外跳过的内容有待跟进 学习资源: opencv视频教程目录(初级) 主讲:庞锋,毕业于电子科技大学 知识基础支持: 线性代数 应用数学 跳过的内容: 1.第1~6集跳过,简单.(2014- ...
- linux的视频学习4(网络配置和rpm)
linux的视频学习: 1.网络配置的三种方式的介绍. 第一种方式: setup 命令--选择network configuration-->配置固定ip(tab键)和自动分配IP(长空格) / ...
- Kali视频学习21-25
Kali视频学习21-25 (21)密码攻击之在线攻击工具 一.cewl可以通过爬行网站获取关键信息创建一个密码字典. 二.CAT (Cisco-Auditing-Tool)很小的安全审计工具,扫描C ...
- Kali视频学习16-20
Kali视频学习16-20 (16)Kali漏洞分析之数据库评估(一) 一. BBQSql BBQSql 是Python编写的盲注工具(blind SQL injection framework),当 ...
- 传智播客.NET视频学习课件
传智播客.NET视频学习课件访问.NET网站了解更多课程详情http://net.itcast.cn(小提示:为什么本书中超链接打不开?)此套课件是伴随 传智播客.net实况教学视频 (小提示:为什么 ...
- KALI视频学习11-15
KALI视频学习11-15 第十一集 看到openvas的主界面(web界面) ping靶机,看是否能正常连通 创建一个扫描目标Configuration-Targets,默认扫描目标为本机 添加一个 ...
- Kali视频学习6-10
Kali视频学习6-10 kali信息收集之主机探测 主机探测指识别目标机器是否可用(简单来说是否在线),在探测过程中,需要得到目标是否online等信息.由于IDS和(入侵检测系统)和IPS(入侵保 ...
- Kali视频学习1-5
Kali视频学习1-5 安装 安装Kali虚拟机 设置网络更新,使用了163的源 deb http://mirrors.163.com/debian wheezy main non-free cont ...
- 新手入门 : Windows Phone 8.1 开发 视频学习地址
本视频资源来自Microsoft Virtual Academy http://www.microsoftvirtualacademy.com/ 下面为视频下载地址! 新手入门 : Windows P ...
随机推荐
- 10月23日上午PHP数组
正则表达式 1.替换 $s = "hello5world"; $s = preg_replace("/\d/","#",$s); echo ...
- 10月17日下午MySQl数据库CRUD高级查询
高级查询:1.连接查询 #适用于有外键关系的 没有任何关系没法用select * from Info,Nation #同时查询这俩表并把两表每个数据相互组合,形成笛卡尔积 select * from ...
- css让图片作为按钮的背景并且大小合适
最近在做ASP大作业,在做html页面的时候想把一个图片作为按钮的背景,搞了好久终于在csdn上找到了满意的答案: background-size: cover; 只需要这一句就ok了,就是这么简答. ...
- HTML学习笔记——选择器
1> ID选择器.交叉选择器.群组选择器.子代选择器 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...
- Interesting things in Unity 4.5 you probably didn't know about
http://va.lent.in/interesting-things-in-unity-4-5-you-probably-didnt-know-about/
- ecshop 网站标题不更新或内容不更新
网站标题不更新,这种情况一般出在网站搬家的过程中,把以前的所有配置文件一起都搬到新的服务器上了. 网站状态: 后台店铺标题已经修改,前台不显示,数据shop_config 的shop_title能更新 ...
- wex5 开机图片时间长
作用: 控制刚打开图片 时间长 修改config.xml 地址:F:\wex\model\Native\templates\advanced 延迟的时间是在本地app的 config.xml中修改, ...
- asp.net(C#)页面事件顺序
asp.net(C#)页面事件顺序 http://www.cnblogs.com/henw/archive/2012/02/09/2343994.html 1 using System.Data; ...
- MongoDB设置访问权限、设置用户(转)
MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下: 注:研究成果基于W ...
- ubuntu使用root用户登录/切换root权限
ubuntu系统默认root用户是不能登录的,密码也是空的. 如果要使用root用户登录,必须先为root用户设置密码 打开终端,输入:sudo passwd root 然后按回车 此时会提示你输入密 ...