lucene中搜索

  1. import java.io.File; 
  2. import java.io.IOException; 
  3. import java.text.ParseException; 
  4. import java.text.SimpleDateFormat; 
  5. import java.util.Date; 
  6.  
  7. import org.apache.lucene.analysis.standard.StandardAnalyzer; 
  8. import org.apache.lucene.document.Document; 
  9. import org.apache.lucene.document.Field; 
  10. import org.apache.lucene.document.NumericField; 
  11. import org.apache.lucene.index.CorruptIndexException; 
  12. import org.apache.lucene.index.IndexReader; 
  13. import org.apache.lucene.index.IndexWriter; 
  14. import org.apache.lucene.index.IndexWriterConfig; 
  15. import org.apache.lucene.index.Term; 
  16. import org.apache.lucene.search.BooleanQuery; 
  17. import org.apache.lucene.search.FuzzyQuery; 
  18. import org.apache.lucene.search.IndexSearcher; 
  19. import org.apache.lucene.search.NumericRangeQuery; 
  20. import org.apache.lucene.search.PhraseQuery; 
  21. import org.apache.lucene.search.PrefixQuery; 
  22. import org.apache.lucene.search.Query; 
  23. import org.apache.lucene.search.ScoreDoc; 
  24. import org.apache.lucene.search.TermQuery; 
  25. import org.apache.lucene.search.TermRangeQuery; 
  26. import org.apache.lucene.search.TopDocs; 
  27. import org.apache.lucene.search.WildcardQuery; 
  28. import org.apache.lucene.search.BooleanClause.Occur; 
  29. import org.apache.lucene.store.Directory; 
  30. import org.apache.lucene.store.FSDirectory; 
  31. import org.apache.lucene.store.LockObtainFailedException; 
  32. import org.apache.lucene.util.Version; 
  33.  
  34.  
  35. public class SearchUtil { 
  36.     private String[] ids = {"1","2","3","4","5","6"}; 
  37.     private String[] emails = {"[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]"}; 
  38.     private String[] content ={ 
  39.             "Welcome to Kenan my home", 
  40.             "Hello Kenan ", 
  41.             "Good morning", 
  42.             "Are you OK?", 
  43.             "Yeah hahahahahahaha Kenan", 
  44.             "I like foot ball" 
  45.     }; 
  46.     private int[] attachs = {1,4,6,2,3,8}; 
  47.     private Date[] dates = null
  48.     private String[] names = {"5555","333","44","111","222","666"}; 
  49.     //詞典  
  50.     private Directory directory = null
  51.     //寫入筆 
  52.     private IndexWriter writer = null
  53.     //文檔對象 
  54.     private Document doc = null
  55.     //讀取對象 
  56.     private IndexReader reader = null
  57.     private IndexSearcher searcher = null
  58.     private void datesInit() { 
  59.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
  60.         dates = new Date[6]; 
  61.         try { 
  62.             dates[0] = sdf.parse("2010-12-01"); 
  63.             dates[1] = sdf.parse("2011-12-01"); 
  64.             dates[2] = sdf.parse("2001-12-01"); 
  65.             dates[3] = sdf.parse("2013-12-01"); 
  66.             dates[4] = sdf.parse("2003-12-01"); 
  67.             dates[5] = sdf.parse("2014-12-01"); 
  68.         } catch (ParseException e) { 
  69.             // TODO Auto-generated catch block 
  70.             e.printStackTrace(); 
  71.         } 
  72.     } 
  73.     public SearchUtil(){ 
  74.         datesInit(); 
  75.         try { 
  76.             directory = FSDirectory.open(new File("d:/lucene/index01")); 
  77.              
  78.             this.getSearcher(); 
  79.         } catch (IOException e) { 
  80.             // TODO Auto-generated catch block 
  81.             e.printStackTrace(); 
  82.         } 
  83.     } 
  84.     /** 
  85.      * 構建索引 
  86.      */ 
  87.     public void buildIndex(){ 
  88.         try { 
  89.             writer = new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35))); 
  90.             for(int i=0;i<6;i++){ 
  91.                 doc = new Document(); 
  92.                 doc.add(new Field ("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)); 
  93.                 doc.add(new Field("email",emails[i],Field.Store.YES,Field.Index.NOT_ANALYZED)); 
  94.                 doc.add(new Field("content",this.content[i],Field.Store.NO,Field.Index.ANALYZED)); 
  95.                 doc.add(new Field("name",this.names[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)); 
  96.                 //給數字加索引 
  97.                 doc.add(new NumericField("attach", Field.Store.YES,true).setIntValue(attachs[i])); 
  98.                 //給日期加索引 
  99.                 doc.add(new NumericField("date",Field.Store.YES,true).setLongValue(dates[i].getTime())); 
  100.                 writer.addDocument(doc); 
  101.             } 
  102.         } catch (CorruptIndexException e) { 
  103.             // TODO Auto-generated catch block 
  104.             e.printStackTrace(); 
  105.         } catch (LockObtainFailedException e) { 
  106.             // TODO Auto-generated catch block 
  107.             e.printStackTrace(); 
  108.         } catch (IOException e) { 
  109.             // TODO Auto-generated catch block 
  110.             e.printStackTrace(); 
  111.         }finally{ 
  112.             if(writer != null){ 
  113.                 try { 
  114.                     writer.close(); 
  115.                 } catch (CorruptIndexException e) { 
  116.                     // TODO Auto-generated catch block 
  117.                     e.printStackTrace(); 
  118.                 } catch (IOException e) { 
  119.                     // TODO Auto-generated catch block 
  120.                     e.printStackTrace(); 
  121.                 } 
  122.             } 
  123.         } 
  124.     } 
  125.     public IndexSearcher getSearcher(){ 
  126.         try { 
  127.             if(reader == null){ 
  128.                 reader = IndexReader.open(directory); 
  129.             }else{ 
  130.                 IndexReader ir = IndexReader.openIfChanged(reader); 
  131.                 if(ir!=null){ 
  132.                     reader.close(); 
  133.                     reader = ir
  134.                 } 
  135.             } 
  136.             searcher = new IndexSearcher(reader); 
  137.             return searcher; 
  138.         } catch (CorruptIndexException e) { 
  139.             // TODO Auto-generated catch block 
  140.             e.printStackTrace(); 
  141.         } catch (IOException e) { 
  142.             // TODO Auto-generated catch block 
  143.             e.printStackTrace(); 
  144.         } 
  145.         return null; 
  146.     } 
  147.     public void termQuery(String field,String name,int num){ 
  148.         Query query = new TermQuery(new Term(field, name)); 
  149.         try { 
  150.             TopDocs tds = this.searcher.search(query, num); 
  151.             System.out.println("查詢到的結果數:"+tds.totalHits); 
  152.             for(ScoreDoc sd : tds.scoreDocs){ 
  153.                 doc = this.searcher.doc(sd.doc); 
  154.                 System.out.println("id:"+doc.get("id")+"---"+"name:"+doc.get("name")+"---"+"attachs:"+doc.get("attach")+"---"+"email:"+doc.get("email")); 
  155.             } 
  156.         } catch (IOException e) { 
  157.             // TODO Auto-generated catch block 
  158.             e.printStackTrace(); 
  159.         } finally { 
  160.             try { 
  161.                 this.searcher.close(); 
  162.             } catch (IOException e) { 
  163.                 // TODO Auto-generated catch block 
  164.                 e.printStackTrace(); 
  165.             } 
  166.         } 
  167.     } 
  168.     /** 
  169.      *  
  170.      * @param field 要查詢的域 
  171.      * @param lowerTerm  開始的字符 
  172.      * @param upperTerm 結束的字符 
  173.      * @param num 查詢的top個數 
  174.      * @param includeLower 是否包含開始的邊界 
  175.      * @param includeUpper 是否包含結束的邊界 
  176.      */ 
  177.     public void termRangeQuery(String field,String lowerTerm,String upperTerm,int num,boolean includeLower, boolean includeUpper){ 
  178.          
  179.         Query query = new TermRangeQuery(field, lowerTerm, upperTerm, includeLower,includeUpper); 
  180.         try { 
  181.             TopDocs tds = this.searcher.search(query, num); 
  182.             System.out.println("查詢到的結果數:"+tds.totalHits); 
  183.             for(ScoreDoc sd : tds.scoreDocs){ 
  184.                 doc = this.searcher.doc(sd.doc); 
  185.                 System.out.println("id:"+doc.get("id")+"---"+"name:"+doc.get("name")+"---"+"attachs:"+doc.get("attach")+"---"+"email:"+doc.get("email")); 
  186.             } 
  187.         } catch (IOException e) { 
  188.             // TODO Auto-generated catch block 
  189.             e.printStackTrace(); 
  190.         } finally { 
  191.             try { 
  192.                 this.searcher.close(); 
  193.             } catch (IOException e) { 
  194.                 // TODO Auto-generated catch block 
  195.                 e.printStackTrace(); 
  196.             } 
  197.         } 
  198.     } 
  199.     public void queryByNumericRange(String field,int min,int max,int num, boolean minInclusive, boolean maxInclusive){ 
  200.         Query query = NumericRangeQuery.newIntRange(field, min, max, minInclusive, maxInclusive); 
  201.         try { 
  202.             TopDocs tds = this.searcher.search(query, num); 
  203.             System.out.println("查詢到的結果數:"+tds.totalHits); 
  204.             for(ScoreDoc sd : tds.scoreDocs){ 
  205.                 doc = this.searcher.doc(sd.doc); 
  206.                 System.out.println("id:"+doc.get("id")+"---"+"name:"+doc.get("name")+"---"+"attachs:"+doc.get("attach")+"---"+"email:"+doc.get("email")); 
  207.             } 
  208.         } catch (IOException e) { 
  209.             // TODO Auto-generated catch block 
  210.             e.printStackTrace(); 
  211.         } finally { 
  212.             try { 
  213.                 this.searcher.close(); 
  214.             } catch (IOException e) { 
  215.                 // TODO Auto-generated catch block 
  216.                 e.printStackTrace(); 
  217.             } 
  218.         } 
  219.     } 
  220.     /** 
  221.      * 前綴搜索 
  222.      * @param field 
  223.      * @param value 
  224.      * @param num 
  225.      */ 
  226.     public void prefixQuery(String field,String value,int num){ 
  227.         Query query = new PrefixQuery(new Term(field,value)); 
  228.         try { 
  229.             TopDocs tds = this.searcher.search(query, num); 
  230.             System.out.println("查詢到的結果數:"+tds.totalHits); 
  231.             for(ScoreDoc sd : tds.scoreDocs){ 
  232.                 doc = this.searcher.doc(sd.doc); 
  233.                 System.out.println("id:"+doc.get("id")+"---"+"name:"+doc.get("name")+"---"+"attachs:"+doc.get("attach")+"---"+"email:"+doc.get("email")); 
  234.             } 
  235.         } catch (IOException e) { 
  236.             // TODO Auto-generated catch block 
  237.             e.printStackTrace(); 
  238.         } finally { 
  239.             try { 
  240.                 this.searcher.close(); 
  241.             } catch (IOException e) { 
  242.                 // TODO Auto-generated catch block 
  243.                 e.printStackTrace(); 
  244.             } 
  245.         } 
  246.     } 
  247.     /** 
  248.      * 通配符搜索 
  249.      * @param field 
  250.      * @param value  ?代表一個字符 *代表任意多個字符 
  251.      * @param num 
  252.      */ 
  253.     public void wildcardQuery(String field,String value,int num){ 
  254.         Query query = new WildcardQuery(new Term(field,value)); 
  255.         try { 
  256.             TopDocs tds = this.searcher.search(query, num); 
  257.             System.out.println("查詢到的結果數:"+tds.totalHits); 
  258.             for(ScoreDoc sd : tds.scoreDocs){ 
  259.                 doc = this.searcher.doc(sd.doc); 
  260.                 System.out.println("id:"+doc.get("id")+"---"+"name:"+doc.get("name")+"---"+"attachs:"+doc.get("attach")+"---"+"email:"+doc.get("email")); 
  261.             } 
  262.         } catch (IOException e) { 
  263.             // TODO Auto-generated catch block 
  264.             e.printStackTrace(); 
  265.         } finally { 
  266.             try { 
  267.                 this.searcher.close(); 
  268.             } catch (IOException e) { 
  269.                 // TODO Auto-generated catch block 
  270.                 e.printStackTrace(); 
  271.             } 
  272.         } 
  273.     } 
  274.     /** 
  275.      * 用於鏈接多個字查詢 
  276.      * Occur.MUST 必須有這個條件 
  277.      * Occur.SHOULD 可以沒有這個條件 
  278.      * Occur.MUST_NOT 必須沒有這個條件 
  279.      * @param num 
  280.      */ 
  281.     public void booleanQuery(int num){ 
  282.         BooleanQuery query = new BooleanQuery(); 
  283.         query.add(new WildcardQuery(new Term("name","6*")), Occur.MUST); 
  284.         query.add(new TermQuery(new Term("content","like")),Occur.MUST); 
  285.         try { 
  286.             TopDocs tds = this.searcher.search(query, num); 
  287.             System.out.println("查詢到的結果數:"+tds.totalHits); 
  288.             for(ScoreDoc sd : tds.scoreDocs){ 
  289.                 doc = this.searcher.doc(sd.doc); 
  290.                 System.out.println("id:"+doc.get("id")+"---"+"name:"+doc.get("name")+"---"+"attachs:"+doc.get("attach")+"---"+"email:"+doc.get("email")); 
  291.             } 
  292.         } catch (IOException e) { 
  293.             // TODO Auto-generated catch block 
  294.             e.printStackTrace(); 
  295.         } finally { 
  296.             try { 
  297.                 this.searcher.close(); 
  298.             } catch (IOException e) { 
  299.                 // TODO Auto-generated catch block 
  300.                 e.printStackTrace(); 
  301.             } 
  302.         } 
  303.     } 
  304.     /** 
  305.      * 短語查詢 slop、表示兩個單詞之間的最大間隔 
  306.      * @param num 
  307.      */ 
  308.     public void phraseQuery(int num){ 
  309.         PhraseQuery query = new PhraseQuery(); 
  310.         query.setSlop(2); 
  311.         query.add(new Term("content","i")); 
  312.         query.add(new Term("content","like")); 
  313.         try { 
  314.             TopDocs tds = this.searcher.search(query, num); 
  315.             System.out.println("查詢到的結果數:"+tds.totalHits); 
  316.             for(ScoreDoc sd : tds.scoreDocs){ 
  317.                 doc = this.searcher.doc(sd.doc); 
  318.                 System.out.println("id:"+doc.get("id")+"---"+"name:"+doc.get("name")+"---"+"attachs:"+doc.get("attach")+"---"+"email:"+doc.get("email")); 
  319.             } 
  320.         } catch (IOException e) { 
  321.             // TODO Auto-generated catch block 
  322.             e.printStackTrace(); 
  323.         } finally { 
  324.             try { 
  325.                 this.searcher.close(); 
  326.             } catch (IOException e) { 
  327.                 // TODO Auto-generated catch block 
  328.                 e.printStackTrace(); 
  329.             } 
  330.         } 
  331.     } 
  332.     /** 
  333.      * 模糊查詢 
  334.      * @param num 
  335.      */ 
  336.     public void fuzzyQuery(int num){ 
  337.         Query query = new FuzzyQuery(new Term("name","555")); 
  338.         try { 
  339.             TopDocs tds = this.searcher.search(query, num); 
  340.             System.out.println("查詢到的結果數:"+tds.totalHits); 
  341.             for(ScoreDoc sd : tds.scoreDocs){ 
  342.                 doc = this.searcher.doc(sd.doc); 
  343.                 System.out.println("id:"+doc.get("id")+"---"+"name:"+doc.get("name")+"---"+"attachs:"+doc.get("attach")+"---"+"email:"+doc.get("email")); 
  344.             } 
  345.         } catch (IOException e) { 
  346.             // TODO Auto-generated catch block 
  347.             e.printStackTrace(); 
  348.         } finally { 
  349.             try { 
  350.                 this.searcher.close(); 
  351.             } catch (IOException e) { 
  352.                 // TODO Auto-generated catch block 
  353.                 e.printStackTrace(); 
  354.             } 
  355.         } 
  356.     } 
  357.  
  358. import org.junit.BeforeClass; 
  359. import org.junit.Test; 
  360.  
  361.  
  362. public class TestSearchUtil { 
  363.      
  364.     static SearchUtil su ; 
  365.     @BeforeClass 
  366.     public static void setUpBeforeClass() throws Exception { 
  367.         su = new SearchUtil(); 
  368.     } 
  369.     @Test 
  370.     public void testBuildIndex(){ 
  371.         su.buildIndex(); 
  372.     } 
  373.  
  374.     @Test 
  375.     public void testTermQuery() { 
  376.         su.termQuery("content", "hello", 5); 
  377.     } 
  378.     @Test 
  379.     public void testTermRangeQuery(){ 
  380.         su.termRangeQuery("name", "2", "4", 5, false, false); 
  381.     } 
  382.     @Test 
  383.     public void testQueryByNumericRange(){ 
  384.         su.queryByNumericRange("id", 3, 4, 10, false, true); 
  385.     } 
  386.      
  387.     @Test 
  388.     public void testPrefixQuery(){ 
  389.         su.prefixQuery("name", "5", 3); 
  390.     } 
  391.      
  392.     @Test 
  393.     public void testWildcardQuery(){ 
  394.         su.wildcardQuery("name", "5555*", 6); 
  395.     } 
  396.      
  397.     @Test 
  398.     public void testBooleanQuery(){ 
  399.         su.booleanQuery(5); 
  400.     } 
  401.      
  402.     @Test 
  403.     public void testPhraseQuery(){ 
  404.         su.phraseQuery(5); 
  405.     } 
  406.      
  407.     @Test 
  408.     public void testFuzzyQuery(){ 
  409.         su.fuzzyQuery(4); 
  410.     } 

 

本文出自 “Kenan_ITBlog” 博客,請務必保留此出處http://soukenan.blog.51cto.com/5130995/1122105

發佈了115 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章