Lucene的简单查询
程序员文章站
2022-07-09 09:31:00
...
一、特定查询
基本是对一个域进行匹配单一的匹配查询
Term term=new Term("name","小小");
TermQuery query=new TermQuery(term);
TopDocs hits=searcher.search(query,10);
二、QueryParse的简单用法
基本是对输入的查询先分词然后生成Query的子类,这样是查询共能更加的灵活和强大
QueryParse pq=new QueryParse("版本",域,分词器);
Query q=pq.parse("内容");
内容有些基本的格式
java 默认包含
java junit /java or junit 包含一个或者两个
+java +junit /java and junit 两个都包含
title:ant title域中包含ant
title:extreme -subject:sports title中包含切subject中没有
/title:extreme and not subject:sprots sprots
(agile or extreme) and method 默认域包含前面的一个或者两但一定包含metod
title:"junit in action" title域为junit in action的文档
title:"junit action "~5 title域中junit 和action 之间距离小于5的文档
java* 前缀是java的文档
java~ 包含相似的文档lava
lastmodified:(1/1/09~12/31/09) lastmodified域在第一个日期和第二个日期之间
练习下简单的搜索
QueryParse qp=new QueryParse(版本,域,分词);
Query q=qp.parse("name: 小* and not ype:天灾")
查询的是名字是前缀是小,但是不是天灾的。
结果
阵营==近卫
名字==小小
id==2
阵营==近卫
名字==小牛
id==4
搜索
QueryParser q=new QueryParser(Version.LUCENE_42, "name", new SmartChineseAnalyzer(Version.LUCENE_42));
query=q.parse("name: 小*");
结果:
阵营==近卫
名字==小小
id==2
阵营==近卫
名字==小牛
id==4
阵营==天灾
名字==小黑
id==5
三、IndexSearch的基本用法
声明
IndexSearch serch=new IndexSearch(IndexReader);
IndexReader的消耗的资源很多,一般一个IndexReader重复使用
reOpen();用于索引的改变时重新打开
多线程使用的时候注意线程安全,并关闭老的IndexReader
search()的常用方法
TopDocs search(query,int) 返回评分高的前N个
TopDocs search(query,Filter,int) 受文档子集约束,约束基于过滤策略
TopFileldDocs search(query,Filter,int,sort)......排序
void search(query,Collector) 不想返回前N个
void search(query,Filter,Collector)...有过滤策略
四TopDocs常用方法
totalHits 匹配搜索条件的文档那个数
getMaxScore 最大的评分数
ScoreDocs 匹配文档的一个集合
五、多样化的查询
TermQuery 关键字进行查询
TermRangeQuery 进行一个查询范围选择
NumercRangeQuery 对数字进行范围的一个查询
PrefixQuery 层次递归进行查询通过字符串进行搜索
BooleanQuery 综合查询允许进行进行组合操作的逻辑运算
BooleanClause.Occur.Must and
.............................SHOULD or
PhraseQuery 短语搜索
WildCardQuery 通配符查询 */?
FuzzyQuery 模糊查询
MatchAllDocsQuery 匹配所有的
上一篇: PL/SQL 3之——sql语句
下一篇: div居中可能存在的问题及解决方案