基于Java的全文索引引擎
lucene 基本概念

lucene 基本概念Lucene 基本概念Lucene 是一个开源的全文搜索引擎库,被广泛地应用于高性能搜索和索引任务中。
它是 Apache 软件基金会的一个开源项目,并且被许多知名的商业产品使用。
本文将通过一步一步的方式,来介绍 Lucene 的基本概念和其原理。
一、Lucene 是什么?Lucene 是一个基于 Java 的全文搜索引擎库。
它提供了一系列的 API 和工具,用于创建、维护和搜索大规模文本数据集。
通过将文本数据索引到 Lucene 的索引库中,我们可以快速地进行全文搜索、排序和过滤等操作。
二、Lucene 的基本原理1. 倒排索引倒排索引是 Lucene 的核心概念之一。
它是一种数据结构,用于从词项到文档的映射。
通常,我们将文本数据分割成单词,然后对每个词项构建一个索引条目,该条目指向包含该词项的文档。
例如,假设我们有三个文档:文档1 包含 "Lucene 是一个搜索引擎库",文档2 包含 "Apache Lucene 是一个全文搜索库",文档3 包含 "Lucene 是基于 Java 的"。
在倒排索引中,我们将按照词项构建索引,如下所示:词项文档Lucene 1, 2, 3是 1, 2, 3一个 1, 2, 3搜索引擎库 1全文搜索库 2基于 3Java 3倒排索引的优势在于它能够快速地确定包含特定词项的文档,并且支持更复杂的查询表达式。
2. 分词器分词器是将原始文本分割成词项的模块。
Lucene 提供了多种分词器,如标准分词器、简单分词器等。
分词器还可以根据具体的需求进行定制。
分词器在构建索引和搜索时起到关键作用,它们确保在索引和搜索阶段都使用相同的分词规则。
3. 文档和字段在 Lucene 中,文档是一个最小的索引单位。
它由多个字段组成,每个字段包含一个词项或多个词项。
字段可以是文本、数值或日期等不同类型。
Lucene 中的文档和字段的设计灵活,可以根据实际需求进行定义和修改。
javalucene用法

javalucene用法JavaLucene是一个用于全文检索的开源库,它提供了一个高效且可扩展的搜索引擎。
它基于Apache Lucene项目,并提供了Java编程语言的接口和实现。
使用JavaLucene,我们可以创建索引并搜索包括文本、数字、日期等数据类型的文档。
下面是一些常见的JavaLucene用法:1.创建索引:首先,我们需要创建一个用于存储索引的目录。
然后,我们可以使用IndexWriter类将文档添加到索引中。
每个文档包含一个或多个字段,我们可以指定字段的类型和分析方式。
分析器负责将文本分成单词,并对它们进行规范化和标准化,以便更好地进行搜索。
2.搜索:我们使用IndexSearcher类来执行搜索操作。
可以使用QueryParser类解析查询字符串,并将其转换为查询对象。
查询可以是简单的词语匹配、范围查询、模糊查询等。
搜索结果以文档的形式返回,我们可以根据需要对其进行排序、过滤等操作。
3.更新索引:如果需要对索引进行更新,例如添加新的文档或删除现有的文档,我们可以使用IndexWriter类来执行这些操作。
之后,我们需要使用IndexReader类来重新打开索引以获取最新的结果。
拓展:除了基本的索引和搜索功能,JavaLucene还提供了其他一些强大的功能:1.高级搜索:JavaLucene支持布尔搜索、通配符搜索、模糊搜索、模糊匹配、短语搜索等。
这些功能可以帮助我们更准确地定位所需的结果。
2.高亮显示:JavaLucene可以通过标记匹配结果中的关键词并进行高亮显示来改善用户体验。
这对于搜索结果的展示非常有帮助。
3.分布式搜索:JavaLucene可以与其他工具配合使用,如Apache Solr和Elasticsearch,进行分布式搜索。
这允许我们搭建具有高可用性和可扩展性的搜索引擎。
4.自定义扩展:JavaLucene允许用户通过实现自定义的分析器、查询解析器、评分算法等来扩展其功能。
Nutch爬虫

Nutch搜索引擎简介Nutch 是一个基于Java 实现的开源搜索引擎,其内部使用了高性能全文索引引擎工具Lucene。
从nutch0.8.0开始,Nutch 完全构建在Hadoop 分布式计算平台之上。
Hadoop 除了是一个分布式文件系统外,还实现了Google 的GFS 和MapReduce 算法。
因此基于Hadoop 的Nutch 搜索引擎可以部署在由成千上万计算机组成的大型集群上。
由于商业搜索引擎允许竞价排名,这样导致索引结果并不完全是和站点内容相关的,而Nutch 搜索结果能够给出一个公平的排序结果,这使得Nutch 在垂直搜索、档案互联网搜索等领域得到了广泛应用。
背景知识Nutch 搜索引擎是一个基于Java 的开放源代码的搜索引擎。
Nutch 搜索引擎处理流程包括抓取流程和搜索流程,如图1 所示。
相应地Nutch 也分为2部分,抓取器和搜索器。
在抓取流程中,抓取器也叫蜘蛛或者机器人,以广度优先搜索(BFS)的方式从企业内部网或者互联网抓取网页。
这个过程涉及到对CrawlDB 和LinkDB 数据库的操作。
然后Nutch 解析器开始解析诸如HTML、XML、RSS、PDF等不同格式的文档。
最后Nutch 索引器针对解析结果建立索引并存储到indexDB 和SegmentsDB 数据库中,以供搜索器搜索使用。
在搜索流程中,搜索应用使用输入关键词调用Nutch 搜索接口(Nutch Query Interface)。
应用可通过网页上的输入框输入相应关键词。
搜索接口解析搜索请求为Lucene 全文检索引擎可以识别的格式。
Nutch 索引器将会调用Lucene 引擎来响应请求在indexDB 上展开搜索。
最后搜索接口收集从索引器返回的URL、标题、锚和从SegmentsDB 返回的内容。
所有上述内容将被提供给排序算法进行排序。
排序完成后,搜索接口将返回命中的搜索结果。
由于构建在Hadoop 分布式文件系统之上,Nutch 对CrawlDB, LinkDB, SegmentsDB 和IndexDB 数据库的操作都是通过调用M/R(map/reduce) 函数完成的。
Lucene简介

