lucene---QueryParser用法示例

Java代码    收藏代码
  1. package demo.first;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Date;  
  5.   
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  7. import org.apache.lucene.document.Document;  
  8. import org.apache.lucene.document.Field;  
  9. import org.apache.lucene.index.CorruptIndexException;  
  10. import org.apache.lucene.index.IndexWriter;  
  11. import org.apache.lucene.queryParser.QueryParser;  
  12. import org.apache.lucene.search.Hits;  
  13. import org.apache.lucene.search.IndexSearcher;  
  14. import org.apache.lucene.search.Query;  
  15. import org.apache.lucene.search.Searcher;  
  16. import org.apache.lucene.store.LockObtainFailedException;  
  17.   
  18. public class TestQueryParser {  
  19.   
  20.     public static void main(String[] args) throws CorruptIndexException, IOException {  
  21.         String path = "D://workspace//fwk//lucenedemo//firstLuceneIndex";  
  22.         TestQueryParser tqp = new TestQueryParser();  
  23.         tqp.createIndex(path);  
  24.         Searcher search = tqp.getSearcher(path);  
  25.         System.out.println("#_2");  
  26.         tqp.testTime(search, tqp.getQueryParser2());  
  27.         System.out.println("#_1");  
  28.         tqp.testTime(search, tqp.getQueryParser1());  
  29.         System.out.println("#_3");  
  30.         tqp.testTime(search, tqp.getQueryParser3());  
  31.         System.out.println("#_4");  
  32.         tqp.testTime(search, tqp.getQueryParser4());  
  33.         System.out.println("#_5");  
  34.         tqp.testTime(search, tqp.getQueryParser5());  
  35.         System.out.println("#_6");  
  36.         tqp.testTime(search, tqp.getQueryParser6());  
  37.         System.out.println("#_7");  
  38.         tqp.testTime(search, tqp.getQueryParser7());  
  39.     }  
  40.       
  41.     public void testTime(Searcher search,Query query) throws IOException{  
  42.         Date start = new Date();  
  43.         Hits hits = search.search(query);  
  44.         for (int i = 0; i < hits.length(); i++) {  
  45.             System.out.println(hits.id(i));  
  46.             System.out.println(hits.doc(i));  
  47.             System.out.println(hits.score(i));  
  48.         }  
  49.           
  50.         System.out.println("本次搜索用时:" + ((new Date()).getTime() - start.getTime()) + "毫秒");  
  51.           
  52.     }  
  53.       
  54.     public Searcher getSearcher(String path) throws CorruptIndexException, IOException{  
  55.             return new IndexSearcher(path);  
  56.     }  
  57.       
  58.     public Query getQueryParser1(){  
  59.         //默认搜索字段  
  60.         QueryParser queryParser = new QueryParser("content"new StandardAnalyzer());  
  61.         try {  
  62.             return queryParser.parse("搜索 - 擎");  
  63.         } catch (Exception e) {  
  64.             e.printStackTrace();  
  65.         }  
  66.         return null;  
  67.     }  
  68.       
  69.     public Query getQueryParser2(){  
  70.         QueryParser queryParser = new QueryParser("content"new StandardAnalyzer());  
  71.         try {  
  72.             return queryParser.parse("欢迎");  
  73.         } catch (Exception e) {  
  74.             e.printStackTrace();  
  75.         }  
  76.         return null;  
  77.     }  
  78.       
  79.     public Query getQueryParser3(){  
  80.         QueryParser queryParser = new QueryParser("content"new StandardAnalyzer());  
  81.         try {  
  82.             return queryParser.parse("搜索 and 擎");  
  83.         } catch (Exception e) {  
  84.             e.printStackTrace();  
  85.         }  
  86.         return null;  
  87.     }  
  88.       
  89.     public Query getQueryParser4(){  
  90.         QueryParser queryParser = new QueryParser("content"new StandardAnalyzer());  
  91.         try {  
  92.             //content字段搜索 索引   title字段搜寻 你好  
  93.             return queryParser.parse("索引 title:你好");  
  94.         } catch (Exception e) {  
  95.             e.printStackTrace();  
  96.         }  
  97.         return null;  
  98.     }  
  99.       
  100.     public Query getQueryParser5(){  
  101.         QueryParser queryParser = new QueryParser("content"new StandardAnalyzer());  
  102.         //允许使用正则表达式方式  
  103.         queryParser.setAllowLeadingWildcard(true);  
  104.         try {  
  105.             return queryParser.parse("*索*");  
  106.         } catch (Exception e) {  
  107.             e.printStackTrace();  
  108.         }  
  109.         return null;  
  110.     }  
  111.     /** 
  112.      * 采用标准分词器StandardAnalyzer会在创建索引的时候把存入的英文全部换成小写放在索引中 查询的时候也会将查询的关键词转为小写进行查询 
  113.      * @return 
  114.      */  
  115.     public Query getQueryParser6(){  
  116.         QueryParser queryParser = new QueryParser("testCapital"new StandardAnalyzer());  
  117.         try {  
  118.             return queryParser.parse("hellOwangzi");  
  119.         } catch (Exception e) {  
  120.             e.printStackTrace();  
  121.         }  
  122.         return null;  
  123.     }  
  124.       
  125.     /** 
  126.      * 采用标准分词器StandardAnalyzer会在创建索引的时候把存入的and or等关键字过滤掉 所以在查询的时候怎么也查不到 
  127.      * @return 
  128.      */  
  129.     public Query getQueryParser7(){  
  130.         QueryParser queryParser = new QueryParser("testAndOr"new StandardAnalyzer());  
  131.         try {  
  132.             //return queryParser.parse("and");  
  133.             return queryParser.parse("test");  
  134.         } catch (Exception e) {  
  135.             e.printStackTrace();  
  136.         }  
  137.         return null;  
  138.     }  
  139.     /** 
  140.      * 创建索引 
  141.      * @param path 
  142.      */  
  143.     public void createIndex(String path){  
  144.         try {  
  145.             IndexWriter writer = new IndexWriter(path,new StandardAnalyzer(),true);  
  146.             Document docA = new Document();  
  147.             //相当于数据库中列的概念,因此第一个参数是列名,第二个参数是列的值,最后两个参数是enum类型的(JDK1.5),对创建的索引的设置  
  148.             //Field.Store 是否覆盖原来的索引文件,而不是重新建一个  
  149.             Field fieldA = new Field("content","搜索引擎",Field.Store.YES,Field.Index.TOKENIZED);  
  150.             //我们把列(fieldA)加到某一行(docA)中  
  151.             docA.add(fieldA);  
  152.               
  153.             docA.add(new Field("title","你好中国",Field.Store.YES,Field.Index.TOKENIZED));  
  154.             docA.add(new Field("content","欢迎你llying",Field.Store.YES,Field.Index.TOKENIZED));  
  155.             docA.add(new Field("lastModifyTime","2008-9-17",Field.Store.YES,Field.Index.TOKENIZED));  
  156.             docA.add(new Field("testCapital","HelloWangzi",Field.Store.YES,Field.Index.TOKENIZED));  
  157.             docA.add(new Field("testAndOr","test and",Field.Store.YES,Field.Index.TOKENIZED));  
  158.               
  159.             Document docB = new Document();  
  160.             //相当于数据库中列的概念,因此第一个参数是列名,第二个参数是列的值,最后两个参数是enum类型的(JDK1.5),对创建的索引的设置  
  161.             Field fieldB = new Field("content","创建索引",Field.Store.YES,Field.Index.TOKENIZED);  
  162.             //我们把列(fieldA)加到某一行(docA)中  
  163.             docB.add(fieldB);  
  164.             docB.add(new Field("title","你好世界",Field.Store.YES,Field.Index.TOKENIZED));  
  165.             docB.add(new Field("content","欢迎加入jee高级开发群46176507",Field.Store.YES,Field.Index.TOKENIZED));  
  166.             docB.add(new Field("lastModifyTime","2008-9-6",Field.Store.YES,Field.Index.TOKENIZED));  
  167.             docB.add(new Field("testCapital","hellowangZi",Field.Store.YES,Field.Index.TOKENIZED));  
  168.             docB.add(new Field("testAndOr","test or",Field.Store.YES,Field.Index.TOKENIZED));  
  169.               
  170.             writer.addDocument(docA);  
  171.             writer.addDocument(docB);  
  172.               
  173.             //如果对海量数据进行创建索引的时候,需要对索引进行优化,以便提高速度  
  174.             writer.optimize();  
  175.               
  176.             //跟数据库类似,打开一个连接,使用完后,要关闭它  
  177.             writer.close();  
  178.         } catch (CorruptIndexException e) {  
  179.             e.printStackTrace();  
  180.         } catch (LockObtainFailedException e) {  
  181.             e.printStackTrace();  
  182.         } catch (IOException e) {  
  183.             e.printStackTrace();  
  184.         }  
  185.     }  
  186.   
  187. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值