今天给大家介绍的是关于分布式存储的一个工具,Lucene,在Java里面是非常常见的一个框架,在Csharp中,也有移植版的Lucene.Net,都这么火了,快来认识认识吧。
1、什么时Lucene?
是一个全文搜索框架,而不是应用产品,他只是一种工具让你能实现某些产品,并不像www.baidu.com拿来就能用
是apache组织的一个用java实现的全文搜索引擎的开源项目
2、Luncen的工作方式?
提供的服务实际包含两部分:一入一出
入:写入,即将你提供的数据源写入索引
出:读出,向用户提供全文搜索服务,让用户可以通过关键词定位源
3、写入流程
数据源首先经过analyzer处理,包括:分词,分成一个个单词
将数据源中需要的信息加入Document的各个Field中,并把需要索引的字段按照分词的顺序索引起来,把需要存储的Field存储起来。
将索引写入存储器,存储器可以是内存或磁盘
4、读出流程
用户提供搜索关键词,经过analyzer处理。
对处理后的关键词搜索索引找出对应的Document。
用户根据需要从找到的Document中提取需要的Field。
5、Lucene专业术语
Lucene 其实很简单的,它最主要就是做两件事:建立索引和进行搜索
来看一些在lucene中使用的术语,这里并不打算作详细的介绍,只是点一下而已----因为这一个世界有一种好东西,叫搜索。
IndexWriter:lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。
Analyzer:分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。
Directory:索引存放的位置;lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory和RAMDirectory两个类。
Document:文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。
Field:字段。
IndexSearcher:是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具;
Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。
QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。
Hits:在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的。
6、Lucene注意事项
索引不能太大,要不然效率会很低,大于1G的时候必须考虑公布索引问题
不建议用多线程来建索引,产生的互锁问题很麻烦,经常发现索引被lock,无法重新建议的情况
中文分词是个大问题,目前免费的分词效果都很差。如果有能力还是自己实现一个分词模块,用最短路径的切分方法,网上有教材和demo源码,可以参考。
建增量索引的时候很耗cpu,在访问量大的时候会导致cpu的idle为0
默认的评分机制不太合理,需要根据自己的业务定制
整体来说lucene要用好不容易,必须在上述方面扩充他的功能,才能作为一个商用的搜索引擎。
国外优秀的ElasticSearch使用案例
GitHub
GitHub使用ElasticSearch搜索20TB的数据,包括13亿的文件和1300亿行代码
GitHub在2013年1月升级了他们的代码搜索,由solr转为ElasticSearch,目前集群规模为26个索引存储节点+8个客户端节点(负责处理搜索请求)
Mozilla
Mozilla公司以火狐著名,它目前使用WarOnOrange这个项目来进行单元或功能测试,测试结果以json方式索引到ElasticSearch中,开发人员可以非常方便的查找Bug
Sony
Sony公司使用ElasticSearch作为信息搜索引擎