查询使用
public class TestApp { public static void main(String[] args) { // 关键词查询 /*TermQuery query = new TermQuery(new Term("sex", "man")); searchAndShowResult(query);*/ // 对应的查询字符串为:sex:m?n /* WildcardQuery query = new WildcardQuery(new Term("sex", "m?n")); searchAndShowResult(query);*/ // 查询所有 对应的查询字符串为:*:* /* MatchAllDocsQuery query = new MatchAllDocsQuery(); searchAndShowResult(query);*/ // 对应的查询字符串为:sex:maX~0.9 // 第二个参数是最小相似度,表示有多少正确的就显示出来,比如0.9表示有90%正确的字符就会显示出来。 /* FuzzyQuery query = new FuzzyQuery(new Term("sex", "maX")); searchAndShowResult(query);*/ // 范围查询 // 对应的查询字符串为:id:[5 TO 15] // NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, true, true); // 对应的查询字符串为:id:{5 TO 15} // NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, false, false); // 对应的查询字符串为:id:[5 TO 15} /* NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, false, false); searchAndShowResult(query);*/ BooleanQuery booleanQuery = new BooleanQuery(); // booleanQuery.add(query, Occur.MUST); // 必须满足 // booleanQuery.add(query, Occur.SHOULD); // 多个SHOULD一起用表示OR的关系 // booleanQuery.add(query, Occur.MUST_NOT); // 非 Query query1 = new TermQuery(new Term("sex", "man")); Query query2 = NumericRangeQuery.newIntRange("id", 5, 15, true, false); // Query query2 = new TermQuery(new Term("id", "15")); // // 对应的查询字符串为:+title:lucene +id:{5 TO 15] // // 对应的查询字符串为(大写的AND):title:lucene AND id:{5 TO 15] // booleanQuery.add(query1, Occur.MUST); // booleanQuery.add(query2, Occur.MUST); // 对应的查询字符串为:title:lucene id:{5 TO 15] // 对应的查询字符串为:title:lucene OR id:{5 TO 15] // booleanQuery.add(query1, Occur.SHOULD); // booleanQuery.add(query2, Occur.SHOULD); // 对应的查询字符串为:+title:lucene -id:{5 TO 15] // 对应的查询字符串为:title:lucene (NOT id:{5 TO 15] ) booleanQuery.add(query1, Occur.MUST); booleanQuery.add(query2, Occur.MUST_NOT); searchAndShowResult(booleanQuery); } /** * 测试搜索的工具方法 * * @param query */ private static void searchAndShowResult(Query query) { try { // // 准备查询条件 // String queryString = "content:lucene"; // // 1,把查询字符串转为Query对象(从title和content中查询) // QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new String[] { "title", "content" }, LuceneUtils.getAnalyzer()); // Query query = queryParser.parse(queryString); System.out.println("---> // 对应的查询字符串为:" + query + "\n"); Directory directory = new RAMDirectory(); Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_47); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47, luceneAnalyzer); IndexWriter indexWriter = new IndexWriter(directory, config); IndexWriterDemo.buildDocs(indexWriter); IndexReader reader = IndexReader. IndexSearcher indexSearcher = new IndexSearcher(reader); // 2,执行查询,得到中间结果 TopDocs topDocs = indexSearcher.search(query, 100); // 最多返回前n条结果 // 3,处理结果 List<User> list = new ArrayList<User>(); for (int i = 0; i < topDocs.scoreDocs.length; i++) { // 根据编号拿到Document数据 int docId = topDocs.scoreDocs[i].doc; // Document的内部编号 Document document = indexSearcher.doc(docId); // 把Document转为Article String string = "ID:"+document.get("id")+",姓名:"+document.get("name")+",性别:"+document.get("sex"); System.out.println("人员信息:"+string); } // indexSearcher.close(); } catch (Exception e) { throw new RuntimeException(e); } } } 代码实例
1、创建一个用户类,用于实例化用户数据。 public class User { private Long id; private String name; private int age; private String sex; private Date birthday; public User(Long id, String name, int age, String sex, Date birthday) { super(); this.id = id; this.name = name; this.age = age; this.sex = sex; this.birthday = birthday; } //get/set方法,这里省略 } 2、生成即将检索的资源数据。 public class DataUtil { /** * 检索资源数据的准备; * 这里的数据可以来源数据库、文件系统等 * @return */ public static List<User> getUsers(){ List<User> list =new ArrayList<User>(); User user =new User(1L,"张三1",20,"man",new Date()); list.add(user); user =new User(2L,"张三2",20,"man",new Date()); list.add(user); user =new User(3L,"张三3",20,"woman",new Date()); list.add(user); user =new User(4L,"张三4",20,"man",new Date()); list.add(user); user =new User(5L,"张三5",20,"man",new Date()); list.add(user); user =new User(6L,"张三6",20,"woman",new Date()); list.add(user); return list; } } 3、Lucene创建索引库及查询。 public class IndexWriterDemo { /** * 将即将检索的资源写入索引库 * @param writer * @throws Exception */ public void buildDocs(IndexWriter writer)throws Exception { writer.deleteAll();//清空索引库里已存在的文档(document) List<User> list = DataUtil.getUsers();//得到数据资源 System.out.println("buildDocs()->总人数为 :"+list.size()); for(User user :list){ Document doc = new Document();//创建索引库的文档 doc.add(new Field("id",String.valueOf(user.getId()),Store.YES,Index.NO)); doc.add(new Field("name",user.getName(),Store.YES,Index.ANALYZED)); doc.add(new Field("age",String.valueOf(user.getAge()),Store.YES,Index.ANALYZED)); doc.add(new Field("sex",user.getSex(),Store.YES,Index.ANALYZED)); doc.add(new Field("birthday",String.valueOf(user.getBirthday()),Store.YES,Index.ANALYZED)); writer.addDocument(doc);//将文档写入索引库 } int count =writer.numDocs(); writer.forceMerge(100);//合并索引库文件 writer.close(); System.out.println("buildDocs()->存入索引库的数量:"+count); } /** * 从索引库中搜索你要查询的数据 * @param searcher * @throws IOException */ public void searcherDocs(IndexSearcher searcher) throws IOException{ Term term =new Term("sex", "man");//查询条件,意思是我要查找性别为“man”的人 TermQuery query =new TermQuery(term); TopDocs docs =searcher.search(query, 100);//查找 System.out.println("searcherDoc()->男生人数:"+docs.totalHits); for(ScoreDoc doc:docs.scoreDocs){//获取查找的文档的属性数据 int docID=doc.doc; Document document =searcher.doc(docID); String str="ID:"+document.get("id")+",姓名:"+document.get("name")+",性别:"+document.get("sex"); System.out.println("人员信息:"+str); } } } 4、Lucene在内存里创建索引库及查询。 public class TestIndexWriterRAMDirectory { public static void main(String[] args) throws Exception { Directory directory = new RAMDirectory(); Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_47); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47,luceneAnalyzer); IndexWriter indexWriter = new IndexWriter(directory, config); IndexWriterDemo.buildDocs(indexWriter); IndexReader reader = IndexReader. IndexSearcher searcher = new IndexSearcher(reader); IndexWriterDemo.searcherDocs(searcher); } } |
|
来自: Lib4Kevin > 《Lucene快速入门》