在应用中加入全文检索功能——基于Java的全文索引引擎Lucene简介作者:车东 Email: /写于:2002/08 最后更新:09/09/2006 17:09:05Feed Back >> (Read this before you ask question)版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明/tech/lucene.html关键词:Lucene java full-text search engine Chinese word segment内容摘要:Lucene是一个基于Java的全文索引工具包。
1.基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史2.全文检索的实现:Luene全文索引和数据库索引的比较3.中文切分词机制简介:基于词库和自动切分词算法的比较4.具体的安装和使用简介:系统结构介绍和演示5.Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展6.从Lucene我们还可以学到什么基于Java的全文索引/检索引擎——LuceneLucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。
Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。
他贡献出的Lucene的目标是为各种中小型应用程序加入全文检索功能。
Lucene的发展历程:早先发布在作者自己的,后来发布在SourceForge,2001年年底成为APACHE基金会jakarta的一个子项目:/lucene/已经有很多Java项目都使用了Lucene作为其后台的全文索引引擎,比较著名的有:Jive:WEB论坛系统;∙Eyebrows:邮件列表HTML归档/浏览/查询系统,本文的主要参考文档“TheLucene search engine: Powerful, flexible, and free”作者就是EyeBrows系统的主要开发者之一,而EyeBrows已经成为目前APACHE项目的主要邮件列表归档系统。
lucene query语法

lucene query语法
Lucene是一个基于Java的全文搜索引擎库,支持对文本进行快速、准确的搜索和索引。
它的查询语法非常灵活,理解和掌握这些语法可以提高搜索结果的准确性和效率。
Lucene查询语法包括以下几个方面:
1. 基本查询:Lucene支持对单个词进行搜索,也可以对多个词进行组合搜索。
基本查询可以使用AND、OR、NOT等逻辑运算符。
2. 通配符查询:Lucene支持使用通配符“*”和“?”进行模糊搜索,这样可以找到相似的词语。
3. 短语查询:Lucene支持对短语进行搜索,可以通过将多个词语用双引号括起来来实现。
4. 模糊查询:Lucene支持对拼写错误的词语进行模糊搜索,可以通过在词语后面加上“~”和一个数字来实现。
5. 范围查询:Lucene支持对数值、日期等数据类型进行范围查询,可以通过在查询条件中加上“[ ]”来实现。
6. 正则表达式查询:Lucene支持使用正则表达式对文本进行搜索,可以通过在查询条件中使用“/”和“”来实现。
7. 模板查询:Lucene支持使用模板进行搜索,可以将搜索条件中的某些部分用变量替换掉。
了解和掌握Lucene查询语法可以帮助我们更好地利用这个搜索引擎库,实现更加准确和高效的搜索功能。
- 1 -。
基于Java的全文检索技术研究

p o p u l a r p r o g r a mmi n g l a n g u a g e J AVA f u l l - t e x t r e t r i e v a l s y s t e m c a n e f e c t i v e l y s o l v e t h e p r o b l e ms o f
。
7 6 。
( 总0 3 9 8 )
基于 j a v a的全文检索技术研究
2 0 1 3年第 5期
文章编号 : 1 0 0 3 — 5 8 5 0 ( 2 0 1 3) 0 5 - 0 0 7 6 — 0 3
基于 J a v a的全文检索技术研究
雷燕瑞
( 海南软件职业技术学 院, 海南 琼海 5 7 1 4 0 0)
i fo n r ma t i o n s y s t e m. T h e f i r s t ,t h i s p a p e r a n a l y z e d e f f e c t i v e l y t h r o u g h t h e p i r n c i p l e o f t h e L u c e n e a r c h i t e c t u r e ,t h e n b a s e d o n t h e d e s i g n o f f u l l t e x t r e t r i e v a l s y s t e m  ̄ a me wo r k ,f i n a l l y g i v e s t h e r e t r i e v a l mo d u l e r e a l i z a t i o n ,a n d g i v e s p a r t o f t h e c o d e .Ha v e a p o s i t i v e r o l e i n p r o mo t i n g t h e i n f o ma r t i o n
基于Java技术的搜索引擎基本组成和数据结构探究

19 O
储 存结 构
~
…
l ~
一
转 化 为文 档 标 识 号D c D o I 的对 照表 桶 内的单词 时 ,该页面文 档 的标识
到 的索 引结构 做一 分析 。
( )文档 索 引库 一
文 件 。 它 是 将 相 应 的 文 档 标 识 号 号 D c D 被存 储 到 该存 储桶 中, )搜 索引擎 的工作 流程 二
旦 用 户 在 搜 索 引 擎 中键 入
搜 索 引擎 的工作 流程 可 以概括 关键 词 并提 交查询 命 令后 ,搜 索引 为 以下4 步骤 : 个 ‘
集 到页 面存储 库 中。
2 、索 引 器对 收 集 回来 存 放 在
擎会 瞬 间返 回搜 索结 果 。然 而 为 了
( )搜 索引擎 的基 本组 成 一
搜 索 引擎主 的组 成可 以分为三 库 中找 到符合 该 关键 词 的所有 相 关 理 大型文 件 ( i f l s 系 统 。这里 B g ie ) 个 部 分 : 由 网络蜘 蛛 ( e s i e / 网页 。接 着 是所 有相 关 网页 比对 该 的大 型文 件 (i f s 指 的是跨 多 W b p d r B g ie ) l C a l r 、索 引器 ( n e e ) 检 关键 词 的相关 信 息并综 合 相关 信息 文件 系统 的虚 拟文 件 ,并可 支持 6 rw e) Id x r 和 4 索 器 (e r h r , 以下分 别加 以介 和 网页级 别形 成相 关度 数值 ,最 后 位 寻址方 式 。大型 文件 ( i f s S ae e) B g ie ) l
绍和 分析 。
es的工作原理

es的工作原理ES(Elasticsearch)是一个开源的全文搜索引擎,它采用Java语言编写,基于Lucene库构建。
ES的工作原理可以总结为以下几个关键步骤。
1. 数据存储与索引ES使用倒排索引的数据结构来存储和管理文档。
在索引过程中,ES 会将文档中的每个字段进行分析和标记化处理,然后将这些标记化的词汇与文档的ID进行关联,构建倒排索引。
倒排索引可以快速地定位到包含特定词汇的文档。
2. 分布式架构ES采用分布式架构,可以在多台服务器上存储和处理大规模的数据。
它使用主分片和副本分片的方式来提高系统的可用性和性能。
主分片负责处理索引和搜索请求,而副本分片则用于数据冗余和负载均衡。
3. 索引与搜索当用户向ES发送索引请求时,ES会将文档进行解析和标准化处理,并将其存储到相应的分片中。
ES使用倒排索引来加速搜索过程,它可以快速地定位到包含特定词汇的文档,并返回相关的搜索结果。
ES支持丰富的搜索功能,例如全文搜索、模糊搜索、范围搜索等。
4. 分布式检索与聚合ES的分布式检索能力使得它可以在多个分片上并行地执行搜索请求,并将结果进行合并。
这种并行化的方式可以大幅提升搜索的效率和响应速度。
此外,ES还支持聚合操作,可以对搜索结果进行统计、分组和排序等操作,以满足各种复杂的分析需求。
5. 实时更新与批量处理ES支持实时更新数据,当用户对文档进行增删改操作时,ES会将这些变更立即应用到相应的分片中。
同时,ES还提供了批量处理功能,可以一次性地处理大量的文档更新请求,从而提高系统的吞吐量和性能。
6. 高可用性与容错性ES通过主分片和副本分片的机制来提高系统的可用性和容错性。
当主分片发生故障时,ES会自动将副本分片提升为主分片,从而保证系统的正常运行。
此外,ES还提供了分片的自动均衡和故障转移功能,可以自动调整分片在集群中的分布,以避免数据倾斜和单点故障。
总结起来,ES的工作原理包括数据存储与索引、分布式架构、索引与搜索、分布式检索与聚合、实时更新与批量处理、高可用性与容错性等关键步骤。
基于Java的Luncene的compass框架说明使用技术文档

