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. }  
原文地址:https://www.cnblogs.com/zwb7926/p/3115611.html