Lucene 搜索二

Lucene分頁搜索的實現:

[java] view plaincopy
  1. package com.qianyan.lucene;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.lucene.document.Document;  
  6. import org.apache.lucene.index.Term;  
  7. import org.apache.lucene.search.IndexSearcher;  
  8. import org.apache.lucene.search.ScoreDoc;  
  9. import org.apache.lucene.search.TermQuery;  
  10. import org.apache.lucene.search.TopDocs;  
  11. import org.apache.lucene.store.Directory;  
  12. import org.apache.lucene.store.FSDirectory;  
  13.   
  14. public class TestSeacher3 {  
  15.   
  16.     public static void main(String[] args) throws IOException {  
  17.         String indexDir = "E:/luceneindex";  
  18.         Directory dir = FSDirectory.getDirectory(indexDir);  
  19.         IndexSearcher searcher = new IndexSearcher(dir);  
  20.         ScoreDoc[] hits = null;  
  21.           
  22.         Term term = new Term("contents""ontology");  
  23.         TermQuery query = new TermQuery(term);  
  24.         TopDocs topDocs = searcher.search(query, 126);  
  25.         int eachPageNumber = 10;    //每頁顯示記錄數  
  26.         int pageNumber = 3;         //當前頁  
  27.         hits = topDocs.scoreDocs;  
  28.           
  29.         for(int i = (pageNumber - 1) * eachPageNumber; i < pageNumber * eachPageNumber; i++){  
  30.             Document doc = searcher.doc(hits[i].doc);  
  31.             System.out.print(hits[i].score);  
  32.             System.out.println(doc.get("contents"));  
  33.         }  
  34.           
  35.         searcher.close();  
  36.         dir.close();  
  37.     }  
  38. }  

搜索中使用RamDirectory:

[java] view plaincopy
  1. package com.qianyan.lucene;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.lucene.analysis.Analyzer;  
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  7. import org.apache.lucene.document.Document;  
  8. import org.apache.lucene.document.Field;  
  9. import org.apache.lucene.index.IndexWriter;  
  10. import org.apache.lucene.index.Term;  
  11. import org.apache.lucene.search.IndexSearcher;  
  12. import org.apache.lucene.search.ScoreDoc;  
  13. import org.apache.lucene.search.TermQuery;  
  14. import org.apache.lucene.search.TopDocs;  
  15. import org.apache.lucene.store.Directory;  
  16. import org.apache.lucene.store.RAMDirectory;  
  17.   
  18. public class TestRamSearch {  
  19.   
  20.     Directory directory = new RAMDirectory();  
  21.       
  22.     public void createRamIndex() throws IOException{  
  23.         String[] ids = {"1""2""3""4"};  
  24.         String[] names = {"zhangsan""lisi""wangwu""zhaoliu"};  
  25.         String[] addresses = {"shanghai""beijing""guangzhou""nanjing"};  
  26.         String[] birthdays = {"19820720""19840203""19770409""19830130"};  
  27.         Analyzer analyzer = new StandardAnalyzer();  
  28.         IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);  
  29.         for(int i = 0; i < ids.length; i++){  
  30.             Document document = new Document();  
  31.             document.add(new Field("id", ids[i], Field.Store.YES, Field.Index.ANALYZED));  
  32.             document.add(new Field("name", names[i], Field.Store.YES, Field.Index.ANALYZED));  
  33.             document.add(new Field("address", addresses[i], Field.Store.YES, Field.Index.ANALYZED));  
  34.             document.add(new Field("birthday", birthdays[i], Field.Store.YES, Field.Index.ANALYZED));  
  35.             writer.addDocument(document);  
  36.         }  
  37.         writer.optimize();  
  38.         writer.close();  
  39.     }  
  40.       
  41.     public void searchRam() throws IOException{  
  42.         IndexSearcher searcher = new IndexSearcher(directory);  
  43.         ScoreDoc[] hits = null;  
  44.           
  45.         Term term = new Term("name""zhangsan");  
  46.         TermQuery query = new TermQuery(term);  
  47.         TopDocs topDocs = searcher.search(query, 126);  
  48.       
  49.         hits = topDocs.scoreDocs;  
  50.           
  51.         for(int i = 0; i < hits.length; i++){  
  52.             Document doc = searcher.doc(hits[i].doc);  
  53.             //System.out.println(hits[i].score);  
  54.             System.out.print(doc.get("id") + " ");  
  55.             System.out.print(doc.get("name") + " ");  
  56.             System.out.print(doc.get("address") + " ");  
  57.             System.out.println(doc.get("birthday") + " ");  
  58.         }  
  59.           
  60.         searcher.close();  
  61.         directory.close();  
  62.     }  
  63.       
  64.     public static void main(String[] args) throws IOException {  
  65.         TestRamSearch trs = new TestRamSearch();  
  66.         trs.createRamIndex();  
  67.         trs.searchRam();  
  68.     }  
  69. }  