Compass技术文档目录一、原理描述:.................................................................................................................................二、术语解释:.................................................................................................................................三、下载地址:.................................................................................................................................四、使用流程: …………………………………………………………………………………….五、基于SSH的compass的实例: …………………………………………………………………一、原理描述:Compass是一流的开放源码JAVA搜索引擎框架,对于你的应用修饰,搜索引擎语义更具有能力。
依靠顶级的Lucene搜索引擎,Compass 结合了,像Hibernate和Spring的流行的框架,为你的应用提供了从数据模型和数据源同步改变的搜索力.并且添加了2方面的特征,事物管理和快速更新优化.Compass的目标是:把java应用简单集成到搜索引擎中.编码更少,查找数据更便捷.二、术语解释:三、下载地址:四、使用流程:五、基于SSH的compass的实例:step1在ssh2的基础上开发加入jar包(compass-2.1.2.jar compass-index-patch.jarlucene-analyzers-2.4.0.jar lucene-core-2.4.0.jar lucene-highlighter-2.4.0.jar paoding-analysis.jar)step2先来看下实体bean的编写Java代码1.package com.v512.example.model;2.import pass.annotations.*;3./**4. * Product entity.5. *6. * @author MyEclipse Persistence Tools7. */8.@Searchable9.public class Product implements java.io.Serializable {10.11. // Fields13. @SearchableId14. private String id;15. @SearchableProperty(name="name",index=Index.ANALYZED,store=Store.YES)16. private String name;17. @SearchableProperty(name="price",index=Index.NOT_ANALYZED,store=Store.YES)18. private Double price;19. @SearchableProperty(name="brand",index=Index.ANALYZED,store=Store.YES)20. private String brand;21. @SearchableProperty(name="description",index=Index.ANALYZED,store=Store.YES)22. private String description;23.24. // Constructors25.26. /** default constructor */27. public Product() {28. }29.30. /** full constructor */31. public Product(String name, Double price, String brand, String description) {32. = name;33. this.price = price;34. this.brand = brand;35. this.description = description;36. }37.38. // Property accessors39.40. public String getId() {41. return this.id;42. }43.44. public void setId(String id) {45. this.id = id;46. }47.48. public String getName() {49. return ;50. }52. public void setName(String name) {53. = name;54. }55.56. public Double getPrice() {57. return this.price;58. }59.60. public void setPrice(Double price) {61. this.price = price;62. }63.64. public String getBrand() {65. return this.brand;66. }67.68. public void setBrand(String brand) {69. this.brand = brand;70. }71.72. public String getDescription() {73. return this.description;74. }75.76. public void setDescription(String description) {77. this.description = description;78. }79.80.}step3属性文件Product.hbm.xmlJava代码1.<?xml version="1.0" encoding="utf-8"?>2.<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"3."/hibernate-mapping-3.0.dtd">4.<!--5. Mapping file autogenerated by MyEclipse Persistence Tools6.-->7.<hibernate-mapping>8. <class name="com.v512.example.model.Product" table="PRODUCT" >9. <id name="id" type="ng.String">10. <column name="ID" length="40" />11. <generator class="uuid.hex" />12. </id>13. <property name="name" type="ng.String">14. <column name="NAME" length="80" />15. </property>16. <property name="price" type="ng.Double">17. <column name="PRICE" precision="6" />18. </property>19. <property name="brand" type="ng.String">20. <column name="BRAND" length="40" />21. </property>22. <property name="description" type="ng.String">23. <column name="DESCRIPTION" length="2000" />24. </property>25. </class>26.</hibernate-mapping>要使用Compass必须加入一个applicationContext-compass.xml文件,文件名可以自行定义这个就不用说了废话step4applicationContext-compass.xml:Java代码1.<?xml version="1.0" encoding="UTF-8"?>2.3.<beans xmlns="/schema/beans"4. xmlns:xsi="/2001/XMLSchema-instance"5. xsi:schemaLocation=" /schema/beans /schema/beans/spring-beans -2.5.xsd"6. default-lazy-init="true">7.8. <!-- 配置compass的注解功能 -->9. <bean id="annotationConfiguration"10. class="passAnnotationsConfiguration">11. </bean>12.13.14. <bean id="compass" class="pass.spring.LocalCompassBean">15. <!-- 配置需要索引的实体映射文件的路径 -->16. <property name="resourceDirectoryLocations">17. <list>18. <value>classpath:com/v512/example/model</value>19. </list>20. </property>21. <!-- 设置存放索引的路径 -->22. <property name="connection">23. <value>/lucene/indexes</value>24. </property>25.26. <!--配置要搜索的类,作用:会根据以下的类建立索引 -->27. <property name="classMappings">28. <list>29. <value>com.v512.example.model.Product</value>30. </list>31. </property>32. <property name="compassConfiguration"33. ref="annotationConfiguration" />34.35. <!--compass的一些属性设置 -->36. <property name="compassSettings">37. <props>38. <prop key="compass.transaction.factory">39. pass.spring.transaction.SpringSyncTransactionFactory40. </prop>41. <prop key="compass.engine.analyzer.MMAnalyzer.CustomAnalyzer">net.paoding.analysis.analyzer.PaodingAnalyzer </prop>42. </props>43. </property>44. <!--compass的事务管理器 -->45. <property name="transactionManager" ref="transactionManager" />46. </bean>47.48.49. <bean id="hibernateGpsDevice"50. class="pass.gps.device.hibernate.HibernateGpsDevice">51. <property name="name">52. <value>hibernateDevice</value>53. </property>54. <property name="sessionFactory" ref="sessionFactory" />55. <property name="mirrorDataChanges">56. <value>true</value>57. </property>58. </bean>59. <!-- 同步更新索引 -->60. <bean id="compassGps" class="pass.gps.impl.SingleCompassGps"61. init-method="start" destroy-method="stop">62. <property name="compass" ref="compass" />63. <property name="gpsDevices">64. <list>65. <bean66. class="pass.spring.device.SpringSyncTransactionGpsDeviceWrapper">67. <property name="gpsDevice" ref="hibernateGpsDevice" />68. </bean>69. </list>70. </property>71. </bean>72.73.74. <bean id="compassTemplate"75. class="passTemplate">76. <property name="compass" ref="compass" />77. </bean>78.79. <!-- 定时重建索引(利用quartz)或随Spring ApplicationContext启动而重建索引 -->80. <bean id="compassIndexBuilder"81. class="passIndexBuilder"82. lazy-init="false">83. <property name="compassGps" ref="compassGps" />84. <property name="buildIndex" value="true" />85. <property name="lazyTime" value="10" />86. </bean>87.88.89.90.</beans>中间都有注解就不多解释了下面来编写dao及dao的实现以及severce层step5Java代码1.package com.v512.example.dao;2.3.import java.util.List;4.5.import com.v512.example.model.Product;6.7.public interface ProductDao {8. public void create(Product p);9. public Product getProduct(String id);10. public List getProducts();11. public void update(Product product);12. public void remove(String id);13.14.}Java代码1.package com.v512.example.dao.hibernate;2.3.import java.util.List;4.5.import com.v512.example.dao.ProductDao;6.import com.v512.example.model.Product;7.import org.springframework.orm.hibernate3.support.HibernateDaoSupport;8.public class ProductDaoHibernate extends HibernateDaoSupport implements ProductDao {9.10. public void create(Product p) {11. getHibernateTemplate().save(p);12.13. }14.15. public Product getProduct(String id) {16. return (Product)getHibernateTemplate().get(Product.class, id);17. }18.19. public List getProducts() {20. return getHibernateTemplate().find("from Product order by id desc");21. }22.23. public void remove(String id) {24. getHibernateTemplate().delete(getProduct(id));25.26. }27.28. public void update(Product product) {29. getHibernateTemplate().saveOrUpdate(product);30.31. }32.33.}serveceJava代码1.package com.v512.example.service;2.3.import java.util.List;4.5.import com.v512.example.model.Product;6.7.public interface ProductManager {8. public void insertProduct(Product p);9. public Product findProdcut(String id);10. public List searchProducts(String queryString);11.12.13.}servece的实现Java代码1.package com.v512.example.service.impl;2.3.import java.util.ArrayList;4.import java.util.List;5.6.import passHits;7.import passSession;8.import passTemplate;9.import passTransaction;10.11.import com.v512.example.dao.ProductDao;12.import com.v512.example.model.Product;13.import com.v512.example.service.ProductManager;14.import pass;15.public class ProductManagerImpl implements ProductManager {16. private ProductDao productDao;17. private CompassTemplate compassTemplate;18.19.20.21.22. public void setCompassTemplate(CompassTemplate compassTemplate){23. passTemplate=compassTemplate;24. }25.26. public void setProductDao(ProductDao productDao){27. this.productDao=productDao;28. }29.30. public Product findProdcut(String id) {31. return productDao.getProduct(id);32. }33.34. public void insertProduct(Product p) {35. productDao.create(p);36. }37.38. public List searchProducts(String queryString) {39. Compass compass = compassTemplate.getCompass();40. CompassSession session=compass.openSession();41. List list = new ArrayList();42. //这里不需要开启事务了,因为在调用这个方法之前就已经开启了事务43. CompassHits hits= session.queryBuilder().queryString("name:"+queryString).toQuery().hits();44. System.out.println("queryString:"+queryString);45. System.out.println("hits:"+hits.getLength());46. for(int i=0;i<hits.length();i++){47. Product hit=(Product)hits.data(i);48. list.add(hit);49. }50.51. return list;52. }53.54.55.56. public CompassTemplate getCompassTemplate() {57. return compassTemplate;58. }59.60.}所有的都做完了现在编写jsp页面step6insertProduct.jspJava代码1.<%@ page language="java" contentType="text/html; charset=UTF-8"2. pageEncoding="UTF-8"%>3.<%@ taglib prefix="s" uri="/struts-tags"%>4.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""/TR/html4/loose.dtd">5.<html>6.<head>7.<meta http-equiv="Content-Type" content="text/html; charset=utf-8">8.<link href="style/oa.css" rel="stylesheet" type="text/css"> 9.10.<title>添加信息</title>11.</head>12.<body>13.<center>14. <s:form action="insert.action" theme="simple">15.16.<TABLE class="tableEdit" border="0" cellspacing="1" cellpadding="0" style="width:300px;">17. <TBODY>18. <TR>19. <td align="center" class="tdEditTitle">添加商品名称</TD>20. </TR>21. <TR>22. <td>23.24.25.<table class="tableEdit" style="width:300px;" cellspacing="0" border="0" cellpadding="0">26. <tr>27. <td class="tdEditLabel" >商品名称</td>28. <td class="tdEditContent"><s:textfield name="product.name" label="名称" /></td>29. </tr>30.31. <tr>32. <td class="tdEditLabel" >商品品牌</td>33. <td class="tdEditContent"><s:textfield name="product.brand" label="品牌" /></td>34. </tr>35.36. <tr>37. <td class="tdEditLabel" >商品价格</td>38. <td class="tdEditContent"><s:textfield name="product.price" label="价格" /></td>39. </tr>40.41. <tr>42. <td class="tdEditLabel" >商品描述</td>43. <td class="tdEditContent"><s:textarea name="product.description" label="描述" />44. </td>45. </tr>46. <tr>47. <td> 48. </td>49. <td><s:submit/>50. <br></td>51. </tr>52.</table>53. </td>54. </TR>55. </TBODY>56.</TABLE>57.</s:form>58.</center>59.</body>60.</html>step7编写actionJava代码1.package com.v512.example.action;2.3.import java.util.List;4.5.import com.opensymphony.xwork2.ActionSupport;6.import com.v512.example.model.Product;7.import com.v512.example.service.ProductManager;8.import org.apache.struts2.ServletActionContext;9.10.public class ProductAction extends ActionSupport {11.12. private static final long serialVersionUID = 3795048906805728732L;13. private ProductManager productManager;14. private Product product;15. private String queryString;16.17. public void setQueryString(String queryString){18. this.queryString=queryString;19. }20.21. public Product getProduct() {22. return product;23. }24.25. public void setProduct(Product product) {26. this.product = product;27. }28.29. public void setProductManager(ProductManager productManager){30. this.productManager=productManager;31. }32.33. public String insert(){34. productManager.insertProduct(product);35. return SUCCESS;36. }37. public String search(){38. List results=productManager.searchProducts(queryString);39. System.out.println(results.size());40. ServletActionContext.getRequest().setAttribute("searchresults", results);41. return SUCCESS;42. }43.44.45.}step8关于Struts2的配置文件如下Java代码1.<?xml version="1.0" encoding="UTF-8" ?>2.<!DOCTYPE struts PUBLIC3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"4. "/dtds/struts-2.0.dtd">5.6.<struts>7. <constant name="struts.objectFactory" value="spring" />8.9. <include file="struts-default.xml"/>10.11. <package name="product" extends="struts-default"12. namespace="/product">13.14. <!-- 配置Struts2的Action,class值要与applicationContext*.xml中的id的值一致。
对基于Java的全文检索工具包lucene的索引研究

关 键 词 Jv aa
中图 分类 号
L cn ue e
倒排 索 5 索 引 机制 I
文献 标识 码 B
索 引 文件
索 引性 能
T 31 .6 P 15
文章 编 号 :0 2 2 2 2 0 0 _ o 5 0 1 0 — 4 2( 0 7) 2 o 4 - 2
维普资讯
27 0 年4月 0
电 脑 学 习
第2 期
对基于Jv 的全文检索工具包 lcn 的索引研究 aa uee
陆 云’
摘 要 详 细 介 绍 了 L cn ue e的倒 排 索 引原 理 。 识 了 索 引 机 制 架构 和典 型 的 索 5 文件 操 作 。 如 何 提 高 索 引的 性 能 进 行 认 I 对
文 章 号” 。文 章 1 2经 过 倒 排 后 变 成 : ,
关 键 词 文 章 号
gaghu 1 un zo h e
i
L en 是 一 个 基 于 Jv 的 全 文 检 索 工 具 包 , uee u ee aa L en
使用 的是倒排文件索 引结构 。我们通过 一个简单 的例 子来 认 识一 下该 结构。 ( )设有两篇 文章 1和 2 文章 1的内容为 :o ie 1 : Tm l s v
处理 。
图1 显示 了 L en 的索 引机 制的架构 。 uee
② 文章中的 o Qn o i ,Un e o等词没有 什么实 际意 义, n t
中文 中的 的 是 等字通常也无具 体含义 , 这些不代 表概念 的词可 以过滤掉 。标 点符 号也滤掉 。
⑨ 所有单 词需要统一大小写。 ④ 用户通 常希望 查” v le 时,需要把 i s,l e 原 i le” i d还 v v
基于Java开源框架SSHC的图书文献全文检索系统的研究与开发

19科技创新导报 Science and Technology Innovation Herald I T 技 术1 引言C/S模式的软件,客户端需要安装专用的软件才能和服务器通信,只适用于局域网,需要针对不同的操作系统开发不同版本的软件,产品更新换代快、维护代价高、执行效率低。
对于拥有上百万馆藏资源的高校图书馆,读者检索数据,必须要到图书馆利用检索机才可以,这在当今互联网时代,这已经不能满足读者想随时随地通过网络快速得到检索数据的需求。
B/S模式是随着Internet技术的兴起迅速发展,能实现不同用户从不同地点,以不同的接入方式访问服务器,能有效地保护数据平台和访问权限,大大简化了客户端电脑载荷,减轻了系统维护与升级的成本。
全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统,需要具备建立索引和提供查询的能力。
功能上,全文检索系统核心具有建立索引、处理查询返回结果集、增加索引、优化索引结构等功能。
结构上,全文检索系统核心具有索引引擎、查询引擎、文本分析引擎、对外接口等,加上各种外围应用系统等共同构成了全文检索系统。
2 全文检索引擎Lucene [1]是一个开放源代码的全文检索引擎工具包,具有索引文件格式独立于应用平台的特点。
在实际全文检索中,建立索引,要么是定期遍历数据库,调用索引建立程序模块将里面的数据转为索引,要么是每次更新数据的时候,调用索引建立程序模块将里面的数据转为索引,两种方式的共同缺点是频繁更新索引数据将使对硬盘的操作影响巨大。
Compass是对Lucene的封装,其扩展了事务索引、搜索引擎抽象、对象关系映射、事务管理、不同的映射技术在数据库存储索引的功能。
Compass [2]的模块主要如图1所示。
Compass提供了以下两种途径来完成事务管理代码简化操作。
(1)CompassTemplate,它使用流行的设计模式来抽象事务管理。
(2)与Spring事务管理器集成,可以在一个存在的事务中执行。
Solr的应用场景分析

Solr的应用场景分析Solr是一个基于Java的搜索引擎,被广泛应用于Web搜索、文档管理、电商等各种应用场景。
本文将从Solr的特性入手,探讨其主要应用场景及其优势。
一、高效搜索引擎Solr的核心特性是高效搜索引擎,它能够处理大量的数据,并且具有快速的搜索速度。
因此,Solr适用于大型网站、Web应用程序以及企业级应用程序等各种情况下的搜索引擎。
1、电子商务在电子商务行业,Solr可以帮助电商网站提供快速、精准的搜索体验,减少用户的等待时间,促进转化率。
Solr具有高效的搜索速度以及高质量的搜索结果,可以根据用户的搜索需求,实现智能联想、拼写检查等搜索辅助功能,提高用户体验。
另外,Solr还支持基于地理位置的搜索,比如可以按照用户所在地域,展示用户附近的产品信息,大大提升用户的便利性。
2、企业应用程序在企业应用程序中,Solr也经常被用作搜索引擎,能够搜索企业内存储的各种数据,例如产品信息、客户、工程文件等。
Solr提供了高度灵活的搜索体验,用户可以通过各种搜索参数,实现快速、准确地检索所需的数据。
二、文档管理系统Solr不仅仅是一个搜索引擎,同时也是一个强大的文档管理系统,支持各种数据格式的索引和搜索。
因此,Solr可以被广泛应用于文档管理系统,帮助用户快速准确的检索所需文件。
1、数字资料库Solr可以作为数字资料库的一部分,能够实现全文检索和查询,而不仅仅是简单的关键字检索。
数字资料库包括了各种类型的文件,例如PDF文件、Microsoft Office文件、HTML文件等,Solr可以基于这些文件的内容建立索引,并实现快速准确的搜索功能。
2、知识管理系统Solr可以作为一个知识管理系统的组件,帮助企业组织内部的知识库。
当员工需要查询某种信息时,Solr可以搜索企业内多种数据源的内容,并返回相关的结果。
此外,Solr还具有自动标记、选取等功能,能够帮助企业快速实现知识共享,提高工作效率。
9个基于Java的搜索引擎框架

官方网站:/
4、实时分布式搜索引擎 Solandra
Solandra 是一个实时的分布式搜索引擎,基于 Apache Solr 和 Apache Cassandra 构建。
其特性如下:
支持Solr的大多数默认特性 (search, faceting, highlights)
1、Java 全文搜索引擎框架 Lucene
毫无疑问,Lucene是目前最受欢迎的Java全文搜索框架,准确地说,它是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene为开发人员提供了相当完整的工具包,可以非常方便地实现强大的全文检索功能。下面有几款搜索引擎框架也是基于Lucene实现的。
官方网站:/lire/
9、全文本搜索引擎 Egothor
Egothor是一个用Java编写的开源而高效的全文本搜索引擎。借助Java的跨平台特性,Egothor能应用于任何环境的应用,既可配置为单独的搜索引擎,又能用于你的应用作为全文检索之用。
数据复制,分片,缓存及压缩这些都由Cassandra来进行
Multi-master (任意结点都可供读写)
实时性高,写操作完成即可读到
Easily add new SolrCores w/o restart across the cluster 轻松添加及重启结点
官方网站:https:///tjake/Solandra
5、IndexTank
IndexTank是一套基于Java的索引-实时全文搜索引擎实现,IndexTank有以下几个特点:
索引更新实时生效
地理位置搜索
支持多种客户端语言
Ruby, Rails, Python, Java, PHP, .NET & more!
使用Apache Lucene进行全文检索和信息检索

使用Apache Lucene进行全文检索和信息检索随着数据量的日益增长,信息的获取和管理也变得越来越困难。
在这样的背景下,全文检索技术备受关注。
全文检索是指通过对文本内容进行扫描和分析,快速地查找出包含指定关键字或短语的文本,以满足用户的需求。
Apache Lucene是一款强大的全文检索引擎,具有高效、可靠、易于扩展等特点,广泛被运用于信息检索、文本分类、数据挖掘等领域。
一、Lucene的基本原理Lucene是一款基于Java语言的全文检索引擎,能够快速地在海量数据中查找指定的文本。
Lucene的检索原理可以简单地描述为:将需要检索的文本输入Lucene,Lucene建立索引文件,用户查询文本时,Lucene在索引文件中查找匹配结果,返回用户所需的信息。
Lucene的基本原理如下:1. 建立索引建立索引是Lucene进行全文检索的第一步。
在索引过程中,Lucene会对文本进行解析、分词、词语过滤等处理,然后将这些处理后的词语和其所在的文档信息存储到索引文件中。
通过如此的操作,Lucene做到了在指定时间内,快速地查找指定文本。
2. 查询当用户输入需要检索的文本时,Lucene会对该文本进行同样的预处理,得到其中的每个单独词语,并在索引文件中查找与该词语相匹配的文档。
Lucene采用了先搜索后排名的检索策略,即先找到与关键词匹配的文档,然后再通过算法对得到的结果进行排序,得出匹配度最高的文档。
3. 返回结果Lucene的返回结果是一个文档对象,其中包含了原始文本、关键词匹配的位置和得分等信息。
在大多数情况下,返回的文档对象并不是用户真正想要的结果,需要进行二次过滤和排序,才能得出目标结果。
二、Lucene的基本使用Lucene的使用可以简单地分为以下几个步骤:1. 创建索引创建索引是Lucene进行全文检索的第一步,也是最重要的一步。
在创建索引前,需要准备好需要检索的文本文件。
Lucene支持的文本格式包括txt、doc、pdf等。
manticoresearch java用法

manticoresearch java用法Manticore Search是一个基于Java的开源全文搜索引擎,它提供了强大的搜索功能和灵活的API,可以轻松地集成到各种Java应用程序中。
以下是Manticore Search的一些Java用法示例:1. 创建索引要使用Manticore Search,首先需要创建一个索引。
索引是一个存储文档集合的数据库,可以用于后续的搜索查询。
以下是一个创建索引的示例:```javaimport org.manticore.api.Manticore;import org.manticore.api.ManticoreBuilder;public class CreateIndexExample {public static void main(String[] args) {// 创建Manticore实例Manticore manticore = new ManticoreBuilder().build();// 创建索引String indexName = "my_index";manticore.init(indexName, "my_index_config.xml");// 添加文档到索引addDocumentsToIndex(manticore);// 关闭Manticore实例manticore.shutdown();}}```2. 添加文档到索引要向索引中添加文档,可以使用以下代码:```javaimport org.manticore.api.Manticore;import org.manticore.api.document.Document;import org.manticore.api.document.DocumentBuilder; import org.manticore.api.search.SearchResult;import org.manticore.api.search.query.Query;import org.manticore.api.search.result.SearchResponse; import org.manticore.search.SearchException;import org.manticore.search.node.S;import org.manticore.search.query.Conjuction;import org.manticore.search.query.explanationtextgenerator; import org.manticore.search.querybuilder.*;import org.manticore.search.resultiterator;import org.manticore.search.resultiterator.*;import java.io.*;import java.util.*;import static java.nio.charset.*;public class AddDocumentsToIndexExample {public static void main(String[] args) {// 创建Manticore实例和索引名称String indexName = "my_index";Manticore manticore = new ManticoreBuilder().build();manticore.init(indexName, "my_index_config.xml");// 创建文档并添加到索引中Document document = new DocumentBuilder().createDocument("id1", "This is the first document.");try {manticore.addDocument(document);} catch (IOException e) {e.printStackTrace();} catch (SearchException e) {e.printStackTrace();} finally {manticore.shutdown();}}}```3. 搜索查询要执行搜索查询,可以使用以下代码:```javaimport org.manticore.*;import org.manticore.*;import org.manticore.*;import org.*;import static org.*;import static org.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*;import java.*; 1422195744340,0,21,22,34,40,52,64,76,88,100,112,124,136,148,160,17 2,184,196,208,220,232,244,256,268,280,292,304,316,328,340,352,364,3 76,388,400,412,424,436,448,460,472。
Java全文搜索引擎工具包

}
for (int i = offset; i < offset + maxLength; i++) {
SearchBean bean = new SearchBean();
Document doc = searcher.doc(hits.scoreDocs[i].doc);
bean.setSummary(bean.getSummary().replace(queryString, "<span style='color:#d90a00;font-weight: bold;'>"
+ queryString + "</span>"));
}
queryString = queryString.trim();
String[] keys = queryString.split(" ");
if (keys != null && keys.length > 0) {
for (String curKey : keys) {
searchList.add(bean);
}
} else {
searchList = null;
}
}
3.将数据库中的信息按我需要的形式添加到索引中去
Document doc = new Document();
String brandName = "";//取得品牌信息
String typeName = "";//取得类别信息
用java编写搜索引擎

1.1.1 准备工作环境(10分钟)2009-10-29 10:02 罗刚 电子工业出版社 我要评论()摘要:《自己动手写搜索引擎》第1章遍历搜索引擎技术,本章从快速实现基本的搜索入手,然后深入展开分析搜索的基本技术。
本节为大家介绍准备工作环境(10分钟)。
标签:搜索引擎自己动手写搜索引擎Oracle帮您准确洞察各个物流环节第1章 遍历搜索引擎技术搜索引擎是我们每天上网经常使用的功能,本书介绍的搜索技术需要Java编程语言基础。
本章从快速实现基本的搜索入手,然后深入展开分析搜索的基本技术。
1.1 30分钟实现的搜索引擎首先从一个简单的搜索引擎入手,实现一个简单的指定目录文件的搜索引擎。
实现之前需要读者具有Java开发方面的基础知识。
1.1.1 准备工作环境(10分钟)首先要准备一个Java的开发环境。
当前可以使用JDK 1.6。
JDK 1.6可以从Sun的官方网站下载得到。
使用默认方式安装即可。
然后要使用的是一个用来管理搜索引擎索引库的jar包,叫做Lucene。
目前可以从下载到最新的Lucene,当前的版本是2.3。
另外,使用集成开发环境Eclipse,其开发界面如图1-1所示。
(点击查看大图)图1-1 J ava开发界面如果需要用Web界面搜索,还要下载Tomcat,当前可以从下载到,推荐使用Tomcat 5.5以上的版本。
然后增加Tomcat的内存使用量,防止内存溢出。
文件,增加行: 如果是在Linux下,可以用vi编辑器修改./catalina.sh1.JAVA_OPTS=-Xmx600m文件,增加行: 如果是在Windows下,可以用文本编辑器"记事本"修改./catalina.bat1.set JAVA_OPTS=-Xmx600m【作者提示】如果不增加内存使用量,运行时可能会出现ng.OutOfMemoryError 异常。
1.1.2 编写代码(15分钟)2009-10-29 10:02 罗刚 电子工业出版社 我要评论()摘要:《自己动手写搜索引擎》第1章遍历搜索引擎技术,本章从快速实现基本的搜索入手,然后深入展开分析搜索的基本技术。
全文搜索引擎有哪些

全文搜索引擎有哪些引言全文搜索引擎是一种用于根据关键词在大规模文本数据中检索相关信息的工具。
它可以帮助用户快速地找到所需的文档、文章、网页等内容,是现代信息检索领域的关键技术之一。
全文搜索引擎在互联网搜索、企业文档管理等领域发挥着重要的作用。
本文将介绍几种常见的全文搜索引擎及其特点。
全文搜索引擎的定义及应用场景全文搜索引擎是一种检索系统,可以根据关键词在大规模文本数据中进行快速搜索。
它通过对文本进行分词、索引等操作,建立起一个高效的关键词-文档倒排索引,用户可以通过输入关键词来获取相关的文档。
全文搜索引擎已经广泛应用于互联网搜索、企业文档管理、电子图书馆等领域。
全文搜索引擎的特点是快速、精确和高可靠性。
它采用先进的索引技术和搜索算法,能够在海量数据中快速找到相关的文档,大大提高了用户的检索效率。
此外,全文搜索引擎还支持高度定制化的搜索功能,用户可以根据自己的需求进行过滤、排序等操作。
全文搜索引擎的分类根据全文搜索引擎的架构和实现方式,可以将其分为两种类型:基于关系数据库的搜索引擎和基于倒排索引的搜索引擎。
基于关系数据库的搜索引擎是利用关系数据库的索引和查询机制来实现全文搜索。
它将文本数据存储在关系数据库中,并使用数据库的索引机制进行搜索。
这种全文搜索引擎具有较高的可靠性和易用性,但在处理大规模数据时性能较低。
基于倒排索引的搜索引擎是一种目前较为主流的全文搜索引擎实现方式。
它通过对文本进行分词、建立倒排索引等操作,将文本数据存储在倒排索引中,并利用倒排索引进行搜索。
这种全文搜索引擎具有较高的搜索速度和灵活性,在处理大规模数据时性能较好。
常见的全文搜索引擎下面将介绍几种常见的全文搜索引擎及其特点:1. Elasticsearch:Elasticsearch是一种基于Lucene的开源搜索引擎。
它具有横向扩展能力强、高性能、分布式、可靠性高等特点。
Elasticsearch支持全文搜索、分布式实时分析等功能,广泛应用于企业搜索、日志分析、产品推荐等领域。
lucene 正则表达式

lucene 正则表达式全文共四篇示例,供读者参考第一篇示例:Lucene 是一个开源的全文检索引擎库,它提供了丰富的搜索功能,可以帮助开发者构建高效的搜索系统。
在Lucene 中,正则表达式是一种强大的模式匹配技术,可以帮助用户更灵活地搜索文本信息。
本文将介绍Lucene 中正则表达式的基本用法和高级应用。
一、Lucene 中正则表达式的基本使用1. 创建正则表达式查询器在Lucene 中,我们可以使用正则表达式查询器来创建一个基于正则表达式的搜索查询。
我们可以使用如下代码创建一个简单的正则表达式查询器:```Query query = new RegexpQuery(new Term("content", "lucene.*"));```上述代码中,使用RegexpQuery 类创建了一个基于正则表达式"lucene.*" 的查询器,用来匹配包含以"lucene" 开头的字符串。
我们可以通过这种方式创建不同的正则表达式查询器,以实现更加灵活的搜索功能。
2. 正则表达式的语法在Lucene 中,正则表达式的语法和标准的正则表达式语法基本保持一致,可以使用一些常见的元字符和量词来进行模式匹配。
下表列举了一些常见的正则表达式语法元字符及其含义:| 元字符| 说明|| ------ | ---------------------------- || . | 匹配任意一个字符|| * | 匹配前一个字符零次或多次|| + | 匹配前一个字符一次或多次|| ? | 匹配前一个字符零次或一次|| [] | 匹配括号中的任意一个字符|| ^ | 匹配字符串的开头|| | 匹配字符串的结尾|| | | 或操作符,匹配两者之一|通过合理地运用这些元字符和量词,我们可以构建出复杂的正则表达式模式,实现精确的文本匹配。
在Lucene 中,正则表达式查询的性能往往会受到影响,尤其是在处理大数据集时。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在应用中加入全文检索功能——基于Java的全文索引引擎Lucene简介作者:车东 Email: /写于:2002/08 最后更新:09/09/2006 17:09:05Feed Back >> (Read this before you ask question)版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明/tech/lucene.html关键词:Lucene java full-text search engine Chinese word segment内容摘要:Lucene是一个基于Java的全文索引工具包。
1.基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史2.全文检索的实现:Luene全文索引和数据库索引的比较3.中文切分词机制简介:基于词库和自动切分词算法的比较4.具体的安装和使用简介:系统结构介绍和演示5.Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展6.从Lucene我们还可以学到什么基于Java的全文索引/检索引擎——LuceneLucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。
Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。
他贡献出的Lucene的目标是为各种中小型应用程序加入全文检索功能。
Lucene的发展历程:早先发布在作者自己的,后来发布在SourceForge,2001年年底成为APACHE基金会jakarta的一个子项目:/lucene/已经有很多Java项目都使用了Lucene作为其后台的全文索引引擎,比较著名的有:Jive:WEB论坛系统;∙Eyebrows:邮件列表HTML归档/浏览/查询系统,本文的主要参考文档“TheLucene search engine: Powerful, flexible, and free”作者就是EyeBrows系统的主要开发者之一,而EyeBrows已经成为目前APACHE项目的主要邮件列表归档系统。
∙Cocoon:基于XML的web发布框架,全文检索部分使用了Lucene∙Eclipse:基于Java的开放开发平台,帮助部分的全文索引使用了Lucene对于中文用户来说,最关心的问题是其是否支持中文的全文检索。
但通过后面对于Lucene的结构的介绍,你会了解到由于Lucene良好架构设计,对中文的支持只需对其语言词法分析接口进行扩展就能实现对中文检索的支持。
全文检索的实现机制Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到Lucene的存储结构/接口中。
总体上看:可以先把Lucene当成一个支持全文索引的数据库系统。
比较一下Lucene和数据库:全文检索≠ like "%keyword%"通常比较厚的书籍后面常常附关键词索引表(比如:北京:12, 34页,上海:3,77页……),它能够帮助读者比较快地找到相关内容的页码。
而数据库索引能够大大提高查询的速度原理也是一样,想像一下通过书后面的索引查找的速度要比一页一页地翻内容高多少倍……而索引之所以效率高,另外一个原因是它是排好序的。
对于检索系统来说核心是一个排序问题。
由于数据库索引不是为全文索引设计的,因此,使用like "%keyword%"时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,LIKE对性能的危害是极大的。
如果是需要对多个关键词进行模糊匹配:like"%keyword1%" and like "%keyword2%" ...其效率也就可想而知了。
所以建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外一个排好序的关键词列表,用于存储关键词==>文章映射关系,利用这样的映射关系索引:[关键词==>出现关键词的文章编号,出现次数(甚至包括位置:起始偏移量,结束偏移量),出现频率],检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合的过程。
从而大大提高了多关键词查询的效率,所以,全文检索问题归结到最后是一个排序问题。
由此可以看出模糊查询相对数据库的精确查询是一个非常不确定的问题,这也是大部分数据库对全文检索支持有限的原因。
Lucene最核心的特征是通过特殊的索引结构实现了传统数据库不擅长的全文索引机制,并提供了扩展接口,以方便针对不同应用的定制。
可以通过一下表格对比一下数据库的模糊查询:全文检索和数据库应用最大的不同在于:让最相关的头100条结果满足98%以上用户的需求Lucene的创新之处:大部分的搜索(数据库)引擎都是用B树结构来维护索引,索引的更新会导致大量的IO操作,Lucene在实现中,对此稍微有所改进:不是维护一个索引文件,而是在扩展索引的时候不断创建新的索引文件,然后定期的把这些新的小索引文件合并到原先的大索引中(针对不同的更新策略,批次的大小可以调整),这样在不影响检索的效率的前提下,提高了索引的效率。
Lucene和其他一些全文检索系统/应用的比较:关于亚洲语言的的切分词问题(Word Segment)对于中文来说,全文索引首先还要解决一个语言分析的问题,对于英文来说,语句中单词之间是天然通过空格分开的,但亚洲语言的中日韩文语句中的字是一个字挨一个,所有,首先要把语句中按“词”进行索引的话,这个词如何切分出来就是一个很大的问题。
首先,肯定不能用单个字符作(si-gram)为索引单元,否则查“上海”时,不能让含有“海上”也匹配。
但一句话:“北京天安门”,计算机如何按照中文的语言习惯进行切分呢?“北京天安门” 还是“北京天安门”?让计算机能够按照语言习惯进行切分,往往需要机器有一个比较丰富的词库才能够比较准确的识别出语句中的单词。
另外一个解决的办法是采用自动切分算法:将单词按照2元语法(bigram)方式切分出来,比如:"北京天安门" ==> "北京京天天安安门"。
这样,在查询的时候,无论是查询"北京" 还是查询"天安门",将查询词组按同样的规则进行切分:"北京","天安安门",多个关键词之间按与"and"的关系组合,同样能够正确地映射到相应的索引中。
这种方式对于其他亚洲语言:韩文,日文都是通用的。
基于自动切分的最大优点是没有词表维护成本,实现简单,缺点是索引效率低,但对于中小型应用来说,基于2元语法的切分还是够用的。
基于2元切分后的索引一般大小和源文件差不多,而对于英文,索引文件一般只有原文件的30%-40%不同,目前比较大的搜索引擎的语言分析算法一般是基于以上2个机制的结合。
关于中文的语言分析算法,大家可以在Google查关键词"wordsegment search"能找到更多相关的资料。
安装和使用下载:/lucene/注意:Lucene中的一些比较复杂的词法分析是用JavaCC生成的(JavaCC:JavaCompilerCompiler,纯Java 的词法分析生成器),所以如果从源代码编译或需要修改其中的QueryParser、定制自己的词法分析器,还需要从https:///下载javacc。
lucene的组成结构:对于外部应用来说索引模块(index)和检索模块(search)是主要的外部应用入口简单的例子演示一下Lucene的使用方法:索引过程:从命令行读取文件名(多个),将文件分路径(path字段)和内容(body 字段)2个字段进行存储,并对内容进行全文索引:索引的单位是Document对象,每个Document对象包含多个字段Field对象,针对不同的字段属性和数据输出//使用方法:: IndexFiles [索引输出目录] [索引的文件列表] ...public static void main(String[] args) throws Exception {String indexPath = args[0];IndexWriter writer;//用指定的语言分析器构造一个新的写索引器(第3个参数表示是否为追加索引)writer = new IndexWriter(indexPath, new SimpleAnalyzer(), false);for (int i=1; i<args.length; i++) {System.out.println("Indexing file " + args[i]);InputStream is = new FileInputStream(args[i]);//构造包含2个字段Field的Document对象//一个是路径path字段,不索引,只存储//一个是内容body字段,进行全文索引,并存储Document doc = new Document();doc.add(Field.UnIndexed("path", args[i]));doc.add(Field.Text("body", (Reader) new InputStreamReader(is))); //将文档写入索引writer.addDocument(doc);is.close();};//关闭写索引器writer.close();}}索引过程中可以看到:∙语言分析器提供了抽象的接口,因此语言分析(Analyser)是可以定制的,虽然lucene缺省提供了2个比较通用的分析器SimpleAnalyser和StandardAnalyser,这2个分析器缺省都不支持中文,所以要加入对中文语言的切分规则,需要修改这2个分析器。
∙Lucene并没有规定数据源的格式,而只提供了一个通用的结构(Document 对象)来接受索引的输入,因此输入的数据源可以是:数据库,WORD文档,PDF文档,HTML文档……只要能够设计相应的解析转换器将数据源构造成成Docuement对象即可进行索引。