Lucene——QueryParse搜索

来源:互联网 发布:互联网新闻数据分析 编辑:程序博客网 时间:2024/05/29 08:38

在主类中增加下面这样的代码

public void searchByQueryParse(Query query,int num) {try {IndexSearcher searcher = getSearcher();TopDocs tds = searcher.search(query, num);System.out.println("一共查询了:"+tds.totalHits);for(ScoreDoc sd:tds.scoreDocs) {Document doc = searcher.doc(sd.doc);System.out.println(doc.get("id")+"---->"+doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+doc.get("attach")+","+doc.get("date")+"============="+sd.score);}searcher.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}


测试类中用这样这代码搜索

@Testpublic void searchByQueryParse() throws ParseException {//1、创建QueryParser对象,默认搜索域为contentQueryParser parser = new QueryParser(Version.LUCENE_35, "content", new StandardAnalyzer(Version.LUCENE_35));//<1>精确查找搜索content中包含有like的Query query = parser.parse("like");//有basketball或者football的,空格默认就是OR//query = parser.parse("book football");query = parser.parse("soccer AND game");//query = parser.parse("soccer  game");//改变默认空格代表OR//改变空格的默认操作符,以下可以改成AND//parser.setDefaultOperator(Operator.AND);//改变搜索域为name为jack//query = parser.parse("name:jack");//<2>通配符查找可以实现前缀查找//同样可以使用*和?来进行通配符匹配//query = parser.parse("name:j*");//通配符默认不能放在首位//query = parser.parse("email:*qq.com");//开启第一个字符的通配符匹配,默认关闭因为效率不高//parser.setAllowLeadingWildcard(true);//<3>Boolean查询//匹配name中没有zhangsan但是content中必须有soccer的,+和-要放置到域说明前面//query = parser.parse("- name:zhangsan + soccer");//<4>范围查找//匹配一个区间,注意:TO必须是大写//query = parser.parse("id:[1 TO 6]");//闭区间匹配只会匹配到2//query = parser.parse("id:{1 TO 3}");//I like是连起来的//query = parser.parse("\"I like\"");//完全匹配I Like Football的//query = parser.parse("\"I like football\"");//<5>短语查询//I like football//i和football中间是一个空//query = parser.parse("\"I football\"~1");//<6>模糊查询//query = parser.parse("name:make~");//没有办法匹配数字范围(自己扩展Parser)//query = parser.parse("attach:[2 TO 10]");su.searchByQueryParse(query,10);}