QueryParser的使用:

1、默認字段的檢索

2、在指定字段中檢索

3、在默認字段進行“或”檢索

4、對默認字段進行“與”檢索

5、AND NOT 的檢索

6、默認字段中前綴檢索

7、對短語進行檢索

[java] view plaincopy
  1. package com.qianyan.lucene;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.lucene.analysis.Analyzer;  
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  7. import org.apache.lucene.document.Document;  
  8. import org.apache.lucene.queryParser.ParseException;  
  9. import org.apache.lucene.queryParser.QueryParser;  
  10. import org.apache.lucene.search.IndexSearcher;  
  11. import org.apache.lucene.search.Query;  
  12. import org.apache.lucene.search.ScoreDoc;  
  13. import org.apache.lucene.search.TopDocCollector;  
  14. import org.apache.lucene.store.Directory;  
  15. import org.apache.lucene.store.FSDirectory;  
  16.   
  17. public class TestQueryParser {  
  18.   
  19.     public static void main(String[] args) throws IOException, ParseException {  
  20.         Analyzer analyzer = new StandardAnalyzer();  
  21.         String indexDir = "E:/luceneindex";  
  22.         Directory dir = FSDirectory.getDirectory(indexDir);  
  23.         IndexSearcher searcher = new IndexSearcher(dir);  
  24.         ScoreDoc[] hits = null;  
  25.           
  26.         QueryParser parser = new QueryParser("address", analyzer);      //name爲默認字段檢索  
  27.         //Query query = parser.parse("address:resides in");         //支持短語搜索  
  28.         //Query query = parser.parse("birthday:[19820720 TO 19840203]"); //中括號包含首尾,花括號不包含。TO指範圍  
  29.         //Query query = parser.parse("zhangsan~");  //前綴檢索  
  30.         //Query query = parser.parse("shanghai beijing");   //"或"形式有三種:1、空格:shanghai beijing 3、or關鍵字:shanghai or beijing  
  31.         //Query query = parser.parse("shanghai and beijing");   //"與"形式有三種:1、+號:shanghai beijing 2、and關鍵字:shanghai and beijing  
  32.         //Query query = parser.parse("address:shanghai beijing AND NOT name:wangwu");   //AND NOT 不滿足 ; "-"號也等於 AND NOT  
  33.         Query query = parser.parse("name:li*"); //前綴檢索  
  34.         TopDocCollector topdoc = new TopDocCollector(100);  
  35.           
  36.         searcher.search(query, topdoc);  
  37.         hits = topdoc.topDocs().scoreDocs;  
  38.           
  39.         for(int i = 0; i < hits.length; i++){  
  40.             Document doc = searcher.doc(hits[i].doc);  
  41.             //System.out.println(hits[i].score);  
  42.             System.out.print(doc.get("id") + " ");  
  43.             System.out.print(doc.get("name") + " ");  
  44.             System.out.print(doc.get("address") + " ");  
  45.             System.out.println(doc.get("birthday") + " ");  
  46.         }  
  47.           
  48.         searcher.close();  
  49.         dir.close();  
  50.     }  
  51. }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章