• lucene3.5的查询语法


    1、工程结构

    2、查询语法代码

    [java] view plaincopy
     
    1. package org.itat.index;<font></font>  
    2. <font></font>  
    3. import java.io.File;<font></font>  
    4. import java.io.IOException;<font></font>  
    5. import java.io.StringReader;<font></font>  
    6. import java.text.ParseException;<font></font>  
    7. import java.text.SimpleDateFormat;<font></font>  
    8. import java.util.Date;<font></font>  
    9. import java.util.HashMap;<font></font>  
    10. import java.util.Map;<font></font>  
    11. import org.apache.lucene.analysis.Analyzer;<font></font>  
    12. import org.apache.lucene.analysis.TokenStream;<font></font>  
    13. import org.apache.lucene.analysis.standard.StandardAnalyzer;<font></font>  
    14. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;<font></font>  
    15. import org.apache.lucene.document.Document;<font></font>  
    16. import org.apache.lucene.document.Field;<font></font>  
    17. import org.apache.lucene.document.NumericField;<font></font>  
    18. import org.apache.lucene.index.CorruptIndexException;<font></font>  
    19. import org.apache.lucene.index.IndexReader;<font></font>  
    20. import org.apache.lucene.index.IndexWriter;<font></font>  
    21. import org.apache.lucene.index.IndexWriterConfig;<font></font>  
    22. import org.apache.lucene.index.Term;<font></font>  
    23. import org.apache.lucene.queryParser.QueryParser;<font></font>  
    24. import org.apache.lucene.search.BooleanClause.Occur;<font></font>  
    25. import org.apache.lucene.search.BooleanQuery;<font></font>  
    26. import org.apache.lucene.search.FuzzyQuery;<font></font>  
    27. import org.apache.lucene.search.IndexSearcher;<font></font>  
    28. import org.apache.lucene.search.NumericRangeQuery;<font></font>  
    29. import org.apache.lucene.search.PhraseQuery;<font></font>  
    30. import org.apache.lucene.search.PrefixQuery;<font></font>  
    31. import org.apache.lucene.search.Query;<font></font>  
    32. import org.apache.lucene.search.ScoreDoc;<font></font>  
    33. import org.apache.lucene.search.TermQuery;<font></font>  
    34. import org.apache.lucene.search.TermRangeQuery;<font></font>  
    35. import org.apache.lucene.search.TopDocs;<font></font>  
    36. import org.apache.lucene.search.WildcardQuery;<font></font>  
    37. import org.apache.lucene.store.Directory;<font></font>  
    38. import org.apache.lucene.store.FSDirectory;<font></font>  
    39. import org.apache.lucene.store.LockObtainFailedException;<font></font>  
    40. import org.apache.lucene.util.Version;<font></font>  
    41. import org.wltea.analyzer.lucene.IKAnalyzer;<font></font>  
    42. <font></font>  
    43. public class SearcherUtil {<font></font>  
    44.     private Directory directory;<font></font>  
    45.     private Analyzer analyzer = new IKAnalyzer();<font></font>  
    46.     private IndexReader reader;<font></font>  
    47.     private String[] ids = {"1","2","3","4","5","6"};<font></font>  
    48.     private String[] emails = {"aa@itat.org","bb@itat.org","cc@cc.org","dd@sina.org","ee@zttc.edu","ff@itat.org"};<font></font>  
    49.     private String[] contents = {<font></font>  
    50.             "welcome to visited the space,I like book",<font></font>  
    51.             "hello boy, I like pingpeng ball",<font></font>  
    52.             "my name is cc I like game",<font></font>  
    53.             "I like football",<font></font>  
    54.             "I like football and I like basketball too",<font></font>  
    55.             "I like movie and swim"<font></font>  
    56.     };<font></font>  
    57.     private Date[] dates = null;<font></font>  
    58.     private int[] attachs = {2,3,1,4,5,5};<font></font>  
    59.     private String[] names = {"zhangsan","lisi","john","jetty","mike","jake"};<font></font>  
    60.     private Map<String,Float> scores = new HashMap<String,Float>();<font></font>  
    61.     <font></font>  
    62.     public SearcherUtil() {<font></font>  
    63. //      directory = new RAMDirectory();<font></font>  
    64.         try {<font></font>  
    65.             directory = FSDirectory.open(new File("F:\\Workspaces\\lucenes\\02_lucene_searcher\\index"));<font></font>  
    66.             setDates();<font></font>  
    67.             scores.put("itat.org",2.0f);<font></font>  
    68.             scores.put("zttc.edu"1.5f);<font></font>  
    69. //          index();<font></font>  
    70.         } catch (IOException e) {<font></font>  
    71.             e.printStackTrace();<font></font>  
    72.         }<font></font>  
    73.     }<font></font>  
    74.     <font></font>  
    75.     private void setDates() {<font></font>  
    76.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");<font></font>  
    77.         try {<font></font>  
    78.             dates = new Date[ids.length];<font></font>  
    79.             dates[0] = sdf.parse("2010-02-19");<font></font>  
    80.             dates[1] = sdf.parse("2012-01-11");<font></font>  
    81.             dates[2] = sdf.parse("2011-09-19");<font></font>  
    82.             dates[3] = sdf.parse("2010-12-22");<font></font>  
    83.             dates[4] = sdf.parse("2012-01-01");<font></font>  
    84.             dates[5] = sdf.parse("2011-05-19");<font></font>  
    85.         } catch (ParseException e) {<font></font>  
    86.             e.printStackTrace();<font></font>  
    87.         }<font></font>  
    88.     }<font></font>  
    89. <font></font>  
    90.     <font></font>  
    91.     public void index() {<font></font>  
    92.         IndexWriter writer = null;<font></font>  
    93.         try {<font></font>  
    94.             writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));<font></font>  
    95.             writer.deleteAll();<font></font>  
    96.             Document doc = null;<font></font>  
    97.             for(int i=0;i<ids.length;i++) {<font></font>  
    98.                 doc = new Document();<font></font>  
    99.                 doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));<font></font>  
    100.                 doc.add(new Field("email",emails[i],Field.Store.YES,Field.Index.NOT_ANALYZED));<font></font>  
    101.                 doc.add(new Field("content",contents[i],Field.Store.NO,Field.Index.ANALYZED));<font></font>  
    102.                 doc.add(new Field("name",names[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));<font></font>  
    103.                 //存储数字<font></font>  
    104.                 doc.add(new NumericField("attach",Field.Store.YES,true).setIntValue(attachs[i]));<font></font>  
    105.                 //存储日期<font></font>  
    106.                 doc.add(new NumericField("date",Field.Store.YES,true).setLongValue(dates[i].getTime()));<font></font>  
    107.                 String et = emails[i].substring(emails[i].lastIndexOf("@")+1);<font></font>  
    108.                 if(scores.containsKey(et)) {<font></font>  
    109.                     doc.setBoost(scores.get(et));<font></font>  
    110.                 } else {<font></font>  
    111.                     doc.setBoost(0.5f);<font></font>  
    112.                 }<font></font>  
    113.                 writer.addDocument(doc);<font></font>  
    114.             }<font></font>  
    115.         } catch (CorruptIndexException e) {<font></font>  
    116.             e.printStackTrace();<font></font>  
    117.         } catch (LockObtainFailedException e) {<font></font>  
    118.             e.printStackTrace();<font></font>  
    119.         } catch (IOException e) {<font></font>  
    120.             e.printStackTrace();<font></font>  
    121.         } finally {<font></font>  
    122.             try {<font></font>  
    123.                 if(writer!=null)writer.close();<font></font>  
    124.             } catch (CorruptIndexException e) {<font></font>  
    125.                 e.printStackTrace();<font></font>  
    126.             } catch (IOException e) {<font></font>  
    127.                 e.printStackTrace();<font></font>  
    128.             }<font></font>  
    129.         }<font></font>  
    130.     }<font></font>  
    131.     <font></font>  
    132.     public IndexSearcher getSearcher() {<font></font>  
    133.         try {<font></font>  
    134.             if(reader==null) {<font></font>  
    135.                 reader = IndexReader.open(directory);<font></font>  
    136.             } else {<font></font>  
    137.                 IndexReader tr = IndexReader.openIfChanged(reader);<font></font>  
    138.                 if(tr!=null) {<font></font>  
    139.                     reader.close();<font></font>  
    140.                     reader = tr;<font></font>  
    141.                 }<font></font>  
    142.             }<font></font>  
    143.             return new IndexSearcher(reader);<font></font>  
    144.         } catch (CorruptIndexException e) {<font></font>  
    145.             e.printStackTrace();<font></font>  
    146.         } catch (IOException e) {<font></font>  
    147.             e.printStackTrace();<font></font>  
    148.         }<font></font>  
    149.         return null;<font></font>  
    150.     }<font></font>  
    151.     <font></font>  
    152.     public IndexSearcher getSearcher(Directory directory) {<font></font>  
    153.         try {<font></font>  
    154.             if(reader==null) {<font></font>  
    155.                 reader = IndexReader.open(directory);<font></font>  
    156.             } else {<font></font>  
    157.                 IndexReader tr = IndexReader.openIfChanged(reader);<font></font>  
    158.                 if(tr!=null) {<font></font>  
    159.                     reader.close();<font></font>  
    160.                     reader = tr;<font></font>  
    161.                 }<font></font>  
    162.             }<font></font>  
    163.             return new IndexSearcher(reader);<font></font>  
    164.         } catch (CorruptIndexException e) {<font></font>  
    165.             e.printStackTrace();<font></font>  
    166.         } catch (IOException e) {<font></font>  
    167.             e.printStackTrace();<font></font>  
    168.         }<font></font>  
    169.         return null;<font></font>  
    170.     }<font></font>  
    171.     <font></font>  
    172.     public void searchByTerm(String field,String name,int num) {<font></font>  
    173.         try {<font></font>  
    174.             IndexSearcher searcher = getSearcher();<font></font>  
    175.             Query query = new TermQuery(new Term(field,name));<font></font>  
    176.             TopDocs tds = searcher.search(query, num);<font></font>  
    177.             printDocument(searcher, tds);<font></font>  
    178.             searcher.close();<font></font>  
    179.         } catch (CorruptIndexException e) {<font></font>  
    180.             e.printStackTrace();<font></font>  
    181.         } catch (IOException e) {<font></font>  
    182.             e.printStackTrace();<font></font>  
    183.         }<font></font>  
    184.     }<font></font>  
    185.     public void searchByTermToken(String field,String name,int num) {<font></font>  
    186.         try {<font></font>  
    187.             IndexSearcher searcher = getSearcher();<font></font>  
    188. //          Query query = new TermQuery(new Term(field,name));<font></font>  
    189.             //当用户输入两个关键字时,QueryParser默认它们之间的关系为“或”关系<font></font>  
    190.             //下面这么写的话在对用户输入进行扫描时,就会用空格分开的关键字理解为“与”,<font></font>  
    191.             //其实也就是构建了一个“与”关系的布尔型查询<font></font>  
    192. //          parser.setDefaultOperator(Operator.AND);<font></font>  
    193.             QueryParser parser = new QueryParser(Version.LUCENE_35, field, analyzer);<font></font>  
    194.             String k = analyzerKey(name);<font></font>  
    195.             Query query = parser.parse(name);<font></font>  
    196.             TopDocs tds = searcher.search(query, num);<font></font>  
    197.             printDocument(searcher, tds);<font></font>  
    198.             searcher.close();<font></font>  
    199.         } catch (CorruptIndexException e) {<font></font>  
    200.             e.printStackTrace();<font></font>  
    201.         } catch (Exception e) {<font></font>  
    202.             e.printStackTrace();<font></font>  
    203.         }<font></font>  
    204.     }<font></font>  
    205.     private String analyzerKey(String key){<font></font>  
    206. //      StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);<font></font>  
    207.         StringReader reader = new StringReader(key);<font></font>  
    208.         TokenStream tokenStream = analyzer.tokenStream("", reader);<font></font>  
    209.         CharTermAttribute termattr = tokenStream.addAttribute(CharTermAttribute.class);<font></font>  
    210.         StringBuilder sb = new StringBuilder();<font></font>  
    211.         try {<font></font>  
    212.             while(tokenStream.incrementToken()){<font></font>  
    213.                 String k = termattr.toString();<font></font>  
    214.                 sb.append(k).append(" ");<font></font>  
    215.             }<font></font>  
    216.         } catch (IOException e) {<font></font>  
    217.             e.printStackTrace();<font></font>  
    218.         }<font></font>  
    219.         key = sb.toString().trim();<font></font>  
    220.         key = key.replaceAll("\\s+"" AND ");<font></font>  
    221.         return sb.toString();<font></font>  
    222.     }<font></font>  
    223.     public void printDocument(IndexSearcher searcher,TopDocs tds){<font></font>  
    224.         System.out.println("共查询了【"+tds.totalHits+"】条");<font></font>  
    225.         for(ScoreDoc sd : tds.scoreDocs){<font></font>  
    226.             try {<font></font>  
    227.                 Document doc = searcher.doc(sd.doc);<font></font>  
    228.                 System.out.println("filename:"+doc.get("filename"));<font></font>  
    229.                 System.out.println("path:"+doc.get("path"));<font></font>  
    230.                 System.out.println("date:"+doc.get("date"));<font></font>  
    231.                 System.out.println("size:"+doc.get("size"));<font></font>  
    232.                 System.out.println("content:"+doc.get("content"));<font></font>  
    233.                 System.out.println("-------------------------------------------");<font></font>  
    234.             } catch (CorruptIndexException e) {<font></font>  
    235.                 e.printStackTrace();<font></font>  
    236.             } catch (IOException e) {<font></font>  
    237.                 e.printStackTrace();<font></font>  
    238.             }<font></font>  
    239.         }<font></font>  
    240.     }<font></font>  
    241.     public void searchByTermRange(String field,String start,String end,int num) {<font></font>  
    242.         try {<font></font>  
    243.             IndexSearcher searcher = getSearcher();<font></font>  
    244.             Query query = new TermRangeQuery(field,start,end,truetrue);<font></font>  
    245.             TopDocs tds = searcher.search(query, num);<font></font>  
    246.             printDocument(searcher, tds);<font></font>  
    247.             searcher.close();<font></font>  
    248.         } catch (CorruptIndexException e) {<font></font>  
    249.             e.printStackTrace();<font></font>  
    250.         } catch (IOException e) {<font></font>  
    251.             e.printStackTrace();<font></font>  
    252.         }<font></font>  
    253.     }<font></font>  
    254.     /**<font></font> 
    255.      * 建立索引时:使用的Field, 而使用NumericRangeQuery, 必须使用NumericField<font></font> 
    256.      * @param field<font></font> 
    257.      * @param start<font></font> 
    258.      * @param end<font></font> 
    259.      * @param num<font></font> 
    260.      */<font></font>  
    261.     public void searchByNumricRange(String field,int start,int end,int num) {<font></font>  
    262.         try {<font></font>  
    263.             IndexSearcher searcher = getSearcher();<font></font>  
    264.             Query query = NumericRangeQuery.newIntRange(field,start, end,true,true);<font></font>  
    265. //           DateTools.dateToString(new Date(), null);<font></font>  
    266.             TopDocs tds = searcher.search(query, num);<font></font>  
    267.             printDocument(searcher, tds);<font></font>  
    268.             searcher.close();<font></font>  
    269.         } catch (CorruptIndexException e) {<font></font>  
    270.             e.printStackTrace();<font></font>  
    271.         } catch (IOException e) {<font></font>  
    272.             e.printStackTrace();<font></font>  
    273.         }<font></font>  
    274.     }<font></font>  
    275.     <font></font>  
    276.     public void searchByPrefix(String field,String value,int num) {<font></font>  
    277.         try {<font></font>  
    278.             IndexSearcher searcher = getSearcher();<font></font>  
    279.             Query query = new PrefixQuery(new Term(field,value));<font></font>  
    280.             TopDocs tds = searcher.search(query, num);<font></font>  
    281.             printDocument(searcher, tds);<font></font>  
    282.             searcher.close();<font></font>  
    283.         } catch (CorruptIndexException e) {<font></font>  
    284.             e.printStackTrace();<font></font>  
    285.         } catch (IOException e) {<font></font>  
    286.             e.printStackTrace();<font></font>  
    287.         }<font></font>  
    288.     }<font></font>  
    289.     <font></font>  
    290.     public void searchByWildcard(String field,String value,int num) {<font></font>  
    291.         try {<font></font>  
    292.             IndexSearcher searcher = getSearcher();<font></font>  
    293.             //在传入的value中可以使用通配符:?和*,?表示匹配一个字符,*表示匹配任意多个字符<font></font>  
    294.             Query query = new WildcardQuery(new Term(field,value));<font></font>  
    295.             TopDocs tds = searcher.search(query, num);<font></font>  
    296.             printDocument(searcher, tds);<font></font>  
    297.             searcher.close();<font></font>  
    298.         } catch (CorruptIndexException e) {<font></font>  
    299.             e.printStackTrace();<font></font>  
    300.         } catch (IOException e) {<font></font>  
    301.             e.printStackTrace();<font></font>  
    302.         }<font></font>  
    303.     }<font></font>  
    304.     <font></font>  
    305.     public void searchByBoolean(int num) {<font></font>  
    306.         try {<font></font>  
    307.             IndexSearcher searcher = getSearcher();<font></font>  
    308.             BooleanQuery query = new BooleanQuery();<font></font>  
    309.             /*<font></font> 
    310.              * BooleanQuery可以连接多个子查询<font></font> 
    311.              * Occur.MUST表示必须出现<font></font> 
    312.              * Occur.SHOULD表示可以出现<font></font> 
    313.              * Occur.MUSE_NOT表示不能出现<font></font> 
    314.              */<font></font>  
    315.             query.add(new TermQuery(new Term("name","3")), Occur.MUST_NOT);<font></font>  
    316.             query.add(new TermQuery(new Term("content","健壮")),Occur.SHOULD);<font></font>  
    317.             TopDocs tds = searcher.search(query, num);<font></font>  
    318.             printDocument(searcher, tds);<font></font>  
    319.             searcher.close();<font></font>  
    320.         } catch (CorruptIndexException e) {<font></font>  
    321.             e.printStackTrace();<font></font>  
    322.         } catch (IOException e) {<font></font>  
    323.             e.printStackTrace();<font></font>  
    324.         }<font></font>  
    325.     }<font></font>  
    326.     <font></font>  
    327.     public void searchByPhrase(int num) {<font></font>  
    328.         try {<font></font>  
    329.             IndexSearcher searcher = getSearcher();<font></font>  
    330.             PhraseQuery query = new PhraseQuery();<font></font>  
    331.             query.setSlop(10);<font></font>  
    332.             query.add(new Term("content","java"));<font></font>  
    333.             //第一个Term<font></font>  
    334.             query.add(new Term("content","程序"));<font></font>  
    335.             //产生距离之后的第二个Term<font></font>  
    336. //          query.add(new Term("content","football"));<font></font>  
    337.             TopDocs tds = searcher.search(query, num);<font></font>  
    338.             printDocument(searcher, tds);<font></font>  
    339.             searcher.close();<font></font>  
    340.         } catch (CorruptIndexException e) {<font></font>  
    341.             e.printStackTrace();<font></font>  
    342.         } catch (IOException e) {<font></font>  
    343.             e.printStackTrace();<font></font>  
    344.         }<font></font>  
    345.     }<font></font>  
    346.     /**<font></font> 
    347.      * 查询用于匹配与指定项相似的项<font></font> 
    348.      * 默认是匹配一个有不同的,其他一样的,比如like 和 mike,就是距离算法的相似距离为1<font></font> 
    349.      * 这种方式少用,影响效率<font></font> 
    350.      */<font></font>  
    351.     public void searchByFuzzy(int num) {<font></font>  
    352.         try {<font></font>  
    353.             IndexSearcher searcher = getSearcher();<font></font>  
    354.             //最后两个参数为匹配率和距离<font></font>  
    355.             FuzzyQuery query = new FuzzyQuery(new Term("content","总统"),0.4f,0);<font></font>  
    356.             System.out.println(query.getPrefixLength());<font></font>  
    357.             System.out.println(query.getMinSimilarity());<font></font>  
    358.             TopDocs tds = searcher.search(query, num);<font></font>  
    359.             printDocument(searcher, tds);<font></font>  
    360.             searcher.close();<font></font>  
    361.         } catch (CorruptIndexException e) {<font></font>  
    362.             e.printStackTrace();<font></font>  
    363.         } catch (IOException e) {<font></font>  
    364.             e.printStackTrace();<font></font>  
    365.         }<font></font>  
    366.     }<font></font>  
    367.     <font></font>  
    368.     public void searchByQueryParse(Query query,int num) {<font></font>  
    369.         try {<font></font>  
    370.             IndexSearcher searcher = getSearcher();<font></font>  
    371.             TopDocs tds = searcher.search(query, num);<font></font>  
    372.             System.out.println("一共查询了:"+tds.totalHits);<font></font>  
    373.             for(ScoreDoc sd:tds.scoreDocs) {<font></font>  
    374.                 Document doc = searcher.doc(sd.doc);<font></font>  
    375.                 System.out.println(doc.get("id")+"---->"+<font></font>  
    376.                         doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+<font></font>  
    377.                         doc.get("attach")+","+doc.get("date")+"=="+sd.score);<font></font>  
    378.             }<font></font>  
    379.             searcher.close();<font></font>  
    380.         } catch (CorruptIndexException e) {<font></font>  
    381.             e.printStackTrace();<font></font>  
    382.         } catch (IOException e) {<font></font>  
    383.             e.printStackTrace();<font></font>  
    384.         }<font></font>  
    385.     }<font></font>  
    386.     /**<font></font> 
    387.      * lucene3.5之前采用的是一种再查询的方式,也就是说先把全部的结果的docid查询出来,然后<font></font> 
    388.      * 分页得到该页的docid,然后根据docid得到document信息,<font></font> 
    389.      * lucene官方是说他的速度已经够快,再查询不会有效率问题<font></font> 
    390.      * @param query<font></font> 
    391.      * @param pageIndex<font></font> 
    392.      * @param pageSize<font></font> 
    393.      */<font></font>  
    394.     public void searchPage(String query,int pageIndex,int pageSize) {<font></font>  
    395.         try {<font></font>  
    396.             Directory dir = FileIndexUtils.getDirectory();<font></font>  
    397.             IndexSearcher searcher = getSearcher(dir);<font></font>  
    398.             QueryParser parser = new QueryParser(Version.LUCENE_35,"content",analyzer);<font></font>  
    399.             Query q = parser.parse(query);<font></font>  
    400.             TopDocs tds = searcher.search(q, 500);<font></font>  
    401.             ScoreDoc[] sds = tds.scoreDocs;<font></font>  
    402.             int start = (pageIndex-1)*pageSize;<font></font>  
    403.             int end = pageIndex*pageSize;<font></font>  
    404.             for(int i=start;i<end;i++) {<font></font>  
    405.                 Document doc = searcher.doc(sds[i].doc);<font></font>  
    406.                 System.out.println("filename:"+doc.get("filename"));<font></font>  
    407.                 System.out.println("path:"+doc.get("path"));<font></font>  
    408.                 System.out.println("date:"+doc.get("date"));<font></font>  
    409.                 System.out.println("size:"+doc.get("size"));<font></font>  
    410.                 System.out.println("content:"+doc.get("content"));<font></font>  
    411.                 System.out.println("-------------------------------------------");<font></font>  
    412.             }<font></font>  
    413.             <font></font>  
    414.             searcher.close();<font></font>  
    415.         } catch (org.apache.lucene.queryParser.ParseException e) {<font></font>  
    416.             e.printStackTrace();<font></font>  
    417.         } catch (IOException e) {<font></font>  
    418.             e.printStackTrace();<font></font>  
    419.         }<font></font>  
    420.     }<font></font>  
    421.     <font></font>  
    422.     /**<font></font> 
    423.      * 目前没有办法只取当前这页的数据,而是要全部查询然后得到docid<font></font> 
    424.      * 一种增加效率的方式是取的条数做下限制,比如不要每次都取500条,<font></font> 
    425.      * 也是把取的条数设置为当前页的所在位置数,比如每页10条,<font></font> 
    426.      * 取第一页数据则取10条,取第二页则取20条,取五页则去50条<font></font> 
    427.      * 根据页码和分页大小获取上一次的最后一个ScoreDoc<font></font> 
    428.      */<font></font>  
    429.     private ScoreDoc getLastScoreDoc(int pageIndex,int pageSize,Query query,IndexSearcher searcher) throws IOException {<font></font>  
    430.         if(pageIndex==1)return null;//如果是第一页就返回空<font></font>  
    431.         int num = pageSize*(pageIndex-1);//获取上一页的数量<font></font>  
    432.         TopDocs tds = searcher.search(query, num);<font></font>  
    433.         return tds.scoreDocs[num-1];<font></font>  
    434.     }<font></font>  
    435.     /**<font></font> 
    436.      * 使用这种方式的话是把上一页的最后一个元素给拿到,然后再把pagesize传入,<font></font> 
    437.      * 就可以得到当页的数据,其实就是简便了查询,原理还是把全部的docid查询后在得到document<font></font> 
    438.      * @param query<font></font> 
    439.      * @param pageIndex<font></font> 
    440.      * @param pageSize<font></font> 
    441.      */<font></font>  
    442.     public void searchPageByAfter(String query,int pageIndex,int pageSize) {<font></font>  
    443.         try {<font></font>  
    444.             Directory dir = FileIndexUtils.getDirectory();<font></font>  
    445.             IndexSearcher searcher = getSearcher(dir);<font></font>  
    446.             QueryParser parser = new QueryParser(Version.LUCENE_35,"content",analyzer);<font></font>  
    447.             Query q = parser.parse(query);<font></font>  
    448.             //先获取上一页的最后一个元素<font></font>  
    449.             ScoreDoc lastSd = getLastScoreDoc(pageIndex, pageSize, q, searcher);<font></font>  
    450.             //通过最后一个元素搜索下页的pageSize个元素<font></font>  
    451.             TopDocs tds = searcher.searchAfter(lastSd,q, pageSize);<font></font>  
    452.             printDocument(searcher, tds);<font></font>  
    453.             searcher.close();<font></font>  
    454.         } catch (org.apache.lucene.queryParser.ParseException e) {<font></font>  
    455.             e.printStackTrace();<font></font>  
    456.         } catch (IOException e) {<font></font>  
    457.             e.printStackTrace();<font></font>  
    458.         }<font></font>  
    459.     }<font></font>  
    460.     <font></font>  
    461.     public void searchNoPage(String query) {<font></font>  
    462.         try {<font></font>  
    463.             Directory dir = FileIndexUtils.getDirectory();<font></font>  
    464.             IndexSearcher searcher = getSearcher(dir);<font></font>  
    465.             QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));<font></font>  
    466.             Query q = parser.parse(query);<font></font>  
    467.             TopDocs tds = searcher.search(q, 20);<font></font>  
    468.             ScoreDoc[] sds = tds.scoreDocs;<font></font>  
    469.             for(int i=0;i<sds.length;i++) {<font></font>  
    470.                 Document doc = searcher.doc(sds[i].doc);<font></font>  
    471.                 System.out.println(sds[i].doc+":"+doc.get("path")+"-->"+doc.get("filename"));<font></font>  
    472.             }<font></font>  
    473.             <font></font>  
    474.             searcher.close();<font></font>  
    475.         } catch (org.apache.lucene.queryParser.ParseException e) {<font></font>  
    476.             e.printStackTrace();<font></font>  
    477.         } catch (IOException e) {<font></font>  
    478.             e.printStackTrace();<font></font>  
    479.         }<font></font>  
    480.     }<font></font>  
    481. }  

    3、查询语法的测试单元类

    [java] view plaincopy
     
    1. package org.itat.test;<font></font>  
    2. <font></font>  
    3. import java.io.File;<font></font>  
    4. import java.io.IOException;<font></font>  
    5. import org.apache.commons.io.FileUtils;<font></font>  
    6. import org.apache.commons.io.FilenameUtils;<font></font>  
    7. import org.apache.lucene.analysis.Analyzer;<font></font>  
    8. import org.apache.lucene.analysis.standard.StandardAnalyzer;<font></font>  
    9. import org.apache.lucene.queryParser.ParseException;<font></font>  
    10. import org.apache.lucene.queryParser.QueryParser;<font></font>  
    11. import org.apache.lucene.search.Query;<font></font>  
    12. import org.apache.lucene.util.Version;<font></font>  
    13. import org.itat.index.FileIndexUtils;<font></font>  
    14. import org.itat.index.SearcherUtil;<font></font>  
    15. import org.junit.Before;<font></font>  
    16. import org.junit.Test;<font></font>  
    17. import org.wltea.analyzer.lucene.IKAnalyzer;<font></font>  
    18. <font></font>  
    19. public class TestSearch {<font></font>  
    20.     private SearcherUtil su;<font></font>  
    21.     private Analyzer analyzer = new IKAnalyzer();<font></font>  
    22.     @Before<font></font>  
    23.     public void init() {<font></font>  
    24.         su = new SearcherUtil();<font></font>  
    25.     }<font></font>  
    26.     <font></font>  
    27.     @Test<font></font>  
    28.     public void testCopyFiles() {<font></font>  
    29.         try {<font></font>  
    30.             File file = new File("F:\\Workspaces\\lucenes\\02_lucene_searcher\\resource");<font></font>  
    31.             for(File f:file.listFiles()) {<font></font>  
    32.                 String destFileName = FilenameUtils.getFullPath(f.getAbsolutePath())+<font></font>  
    33.                         FilenameUtils.getBaseName(f.getName())+".she";<font></font>  
    34.                 FileUtils.copyFile(f, new File(destFileName));<font></font>  
    35.             }<font></font>  
    36.         } catch (IOException e) {<font></font>  
    37.             e.printStackTrace();<font></font>  
    38.         }<font></font>  
    39.     }<font></font>  
    40.     <font></font>  
    41.     @Test<font></font>  
    42.     public void searchByTerm() {<font></font>  
    43. //      su.searchByTerm("content","",10);<font></font>  
    44.         su.searchByTermToken("content","头脑风暴",10);<font></font>  
    45.     }<font></font>  
    46.     <font></font>  
    47.     @Test<font></font>  
    48.     public void searchByTermRange() {<font></font>  
    49.         //查询name以a开头和s结尾的<font></font>  
    50. //      su.searchByTermRange("name","a","s",10);<font></font>  
    51.         //由于attachs是数字类型,使用TermRange无法查询<font></font>  
    52. //      su.searchByTermRange("size",new NumericField("200").stringValue(),new NumericField("500").stringValue(), 10);<font></font>  
    53.         QueryParser parser = new QueryParser(Version.LUCENE_35, "size", analyzer);<font></font>  
    54.         Query query;<font></font>  
    55.         try {<font></font>  
    56.             query = parser.parse("size:[100 TO 500]");<font></font>  
    57.             su.searchByQueryParse(query, 10);<font></font>  
    58.         } catch (ParseException e) {<font></font>  
    59.             e.printStackTrace();<font></font>  
    60.         } <font></font>  
    61.     }<font></font>  
    62.     <font></font>  
    63.     @Test<font></font>  
    64.     public void searchByNumRange() {<font></font>  
    65. //      su.searchByNumricRange("attach",2,10, 5);<font></font>  
    66.         su.searchByNumricRange("size",100,30010);<font></font>  
    67.     }<font></font>  
    68.     <font></font>  
    69.     @Test<font></font>  
    70.     public void searchByPrefix() {<font></font>  
    71.         su.searchByPrefix("content""人"10);<font></font>  
    72.     }<font></font>  
    73.     <font></font>  
    74.     @Test<font></font>  
    75.     public void searchByWildcard() {<font></font>  
    76.         //匹配@itat.org结尾的所有字符<font></font>  
    77. //      su.searchByWildcard("email", "*@itat.org", 10);<font></font>  
    78.         //匹配j开头的有三个字符的name<font></font>  
    79. //      su.searchByWildcard("name", "j???", 10);<font></font>  
    80.         su.searchByWildcard("content""类?"10);<font></font>  
    81.     }<font></font>  
    82.     <font></font>  
    83.     @Test<font></font>  
    84.     public void searchByBoolean() {<font></font>  
    85.         su.searchByBoolean(10);<font></font>  
    86.     }<font></font>  
    87.     <font></font>  
    88.     @Test<font></font>  
    89.     public void searchByPhrase() {<font></font>  
    90.         su.searchByPhrase(10);<font></font>  
    91.     }<font></font>  
    92.     <font></font>  
    93.     @Test<font></font>  
    94.     public void searchByFuzzy() {<font></font>  
    95.         su.searchByFuzzy(10);<font></font>  
    96.     }<font></font>  
    97.     <font></font>  
    98.     @Test<font></font>  
    99.     public void searchByQueryParse() throws ParseException {<font></font>  
    100.         //1、创建QueryParser对象,默认搜索域为content<font></font>  
    101.         QueryParser parser = new QueryParser(Version.LUCENE_35, "content"new StandardAnalyzer(Version.LUCENE_35));<font></font>  
    102.         //改变空格的默认操作符,以下可以改成AND<font></font>  
    103.         //parser.setDefaultOperator(Operator.AND);<font></font>  
    104.         //开启第一个字符的通配符匹配,默认关闭因为效率不高<font></font>  
    105.         parser.setAllowLeadingWildcard(true);<font></font>  
    106.         //搜索content中包含有like的<font></font>  
    107.         Query query = parser.parse("like");<font></font>  
    108.         <font></font>  
    109.         //有basketball或者football的,空格默认就是OR<font></font>  
    110.         query = parser.parse("basketball football");<font></font>  
    111.         <font></font>  
    112.         //改变搜索域为name为mike<font></font>  
    113.         //query = parser.parse("content:like");<font></font>  
    114.         <font></font>  
    115.         //同样可以使用*和?来进行通配符匹配<font></font>  
    116. //      query = parser.parse("name:j*");<font></font>  
    117.         <font></font>  
    118.         //通配符默认不能放在首位<font></font>  
    119. //      query = parser.parse("email:*@itat.org");<font></font>  
    120.         <font></font>  
    121.         //匹配name中没有mike但是content中必须有football的,+和-要放置到域说明前面<font></font>  
    122.         query = parser.parse("- name:mike + like");<font></font>  
    123.         <font></font>  
    124.         //匹配一个区间,注意:TO必须是大写<font></font>  
    125.         //query = parser.parse("id:[1 TO 6]");<font></font>  
    126.         <font></font>  
    127.         //闭区间匹配只会匹配到2<font></font>  
    128.         //query = parser.parse("id:{1 TO 3}");<font></font>  
    129.         <font></font>  
    130.         //完全匹配I Like Football的<font></font>  
    131.         //query = parser.parse("\"I like football\"");<font></font>  
    132.         <font></font>  
    133.         //匹配I 和football之间有一个单词距离的<font></font>  
    134.         //query = parser.parse("\"I football\"~1");<font></font>  
    135.         <font></font>  
    136.         //模糊查询<font></font>  
    137.         //query = parser.parse("name:make~");<font></font>  
    138.         <font></font>  
    139.         //没有办法匹配数字范围(自己扩展Parser)<font></font>  
    140.         //query = parser.parse("attach:[2 TO 10]");<font></font>  
    141.         su.searchByQueryParse(query, 10);<font></font>  
    142.     }<font></font>  
    143.     <font></font>  
    144.     @Test<font></font>  
    145.     public void indexFile() {<font></font>  
    146.         FileIndexUtils.index(true);<font></font>  
    147.     }<font></font>  
    148.     <font></font>  
    149.     @Test<font></font>  
    150.     public void testSearchPage01() {<font></font>  
    151.         su.searchPage("java"2,5);<font></font>  
    152.         System.out.println("-------------------------------");<font></font>  
    153. //      su.searchNoPage("java");<font></font>  
    154.         su.searchPageByAfter("java"2,2);<font></font>  
    155.     }<font></font>  
    156.     <font></font>  
    157.     @Test<font></font>  
    158.     public void testSearchPage02() {<font></font>  
    159.         su.searchPageByAfter("java"3,20);<font></font>  
    160.     }<font></font>  
    161.     <font></font>  
    162. }  


    4、创建索引的类

    [java] view plaincopy
     
    1. package org.itat.index;  
    2.   
    3. import java.io.File;  
    4. import java.io.FileReader;  
    5. import java.io.IOException;  
    6. import org.apache.commons.io.FileUtils;  
    7. import org.apache.lucene.analysis.Analyzer;  
    8. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
    9. import org.apache.lucene.document.Document;  
    10. import org.apache.lucene.document.Field;  
    11. import org.apache.lucene.document.NumericField;  
    12. import org.apache.lucene.index.CorruptIndexException;  
    13. import org.apache.lucene.index.IndexWriter;  
    14. import org.apache.lucene.index.IndexWriterConfig;  
    15. import org.apache.lucene.store.Directory;  
    16. import org.apache.lucene.store.FSDirectory;  
    17. import org.apache.lucene.store.LockObtainFailedException;  
    18. import org.apache.lucene.util.Version;  
    19. import org.wltea.analyzer.lucene.IKAnalyzer;  
    20.   
    21. public class FileIndexUtils {  
    22.     private static Directory directory = null;  
    23.     private static Analyzer analyzer = new IKAnalyzer();  
    24.     static{  
    25.         try {  
    26.             directory = FSDirectory.open(new File("F:\\Workspaces\\lucenes\\02_lucene_searcher\\index"));  
    27.         } catch (IOException e) {  
    28.             e.printStackTrace();  
    29.         }  
    30.     }  
    31.       
    32.     public static Directory getDirectory() {  
    33.         return directory;  
    34.     }  
    35.       
    36.     public static void index(boolean hasNew) {  
    37.         IndexWriter writer = null;  
    38.         try {  
    39.             writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, analyzer));  
    40.             if(hasNew) {  
    41.                 writer.deleteAll();  
    42.             }  
    43.             File file = new File("F:\\Workspaces\\lucenes\\02_lucene_searcher\\resource");  
    44.             Document doc = null;  
    45.             for(File f:file.listFiles()) {  
    46.                 doc = new Document();  
    47.                 doc.add(new Field("content",FileUtils.readFileToString(f),Field.Store.YES,Field.Index.ANALYZED));  
    48.                 doc.add(new Field("filename",f.getName(),Field.Store.YES,Field.Index.ANALYZED));  
    49.                 doc.add(new Field("path",f.getAbsolutePath(),Field.Store.YES,Field.Index.ANALYZED));  
    50.                 doc.add(new NumericField("date",Field.Store.YES,true).setLongValue(f.lastModified()));  
    51.                 doc.add(new NumericField("size",Field.Store.YES,true).setIntValue((int)(f.length())));  
    52.                 writer.addDocument(doc);  
    53.             }  
    54.         } catch (CorruptIndexException e) {  
    55.             e.printStackTrace();  
    56.         } catch (LockObtainFailedException e) {  
    57.             e.printStackTrace();  
    58.         } catch (IOException e) {  
    59.             e.printStackTrace();  
    60.         } finally {  
    61.             try {  
    62.                 if(writer!=null) writer.close();  
    63.             } catch (CorruptIndexException e) {  
    64.                 e.printStackTrace();  
    65.             } catch (IOException e) {  
    66.                 e.printStackTrace();  
    67.             }  
    68.         }  
    69.     }  
    70. }  


    5、对索引进行操作的类

    [java] view plaincopy
     
      1. package org.itat.index;  
      2.   
      3. import java.io.IOException;  
      4. import java.text.ParseException;  
      5. import java.text.SimpleDateFormat;  
      6. import java.util.Date;  
      7. import java.util.HashMap;  
      8. import java.util.Map;  
      9. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
      10. import org.apache.lucene.document.Document;  
      11. import org.apache.lucene.document.Field;  
      12. import org.apache.lucene.document.NumericField;  
      13. import org.apache.lucene.index.CorruptIndexException;  
      14. import org.apache.lucene.index.IndexReader;  
      15. import org.apache.lucene.index.IndexWriter;  
      16. import org.apache.lucene.index.IndexWriterConfig;  
      17. import org.apache.lucene.index.StaleReaderException;  
      18. import org.apache.lucene.index.Term;  
      19. import org.apache.lucene.store.Directory;  
      20. import org.apache.lucene.store.LockObtainFailedException;  
      21. import org.apache.lucene.store.RAMDirectory;  
      22. import org.apache.lucene.util.Version;  
      23.   
      24.   
      25. public class IndexUtil {  
      26.     private String[] ids = {"1","2","3","4","5","6"};  
      27.     private String[] emails = {"aa@itat.org","bb@itat.org","cc@cc.org","dd@sina.org","ee@zttc.edu","ff@itat.org"};  
      28.     private String[] contents = {  
      29.             "welcome to visited the space,I like book",  
      30.             "hello boy, I like pingpeng ball",  
      31.             "my name is cc I like game",  
      32.             "I like football",  
      33.             "I like football and I like basketball too",  
      34.             "I like movie and swim"  
      35.     };  
      36.     private Date[] dates = null;  
      37.     private int[] attachs = {2,3,1,4,5,5};  
      38.     private String[] names = {"zhangsan","lisi","john","jetty","mike","jake"};  
      39.     private Directory directory = null;  
      40.     private Map<String,Float> scores = new HashMap<String,Float>();  
      41.       
      42.     public IndexUtil() {  
      43.         setDates();  
      44.         scores.put("itat.org",2.0f);  
      45.         scores.put("zttc.edu"1.5f);  
      46.         directory = new RAMDirectory();  
      47.         index();  
      48.     }  
      49.       
      50.       
      51.       
      52.     private void setDates() {  
      53.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
      54.         try {  
      55.             dates = new Date[ids.length];  
      56.             dates[0] = sdf.parse("2010-02-19");  
      57.             dates[1] = sdf.parse("2012-01-11");  
      58.             dates[2] = sdf.parse("2011-09-19");  
      59.             dates[3] = sdf.parse("2010-12-22");  
      60.             dates[4] = sdf.parse("2012-01-01");  
      61.             dates[5] = sdf.parse("2011-05-19");  
      62.         } catch (ParseException e) {  
      63.             e.printStackTrace();  
      64.         }  
      65.     }  
      66.   
      67.     public void undelete() {  
      68.         //使用IndexReader进行恢复  
      69.         try {  
      70.             IndexReader reader = IndexReader.open(directory,false);  
      71.             //恢复时,必须把IndexReader的只读(readOnly)设置为false  
      72.             reader.undeleteAll();  
      73.             reader.close();  
      74.         } catch (CorruptIndexException e) {  
      75.             e.printStackTrace();  
      76.         } catch (StaleReaderException e) {  
      77.             e.printStackTrace();  
      78.         } catch (LockObtainFailedException e) {  
      79.             e.printStackTrace();  
      80.         } catch (IOException e) {  
      81.             e.printStackTrace();  
      82.         }  
      83.     }  
      84.       
      85.     public void merge() {  
      86.         IndexWriter writer = null;  
      87.         try {  
      88.             writer = new IndexWriter(directory,  
      89.                     new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));  
      90.             //会将索引合并为2段,这两段中的被删除的数据会被清空  
      91.             //特别注意:此处Lucene在3.5之后不建议使用,因为会消耗大量的开销,  
      92.             //Lucene会根据情况自动处理的  
      93.             writer.forceMerge(2);  
      94.         } catch (CorruptIndexException e) {  
      95.             e.printStackTrace();  
      96.         } catch (LockObtainFailedException e) {  
      97.             e.printStackTrace();  
      98.         } catch (IOException e) {  
      99.             e.printStackTrace();  
      100.         } finally {  
      101.             try {  
      102.                 if(writer!=null) writer.close();  
      103.             } catch (CorruptIndexException e) {  
      104.                 e.printStackTrace();  
      105.             } catch (IOException e) {  
      106.                 e.printStackTrace();  
      107.             }  
      108.         }  
      109.     }  
      110.       
      111.     public void forceDelete() {  
      112.         IndexWriter writer = null;  
      113.           
      114.         try {  
      115.             writer = new IndexWriter(directory,  
      116.                     new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));  
      117.             writer.forceMergeDeletes();  
      118.         } catch (CorruptIndexException e) {  
      119.             e.printStackTrace();  
      120.         } catch (LockObtainFailedException e) {  
      121.             e.printStackTrace();  
      122.         } catch (IOException e) {  
      123.             e.printStackTrace();  
      124.         } finally {  
      125.             try {  
      126.                 if(writer!=null) writer.close();  
      127.             } catch (CorruptIndexException e) {  
      128.                 e.printStackTrace();  
      129.             } catch (IOException e) {  
      130.                 e.printStackTrace();  
      131.             }  
      132.         }  
      133.     }  
      134.       
      135.     public void delete() {  
      136.         IndexWriter writer = null;  
      137.           
      138.         try {  
      139.             writer = new IndexWriter(directory,  
      140.                     new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));  
      141.             //参数是一个选项,可以是一个Query,也可以是一个term,term是一个精确查找的值  
      142.             //此时删除的文档并不会被完全删除,而是存储在一个回收站中的,可以恢复  
      143.             writer.deleteDocuments(new Term("id","1"));  
      144.             writer.commit();  
      145.         } catch (CorruptIndexException e) {  
      146.             e.printStackTrace();  
      147.         } catch (LockObtainFailedException e) {  
      148.             e.printStackTrace();  
      149.         } catch (IOException e) {  
      150.             e.printStackTrace();  
      151.         } finally {  
      152.             try {  
      153.                 if(writer!=null) writer.close();  
      154.             } catch (CorruptIndexException e) {  
      155.                 e.printStackTrace();  
      156.             } catch (IOException e) {  
      157.                 e.printStackTrace();  
      158.             }  
      159.         }  
      160.     }  
      161.       
      162.       
      163.     public void update() {  
      164.         IndexWriter writer = null;  
      165.         try {  
      166.             writer = new IndexWriter(directory,  
      167.                     new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));  
      168.             /* 
      169.              * Lucene并没有提供更新,这里的更新操作其实是如下两个操作的合集 
      170.              * 先删除之后再添加 
      171.              */  
      172.             Document doc = new Document();  
      173.             doc.add(new Field("id","11",Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));  
      174.             doc.add(new Field("email",emails[0],Field.Store.YES,Field.Index.NOT_ANALYZED));  
      175.             doc.add(new Field("content",contents[0],Field.Store.NO,Field.Index.ANALYZED));  
      176.             doc.add(new Field("name",names[0],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));  
      177.             writer.updateDocument(new Term("id","1"), doc);  
      178.         } catch (CorruptIndexException e) {  
      179.             e.printStackTrace();  
      180.         } catch (LockObtainFailedException e) {  
      181.             e.printStackTrace();  
      182.         } catch (IOException e) {  
      183.             e.printStackTrace();  
      184.         } finally {  
      185.             try {  
      186.                 if(writer!=null) writer.close();  
      187.             } catch (CorruptIndexException e) {  
      188.                 e.printStackTrace();  
      189.             } catch (IOException e) {  
      190.                 e.printStackTrace();  
      191.             }  
      192.         }  
      193.     }  
      194.       
      195.     public void query() {  
      196.         try {  
      197.             IndexReader reader = IndexReader.open(directory);  
      198.             //通过reader可以有效的获取到文档的数量  
      199.             System.out.println("numDocs:"+reader.numDocs());  
      200.             System.out.println("maxDocs:"+reader.maxDoc());  
      201.             System.out.println("deleteDocs:"+reader.numDeletedDocs());  
      202.             reader.close();  
      203.         } catch (CorruptIndexException e) {  
      204.             e.printStackTrace();  
      205.         } catch (IOException e) {  
      206.             e.printStackTrace();  
      207.         }  
      208.     }  
      209.       
      210.     public void index() {  
      211.         IndexWriter writer = null;  
      212.         try {  
      213.             writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));  
      214.             writer.deleteAll();  
      215.             Document doc = null;  
      216.             for(int i=0;i<ids.length;i++) {  
      217.                 doc = new Document();  
      218.                 doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));  
      219.                 doc.add(new Field("email",emails[i],Field.Store.YES,Field.Index.NOT_ANALYZED));  
      220.                 doc.add(new Field("content",contents[i],Field.Store.NO,Field.Index.ANALYZED));  
      221.                 doc.add(new Field("name",names[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));  
      222.                 //存储数字  
      223.                 doc.add(new NumericField("attach",Field.Store.YES,true).setIntValue(attachs[i]));  
      224.                 //存储日期  
      225.                 doc.add(new NumericField("date",Field.Store.YES,true).setLongValue(dates[i].getTime()));  
      226.                 String et = emails[i].substring(emails[i].lastIndexOf("@")+1);  
      227.                 System.out.println(et);  
      228.                 if(scores.containsKey(et)) {  
      229.                     doc.setBoost(scores.get(et));  
      230.                 } else {  
      231.                     doc.setBoost(0.5f);  
      232.                 }  
      233.                 writer.addDocument(doc);  
      234.             }  
      235.         } catch (CorruptIndexException e) {  
      236.             e.printStackTrace();  
      237.         } catch (LockObtainFailedException e) {  
      238.             e.printStackTrace();  
      239.         } catch (IOException e) {  
      240.             e.printStackTrace();  
      241.         } finally {  
      242.             try {  
      243.                 if(writer!=null)writer.close();  
      244.             } catch (CorruptIndexException e) {  
      245.                 e.printStackTrace();  
      246.             } catch (IOException e) {  
      247.                 e.printStackTrace();  
      248.             }  
      249.         }  
      250.     }  
      251. }  
  • 相关阅读:
    Docker和K8S
    CoBot 库博源代码缺陷检测工具
    Hobot软件成分分析平台
    Black duck(黑鸭子软件)开源代码审计管理测试平台
    python之理解super及MRO列表
    Python中MRO排序原理
    python中with的用法
    使用微服务架构重构支付网关
    支付网关的设计原则
    python内存管理--垃圾回收
  • 原文地址:https://www.cnblogs.com/zwb7926/p/3115611.html
Copyright © 2020-2023  润新知