版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Lucene 索引数据库(转载)关键词: Lucene 索引数据库 Lucen
2、e,作为一种全文搜索的辅助工具,为我们进行条件搜索,无论是像Google,Baidu之类的搜索引擎,还是论坛中的搜索功能,还 是其它C/S架构的搜索,都带来了极大的便利和比较高的效率。本文主要是利用Lucene对MS Sql Server 2000进行建立索引,然后进行全文索引。至于数据库的内容,可以是网页的内容,还是其它的。本文中数据库的内容是图书馆管理系统中的某个作者表 Authors表。因为考虑到篇幅的问题,所以该文不会讲的很详细,也不可能讲的很深。本文以这样的结构进行:1.介绍数据库中Authors表的结构2.为数据库建立索引3.为数据库建立查询功能4.在web界面下进行查询并显示结果
3、1介绍数据库中Authors表的结构字段名称 字段类型 字段含义Au_id Varchar(11) 作者号Au_name
4、 Varchar(60) 作者名Phone Char(12) 电话号码Address Varchar(40)
5、 地址City Varchar(20) 城市State Char(2) &
6、#160; 省份Zip Char(5) 邮编contract
7、 Bit(1) 外键(关系不大)表中的部分内容: 2为数据库建立索引首先建立一个类TestLucene.java。这个类就是对数据库进行建立索引,编写查询条件等。当然,最开始就是建立数据库连接。连接代码这里就省略了。_接着,新建一个方法getResutl(String),它返回的是数据库表Authors的内容。具体代码如下: public ResultSet
8、getResult(String sql) try Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); return rs;
9、0; catch(SQLException e) System.out.println(e); return null; 然后,为数据库建立索引。首先要定义一个IndexWriter(),它是将索引写进Lucene自己的数据库中,它存放的位置是有你自己定义的。在定义 IndexWriter是需要
10、指定它的分析器。Lucene自己自带有几个分析器,例 如:StandarAnalyzer(),SimpleAnalyzer(),StopAnalyzer()等。它作用是对文本进行分析,判断如何进行切 词。接着,要定义一个Document。Document相当于二维表中一行数据一样。Document里包含的是Field字段,Field相当于数据库中一列,也就是一个属性,一个字段。最后应该对IndexWriter进行优化,方法很简单,就是writer.optimize().具体代码如下: public void Index(ResultSet rs)
11、 try IndexWriter writer = new IndexWriter("d:/index/", getAnalyzer(), true); while(rs.next() Document doc=new Document(); &
12、#160; doc.add(Field.Keyword("id",rs.getString("au_id"); doc.add(Field.Text("name",rs.getString("au_name");
13、0; doc.add(Field.UnIndexed("address",rs.getString("address"); doc.add(Field.UnIndexed("phone",rs.getString("phone");
14、 doc.add(Field.Text("City",rs.getString("city"); writer.addDocument(doc); writer.optimize(); &
15、#160; writer.close(); catch(IOException e) System.out.println(e); catch(SQLException e) &
16、#160; System.out.println(e); public Analyzer getAnalyzer() return new StandardAnalyzer(); 3为数据库建立查询功能在类TestLucene中建立一个新的方法searcher(String),它返回的是一个搜索的结构集,相当于数据库中
17、的ResultSet一样。它代的参数是你要查询的内容。这里,我把要查询的字段写死了。你可以在添加一个参数表示要查询的字段。这里主要有两个对象IndexSearcher和Query。IndexSearcher是找到索引数据库,Query是处理搜索,它包含了三个参数:查询内容,查询字段,分析器。具体代码如下: public Hits seacher(String queryString) Hits hits=null; try
18、60; IndexSearcher is = new IndexSearcher("D:/index/"); Query query=QueryParser.parse(queryString,"City",getAnalyzer(); hits=is.search(query); catch(
19、Exception e) System.out.print(e); return hits; 4在web界面下进行查询并显示结果这里建立一个Jsp页面TestLucene.jsp进行搜索。在TestLucene.jsp页面中首先引入类<% page import="lucenetest.LucentTest"%>
20、<% page import="org.apache.lucene.search.*,org.apache.lucene.document.*" %> 然后定义一个LuceneTest对象,获取查询结果集: LucentTest lucent=new LucentTest(); Hits hits=lucent.seacher(request.getParameter("queryString"); 定义一个Form,建立一个查询环境:<form action="TestLucene
21、.jsp"> <input type="text" name="queryString"/> <input type="submit" value="搜索"/></form> 显示查询结果:<table> <%if(hits!=null)%> <tr> <td>作者号</td>
22、 <td>作者名</td> <td>地址</td> <td>电话号码</td> </tr> <% for(int i=0;i<hits.length();i+) Document doc=hits.doc(i); %> <tr> <td&g
23、t;<%=doc.get("id") %></td> <td><%=doc.get("name") %></td> <td><%=doc.get("address") %></td> <td><%=doc.get("phone") %></td> </tr>
24、; <% %></table>用 lucene 建立索引不可能每次都重新开始建立,而是按照新增加的记录,一次次的递增建立索引的IndexWriter类,有三个参数 IndexWriter writer = new IndexWriter(path, new StandardAnalyzer(),isEmpty);其中第三个参数是bool型的,指定它可以确定是增量索引,还是重建索引.对于从数据库中读取的记录,譬如要为文章建立索引,我们可以记录文章的id号,然后下次再次建立索引的时候读取存下的id号,从此id后往下继续增加索引,逻辑如下.建立增量索引,主要代码如下
25、public void createIndex(String path)Statement myStatement = null;String articleId="0"/读取文件,获得文章id号码,这里只存最后一篇索引的文章idtry FileReader fr = new FileReader("*.txt"); BufferedReader br = new BufferedReader(fr); articleId=br.readLine();if(articleId=null|articleId="") articleId=
26、"0" br.close(); fr.close(); catch (IOException e) System.out.println("error343!"); e.printStackTrace(); try /sql语句,根据id读取下面的内容 String sqlText = "*"+articleId; myStatement = conn.createStatement(); ResultSet rs = myStatement.executeQuery(sqlText);/写索引while (rs.next() Doc
27、ument doc = new Document();doc.add(Field.Keyword("*", DateAdded);doc.add(Field.Keyword("*", articleid);doc.add(Field.Text("*", URL);doc.add(Field.Text("*", Content);doc.add(Field.Text("*", Title);try writer.addDocument(doc); catch(IOException e) e.pr
28、intStackTrace();/将我索引的最后一篇文章的id写入文件try FileWriter fw = new FileWriter("*.txt");PrintWriter out = new PrintWriter(fw);out.close();fw.close(); catch (IOException e) e.printStackTrace(); ind.Close(); System.out.println("ok.end");catch (SQLException e) e.printStackTrace(); finally /数
29、据库关闭操作 然后控制是都建立增量索引的时候根据能否都到id值来设置IndexWriter的第三个参数为true 或者是falseboolean isEmpty = true;try FileReader fr = new FileReader("*.txt"); BufferedReader br = new BufferedReader(fr);if(br.readLine()!= null) isEmpty = false;br.close();fr.close(); catch (IOException e) e.printStackTrace(); writer
30、= new IndexWriter(Directory, new StandardAnalyzer(),isEmpty);<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSc
31、hema-instance" xsi:schemaLocation=" /schema/beans /schema/beans/spring-beans-2.5.xsd" default-lazy-init="true"> &
32、#160; <bean id="annotationConfiguration" class="pass.annotations.config.CompassAnnotationsConfiguration"> </bean>
33、0; <bean id="compass" class="pass.spring.LocalCompassBean"> <!- <property name="resourceDirectoryLocation
34、s"> <list> <value>classpath:com/oa</value> &
35、#160; </list> </property> -> &
36、#160; <property name="connection"> <value>/lucene/indexes</value> </property>
37、 <property name="classMappings"> <list>
38、160; <value>com.oa.model.Person</value> </list> </property>
39、0; <property name="compassConfiguration" ref="annotationConfiguration" />
40、 <property name="transactionManager" ref="transactionManager" /> <property name="compassSettings"> &
41、#160; <props> <!- 指定索引的路径 ->
42、 <prop key="compass.engine.connection">e:/compass</prop> <!- 指定分词器 ->
43、60; <prop key="compass.engine.analyzer.default.type">net.paoding.analysis.analyzer.PaodingAnalyzer</prop> <prop key=&q
44、uot;compass.transaction.factory"> pass.spring.transaction.SpringSyncTransactionFactory
45、 </prop> </props>
46、0; </property> </bean> <bean id="hibernateGpsDevice"
47、0; class="pass.gps.device.hibernate.HibernateGpsDevice"> <property name="name"> <value>hibernate
48、Device</value> </property> <property name="sessionFactory" ref="sessionFactory" />
49、60; <property name="mirrorDataChanges"> <value>true</value> </property> </bean&g
50、t; <!- 同步更新索引 通过compassGps-> <bean id="compassGps" class="pass.gps.impl.SingleCompassGps" init-method="start" destroy-method=&q
51、uot;stop"> <property name="compass" ref="compass" /> <property name="gpsDevices">
52、0; <list> <bean class="pass.spring.device.SpringSyncTransactionGpsDeviceWrapper"> <
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 液料等离子喷涂纳米氧化锆氧化钇涂层:结构剖析与性能洞察
- 湖南省衡阳市2026年七年级下学期期中考试数学试题附答案
- 涌泉穴药物贴敷治疗高血压的疗效探究与机制分析
- 网络游戏开发与运营手册
- 202年出租合同范本全集合同三篇
- 妊娠期胰腺炎的MRI诊断精准化应用
- 妊娠期结核病合并妊娠期胎儿生长限制的胎儿睾丸动脉血流监测
- 2026长春市中考英语知识点总结训练含答案
- 2026上海中考地理考前提分模拟卷含答案
- 2026牡丹江市中考英语知识点总结训练含答案
- 全国赛课一等奖人教版美术四年级下册《对称的美》课件
- 绿色食品山楂生产技术操作规程
- 近五年重庆中考英语试题及答案2023
- 采血健康知识讲座
- 很好用的融资租赁测算表(可编辑版)
- 桥梁定期检查-桥梁经常检查与定期检查概论
- 2023年机动车检测站管理评审资料
- 加工中心编程精解
- 企业所得税政策(西部大开发+地方税收优惠)课件
- 六维力传感器的原理与设计演示文稿
- 驾驶员从业资格证电子版
评论
0/150
提交评论