精确匹配搜索 查出在某个域中,含有某个词的指定文档数,要用到的方法是TermQuery
public void searchByTerm(String field,String name,int num) { try { IndexSearcher searcher = getSearcher(); Query query = new TermQuery(new Term(field,name)); 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")); } searcher.close(); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Test public void searchByTerm() { su.searchByTerm("content","football",3); } |
范围搜索 用到的方法是 Query query = new TermRangeQuery(field,start,end,true, true); 其中第四个参数如果是为true,表示包含start,否则不包含。第五个参数的意思和第四个一样,只是指定的是end
public void searchByTermRange(String field, String start, String end, int num) { try { IndexSearcher searcher = getSearcher(); Query query = new TermRangeQuery(field, start, end, true, true); 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")); } searcher.close(); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Test public void searchByTermRange() { //查询ID从1到3的 su.searchByTermRange("id", "1", "3", 10); //查询name以a开头和s结尾的 su.searchByTermRange("name","a","s",10); //由于attachs是数字类型,使用TermRange无法查询 su.searchByTermRange("attach","2","10", 5); } |
数字范围,使用NumericRangeQuery,方法和前面的一样,只是创建Query对象不一样: Query query = NumericRangeQuery .newIntRange(field,start, end,true,true); 测试示例: public voidsearchByNumRange() { su.searchByNumricRange("attach",2,10,5); } 前缀搜索 方法和前面的一样,只是创建Query对象不一样: Query query = new PrefixQuery(new Term(field,value)); 测试方法 @Test public voidsearchByPrefix() { su.searchByPrefix("content","s",10); } 通配符搜索 在传入的value中可以使用通配符:?和*,?表示匹配一个字符,*表示匹配任意多个字符 Query query = new WildcardQuery(new Term(field,value)); 多条件搜索 BooleanQuery可以连接多个子查询 Occur.MUST表示必须出现 Occur.SHOULD表示可以出现 Occur.MUSE_NOT表示不能出现 |