lucene学习(二)
前面我们已经完成了hello world的编写,其实全文检索lucene很简单的,当然主要还是里面自带的一些类我们不熟悉,但是这也没有关系,这些类的方法用起来也很简单,下面是一些教程的截图:
关于排序的一些简单方法:
1 public QueryResult search(String queryString, int firstResult, int maxResults) { 2 try { 3 // 1,把要搜索的文本解析为 Query 4 String[] fields = { "name", "content" }; 5 Map<String, Float> boosts = new HashMap<String, Float>();//(按相关度排序)某个属性的boost的值 (排序) 6 boosts.put("name", 3f); //认为标题很重要,权值大 7 // boosts.put("content", 1.0f); 默认为1.0f 8 9 QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer, boosts); 10 Query query = queryParser.parse(queryString); 11 12 return search(query, firstResult, maxResults); 13 } catch (Exception e) { 14 throw new RuntimeException(e); 15 } 16 } 17 18 public QueryResult search(Query query, int firstResult, int maxResults) { 19 IndexSearcher indexSearcher = null; 20 21 try { 22 // 2,进行查询 23 indexSearcher = new IndexSearcher(indexPath); 24 Filter filter = new RangeFilter("size", NumberTools.longToString(200) //文档document的过滤器 25 , NumberTools.longToString(1000), true, true); //过滤器的效率很低 26 27 // ========== 排序 (默认为相关度排序) 28 Sort sort = new Sort(); 29 sort.setSort(new SortField("size")); // (自定义排序)默认为升序 这个按size的大小排序 30 // sort.setSort(new SortField("size", true)); //(自定义排序)按降序排序 这个按size的大小排序 31 // ========== 32 33 TopDocs topDocs = indexSearcher.search(query, filter, 10000, sort); 34 35 int recordCount = topDocs.totalHits;
关于lucene的集中查询类:
1 /** 2 * 关键词查询TermQuery 3 * 4 * name:room 5 */ 6 @Test 7 public void testTermQuery() { 8 // Term term = new Term("name", "房间"); 9 // Term term = new Term("name", "Room"); // 英文关键词全是小写字符 10 Term term = new Term("content", "编辑");//属性中的关键字(键值对) 11 Query query = new TermQuery(term); 12 13 queryAndPrintResult(query); 14 } 15 16 /** 17 * 范围查询RangeQuery 18 * 19 * 包含边界:size:[0000000000001e TO 000000000000rs] 20 * 21 * 不包含边界:size:{0000000000001e TO 000000000000rs} 22 */ 23 @Test 24 public void testRangeQuery() { 25 Term lowerTerm = new Term("size", NumberTools.longToString(50));//下边界 26 Term upperTerm = new Term("size", NumberTools.longToString(100));//上边界 27 Query query = new RangeQuery(lowerTerm, upperTerm, false);//false表示不包含边界 28 29 queryAndPrintResult(query); 30 } 31 32 // public static void main(String[] args) { 33 // System.out.println(Long.MAX_VALUE); 34 // System.out.println(NumberTools.longToString(1000)); 35 // System.out.println(NumberTools.stringToLong("000000000000rs")); 36 // 37 // System.out.println(DateTools.dateToString(new Date(), Resolution.DAY)); 38 // System.out.println(DateTools.dateToString(new Date(), Resolution.MINUTE)); 39 // System.out.println(DateTools.dateToString(new Date(), Resolution.SECOND)); 40 // } 41 42 /** 43 * 通配符查询WildcardQuery 44 * 45 * '?' 代表一个字符, '*' 代表0个或多个字符 46 * 47 * name:房* 48 * 49 * name:*o* 50 * 51 * name:roo? 52 */ 53 @Test 54 public void testWildcardQuery() { 55 Term term = new Term("content", "luc?"); 56 // Term term = new Term("name", "ro*"); // 前缀查询 PrefixQuery 57 // Term term = new Term("name", "*o*"); 58 // Term term = new Term("name", "房*"); 59 Query query = new WildcardQuery(term); 60 61 queryAndPrintResult(query); 62 } 63 64 /** 65 * 短语查询PhraseQuery 66 * 67 * content:"? 绅士 ? ? 饭店" 68 * 69 * content:"绅士 饭店"~2 70 */ 71 @Test 72 public void testPhraseQuery() { 73 PhraseQuery phraseQuery = new PhraseQuery(); 74 // phraseQuery.add(new Term("content", "绅士"), 1); 75 // phraseQuery.add(new Term("content", "饭店"), 4); 76 77 phraseQuery.add(new Term("content", "编辑")); 78 phraseQuery.add(new Term("content", "lucene")); 79 phraseQuery.setSlop(2); 80 81 queryAndPrintResult(phraseQuery); 82 } 83 84 /** 85 * +content:"绅士 饭店"~2 -size:[000000000000dw TO 000000000000rs] 86 * 87 * +content:"绅士 饭店"~2 +size:[000000000000dw TO 000000000000rs] 88 * 89 * content:"绅士 饭店"~2 size:[000000000000dw TO 000000000000rs] 90 * 91 * +content:"绅士 饭店"~2 size:[000000000000dw TO 000000000000rs] 92 */ 93 @Test 94 public void testBooleanQuery() { 95 // 条件1 96 PhraseQuery query1 = new PhraseQuery(); 97 query1.add(new Term("content", "绅士")); 98 query1.add(new Term("content", "饭店")); 99 query1.setSlop(2); 100 101 // 条件2 102 Term lowerTerm = new Term("size", NumberTools.longToString(500)); 103 Term upperTerm = new Term("size", NumberTools.longToString(1000)); 104 Query query2 = new RangeQuery(lowerTerm, upperTerm, true); 105 106 // 组合 107 BooleanQuery boolQuery = new BooleanQuery(); 108 boolQuery.add(query1, Occur.MUST); 109 boolQuery.add(query2, Occur.SHOULD); 110 111 queryAndPrintResult(boolQuery); 112 }