分享

Lucene查询使用(五)

 Lib4Kevin 2015-06-11

查询使用

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对象(从titlecontent中查询)

            // 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.open(directory);

        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;

         }

}

 

3Lucene创建索引库及查询。

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);

                   }

         }

  }

 

4Lucene在内存里创建索引库及查询。

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.open(directory);

             IndexSearcher searcher = new IndexSearcher(reader);

             IndexWriterDemo.searcherDocs(searcher);

         }

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多