lucene 学习笔记

lucene是基于java的全文搜索引擎框架 

lucene的存储结构 
lucene 其实很简单的,它最主要就是做两件事:建立索引和进行搜索 

IndexWriter:lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。 
Analyzer:分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,
WhitespaceAnalyzer分析器等。 
Directory:索引存放的位置;lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上; 
相应地lucene提供了FSDirectory和RAMDirectory两个类。 
Document:文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。 
Field:字段。 
IndexSearcher:是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具; 
Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery, 
WildcardQuery等一些类。 
QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。 
Hits:在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中, 
搜索的结果的集合是用Hits类的实例来表示的。 

对索引库的操作可以分为两种:管理与查询。管理索引库使用IndexWriter,从索引库中查询使用IndexSearcher。 
Lucene的数据结构为Document与Field。Document代表一条数据, 
Field代表数据中的一个属性。一个Document中有多个Field,Field的值为String型,因为Lucene只处理文本。 

我们只需要把在我们的程序中的对象转成Document,就可以交给Lucene管理了,搜索的结果中的数据列表也是Document的集合。 

lucene 的分词器 
概念:将文本按规则切分为一个个可以进行索引的最小单位(关键词) 
注意:在建立索引和搜索时都要用同一个分词器 

英文分词器: 
英文的工作过程如下:     a,of,the,     worked,working 变成work 
输入文本-> 关键词切分 -> 去除停留字 -> 形态还原 -> 转为小写 
中文分词器: 
单个字分词:StandAnalyzer 
两个字分词:CJKAnayzer 
词典分词:按照某种算法构造词,然后就去匹配已经建立好的的词库中查找 
,如果匹配到就切分为词语。MManalyzer(极易分词),庖丁分词 
lucene 的查询 
1.可以通过lucene的类似sql语法的字符串查询语法来查找 
关键字查询-name:"hello" 
范围查询- age:[18 TO 60],age:{18 TO 60},[]表示是包过边界值,而{}不包括,这里TO一定是大写 
通配符查询- name:爱*,name:*爱*,name:我? 
'?' 代表一个字符, '*' 代表0个或多个字符 
短语查询- content: "?爱你??莉莉",content:"爱你莉莉"~2 
2.通过Query的具体实现类的实例才实现查询 

TermQuery 关键字查找 
RangerQuery 范围查询 
lucene 的排序 
WildcardQuery 通配符查询 
PhraseQuery 短语查询 
1.lucene默认的相关度排序 

每个Field,Document都一个boost值,用来计算相关度值 


可以在搜索的时候指定field的boost 
//设置field的boost值 
Map<String, Float> boosts = new HashMap<String, Float>(); 
boosts.put("name", 3f); 
// boosts.put("content", 1.0f); 默认为1.0f 

在索引的时候指定boost值 
Document doc = File2DocumentUtils.file2Document(filePath); 
doc.setBoost(3f); 
indexDao.save(doc); 

Document doc2 = File2DocumentUtils.file2Document(filePath2); 
// doc2.setBoost(1.0f); 
2.自定义排序 

// ========== 排序 
Sort sort = new Sort(); 
sort.setSort(new SortField("size")); // 默认为升序 
// sort.setSort(new SortField("size", true));//true表示降序 

lucene过滤器的使用filter 

filter会大大降低查询的效率,应该慎重使用 

RangeFilter可以对搜索出来的结果过滤 
Filter filter = new RangeFilter("size", NumberTools.longToString(200) 
, NumberTools.longToString(1000), true, true); 
TopDocs topDocs = indexSearcher.search(query, filter, 10000, sort);

转载于:https://my.oschina.net/chen106106/blog/40578

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值