Lucene5(5)搜索api

1、使用QueryParser搜索

QueryParser queryParser = new QueryParser("context",getAnalyzer());
Query query = null;
query = queryParser.parse("Identified");// 完整匹配分词查询
/**
 * 通配符 ?,*的使用
 */
// 使用?匹配单个字符查询
//query = queryParser.parse("Identi?ied");

// 使用*匹配多个字符查询
//query = queryParser.parse("L*r");

/**
 * 布尔运算AND, OR,NOT,+,-的使用,注意:一定要是大写的AND和OR,NOT
 */
// 使用OR联合多关键字查询,也可用空格代替OR
//query = queryParser.parse("Licensor OR ce*");

// 这个和使用OR一样的效果
//query = queryParser.parse(" Licensor ce*");

// +代表必须的条件,搜索文档必须包含Licensor 可能有Wildcard
//query = queryParser.parse("+Licensor Wildcard");

// 使用AND取多个关键字的并集查询
//query = queryParser.parse("Licensor AND ce* AND Licenso?");

// 搜索Lincensor Apache而不是Apache Licensor
//query = queryParser .parse("'Lincensor Apache' NOT 'Apache Licensor'");

// "-"同NOT的效果一样
//query = queryParser .parse("'Lincensor Apache' - 'Apache Licensor'");

/**
 * 使用正则表达式查询
 */
// 这个匹配Lincensor,aicensor,bicensor分词
//query = queryParser.parse("/[Lab]icensor/");

// 根据需要可以更灵活的使用
//query = queryParser.parse("/[Lab]icenso[a-z]/");

/**
 * 使用~模糊匹配查询 这个要和*号的用法区分下,*号完整通配多个字符查询,而~不是简单的通配,这个模糊匹配和Lucene的评分有关
 */
// 可以查到Licensor关键字,而queryParser.parse("icensor*")查不到
//query = queryParser.parse("icensor~");

// ~后面可加0-2的整数来制定模糊匹配度,默认不加为1
//query = queryParser.parse("Licens~1");

// ~还可以模糊匹配差异化N字符数的多个关键字
//query = queryParser.parse("Licens cens ~0");

/**
 * 范围查询,多用于数字和时间的查询
 */
// {}abc与Licenszhi间的文件,不包含
//query = queryParser.parse("{abc TO Licens}");

// {}abc与Licenszhi间的文件,包含本身
//query = queryParser.parse("[abc TO Licens]");

/**
 * 关键字加权处理查询
 */
// 默认为1,可加权可降权,可通过加权处理给匹配的结果排序
//query = queryParser.parse("Licensor Wildcard^4 ");

// 可使用()组合多个条件查询
//query = queryParser .parse("(+Licensor  +Wildcard) AND easier");
// ps: 查询部分字符需要转义处理,如(+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /)

2、使用Query继承类搜索

QueryParser queryParser = new QueryParser("context",getAnalyzer());
Query query = null;
// 搜索特定的项
//query = new TermQuery(new Term(field,value));

//TermRangeQuery 搜索特定范围的项.这个 Query 不适用于数字范围查询,数字范围查询请使用 NumericRangeQuery 代替
//query = new TermRangeQuery(field,new BytesRef(start.getBytes()),new BytesRef(end.getBytes()),true,true);

//NumericRangeQuery 搜索数字范围的项
//query = NumericRangeQuery.newIntRange(field,start,end,true,true);

//PrefixQuery 前缀匹配搜索
//query = new PrefixQuery(new Term(field,value));

//WildcardQuery 通配符搜索
//query = new WildcardQuery(new Term(field,value));

//FuzzyQuery 模糊匹配搜索.搜索的关键字即使有错,在一定范围内都可以被搜索到
//query = new FuzzyQuery(new Term(field,value),maxEdits,prefixLength);

//BooleanQuery 多个条件的查询
//BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder();
//Query query1 = new TermQuery(new Term("",""));
//Query query2 = new TermQuery(new Term("",""));
//booleanQueryBuilder.add(query1,BooleanClause.Occur.MUST);
//booleanQueryBuilder.add(query2,BooleanClause.Occur.MUST);
//query = booleanQueryBuilder.build();

//PhraseQuery 短语查询
//PhraseQuery.Builder phraseQueryBuilder = new PhraseQuery.Builder();
//phraseQueryBuilder.setSlop(1); // 两个短语间最大的单词间隔
//phraseQueryBuilder.add(new Term(field,value1));
//phraseQueryBuilder.add(new Term(field,value2));
//query = phraseQueryBuilder.build();
lucene搜索分页过程中,可以有两种方式 一种是将搜索结果集直接放到session中,但是假如结果集非常大,同时又存在大并发访问的时候,很可能造成服务器的内存不足,而使服务器宕机 还有一种是每次都重新进行搜索,这样虽然避免了内存溢出的可能,但是,每次搜索都要进行一次IO操作,如果大并发访问的时候,你要保证你的硬盘的转速足够的快,还要保证你的cpu有足够高的频率 而我们可以将这两种方式结合下,每次查询都多缓存一部分的结果集,翻页的时候看看所查询的内容是不是在已经存在在缓存当中,如果已经存在了就直接拿出来,如果不存在,就进行查询后,从缓存中读出来. 比如:现在我们有一个搜索结果集 一个有100条数据,每页显示10条,就有10页数据. 安装第一种的思路就是,我直接把这100条数据缓存起来,每次翻页时从缓存种读取 而第二种思路就是,我直接从搜索到的结果集种显示前十条给第一页显示,第二页的时候,我在查询一次,给出10-20条数据给第二页显示,我每次翻页都要重新查询 第三种思路就变成了 我第一页仅需要10条数据,但是我一次读出来50条数据,把这50条数据放入到缓存当中,当我需要10--20之间的数据的时候,我的发现我的这些数据已经在我的缓存种存在了,我就直接存缓存中把数据读出来,少了一次查询,速度自然也提高了很多. 如果我访问第六页的数据,我就把我的缓存更新一次.这样连续翻页10次才进行两次IO操作 同时又保证了内存不容易被溢出.而具体缓存设置多少,要看你的服务器的能力和访问的人数来决定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值