项目源码:https://github.com/tangxing1993/lucene
查找索引库
可以按照关键词查询指定的列,根据相关度返回查询结果,也可以自定义搜索结果的排序方式。
查询过程
IndexSearch是查找索引库的核心API,该类继承抽象类Searcher,查询依赖一个或多个索引库。
提供通用的查询方法:
public void doSearch(Query query){
IndexSearcher searcher = null;
try{
searcher = new IndexSearcher(this.getIndexReader());
TopDocs topDocs = searcher.search(query, 10);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
Document doc = null;
for(ScoreDoc sd : scoreDocs){
doc = searcher.doc(sd.doc);
System.out.println("docid:"+sd.doc+" | url:"+doc.get("url")+" | content:"+doc.get("content"));
}
}catch(Exception e){
e.printStackTrace();
}
}
常用查询
基本词查询(也叫精确查询,查询不切分的字段)
TermQuery实现精确查询
public void searchByTermQuery(){
TermQuery query = new TermQuery(new Term("content", "java"));
this.doSearch(query);
}
模糊匹配
FuzzyQuery实现模糊查询
public void searchByFuzzy(){
FuzzyQuery query = new FuzzyQuery(new Term("content", "lucen"));
this.doSearch(query);
}
前缀查询
PrefixQuery实现前缀查询
public void searchByPrefix(){
PrefixQuery query = new PrefixQuery(new Term("content","hello"));
this.doSearch(query);
}
布尔查询(多条件查询,组合条件查询)
BooleanQuery实现多条件查询,旧版本直接构建booleanQuery对象,然后添加查询条件实现查询,新版本先用BooleanQuery.builder构建查询条件,然后构建查询对象实现多条件查询。
public void searchByBoolean(){
//构建一个多条件查询对象 (注意新旧版本的创建方法不一样)
BooleanQuery.Builder buildQuery = new BooleanQuery.Builder();
//添加一个精确查询,条件必须的 Occur.MUST true Occur.
buildQuery.add(new BooleanClause(new TermQuery(new Term("content", "am")), Occur.MUST));
buildQuery.add(new BooleanClause(new WildcardQuery(new Term("content", "j?v*")),Occur.MUST));
//构建多条件查询对象
BooleanQuery query = buildQuery.build();
this.doSearch(query);
}
短语查询(要求精确匹配的查询)
PhraseQuery实现短语查询
public void searchByPhrase(){
PhraseQuery query = new PhraseQuery("content", "i","am");
this.doSearch(query);
}
范围查询
TermRangerQuery实现范围查询
public void searchByTermRangeQuery(){
TermRangeQuery query = TermRangeQuery.newStringRange("content", "a", "m",true, true);
this.doSearch(query);
}
跨度查询(字词混合查询)
SpanTermQuery是跨度查询
public void searchBySpanTermQuery(){
SpanNearQuery query = new SpanNearQuery(new SpanQuery[]{
new SpanTermQuery(new Term("content","i")),
new SpanTermQuery(new Term("content", "like"))
}, 1, true);//1表示跨度在一个范围之内 true表示按照数组中给出的顺序出现
this.doSearch(query);
}
解析查询(万能的查询)
QueryParser是查询语句解析器,可以向解析器内输入查询条件,最后由解析器生成对应的查询对象。
public void searchByQueryParse(){
QueryParser parser = new QueryParser("content", analyzer);
Query query = null;
try {
//query = parser.parse("java"); //类似于termQuery
//query = parser.parse("url:a.txt"); //切换查找域到url域,查找内容为包含a.txt的内容
//parser.setAllowLeadingWildcard(true); //设置首字母允许使用通配符
//query = parser.parse("url:?.txt"); //类似于WildcardQuery
//query = parser.parse("jav~"); //类似于FuzzyQuery
//query = parser.parse("am AND like"); //查找内容中包含 am和like的内容
//query = parser.parse("am OR like"); //查找内容中包含am或者like的值
//query =parser.parse("[1 TO 3]"); //查找1-3的内容
query = parser.parse("{1 TO 3}"); //查找包含2的内容
this.doSearch(query);
} catch (ParseException e) {
e.printStackTrace();
}
}