老牌全文搜索引擎 Solr

介绍

Solr是一个Java开发的基于Lucene的 企业级 开源 全文搜索 平台。
它采用的是反向索引,即从关键字到文档的映射过程。
Solr的资源以Document为对象进行存储,每一个文档由一系列的 Field 构成,每一个Field 表示资源的一个属性。
文档的Field能够被索引, 以提工高性能的搜索效率。
通常状况下文档都包含一个能惟一表示该文档的id字段。


应用场景

如某房屋租赁站点的租房频道, 其房屋搜索功能可经过Solr来实现,每条租房信息就是solr中的一篇文档。
solr能够基于编译好的全文索引, 提供高性能的标签筛选租房信息,甚至是自定义关键字的高效搜索,查询结果的统计效率也极好。


全文搜索引擎比较

1. Sphinx  相较于solr,与数据库整合较好,操做更简单,性能更好。 可是须要商业受权。
2. Lucene  底层的索引程序 Java类库。
3. Solr  基于lucene,相较于Sphinx,更成熟完善,实时索引,扩展性好,支持特性多,对中文分词支持更好。在稳定的前提下, 业界用Solr的最多。
4. Elasticsearch  基于lucene,较之于solr有更好的分布式支持。
java


Solr优势

1. 相较于Mysql有更好的文本搜索性能
2. 高效、灵活的缓存功能
3. 高亮显示搜索结果
4. 基于Solr的查询完全杜绝了在Mysql中存在的sql注入安全问题
5. 基于Solr的facet特性提供标签聚合统计功能,实现商品在不一样筛选标签下的计数统计,进而能人性化的将产品数目为0的筛选标签灰化,一样的功能在mysql中则难以实现
6. 提供基于Web的管理界面


安装

#新版本的solr 5.x不依赖于tomcat,可独立运行服务,只需安装java环境

#安装jdk
sudo yum install java-1.7.0-openjdk

#官网下载solr发行版
wget http://www.us.apache.org/dist/lucene/solr/5.3.1/solr-5.3.1.tgz
tar -zxvf solr-5.3.1.tgz

#配置环境变量
sudo vim /etc/profile
#追加一行
export PATH=PATH:solr安装目录/bin
#加载配置文件
. /etc/profile
#测试solr是否能正常运行
solr status  #回显No Solr nodes are running.说明solr安装成功

#若是从便于管理的角度, 能够把solr注册为service
solr安装目录/bin/install_solr_service.sh


服务管理

## 启动solr服务,运行一个solr实例
solr start  #启动solr为独立模式 standalone (core) 
或者
solr start -cloud  #启动solr为云模式 SolrCloud mode (collection)

## solr服务状态
solr status

## solr服务启动后,咱们能够在当前solr实例下建立core
## 之后的文档索引处理都将基于一个core来进行
solr create -c corename  #独立模式将建立core,云模式将建立collection



## solr自带了几个参考实例(每一个实例预置了若干core),能够经过以下方式运行实例
solr -e exampleName
#exampleName包括
cloud        : SolrCloud example
dih          : Data Import Handler (rdbms, mail, rss, tika)
schemaless   : Schema-less example (schema is inferred from data during indexing)
techproducts : Kitchen sink example providing comprehensive examples of Solr features



数据处理


数据导入

    数据导入前须要配置schema和solrconfig, 而后能够按稍后的任意方法推送数据到solr中
node

############################################ Schema配置 ###############################################
Schema的意义相似于关系数据库中的表结构,它描述了solr中文档的字段结构、字段类型等
其中主要包含field, uniqueKey, fieldType的定义
咱们在 server/solr/bbs/conf 目录下,建立schema.xml,来描述Schema


定义field(描述solr文档中每一个字段的特性):
<field name="" type=""  indexed="true" stored="true" required="true" />
属性:
    name     字段名称(必选字段)
    type     字段类型(必选字段), 可选类型定义在当前schema.xml的一系列fieldType节点中
    indexed  该字段是否要被索引,从而字段可进行搜索和排序
    stored   该字段是否存储,仍是仅建索引, true时查询结果可返回该字段值。若是该字段仅用于搜索不须要查询结果,建议设false提升性能    
    required 该字段是否必选
    default  该字段默认值
    multiValued    若字段包含多个值须要设为true    
    docValues      若字段有文档值则须要true,在faceting, grouping, sorting and function queries时有用,通常能加速索引的载入
    omitNorms      true时将忽略字段规范,可解除字段长度一致性限制,提高该字段的索引时间,节省内存
    termVectors    是否存储该字段的词向量,若是字段作MoreLikeThis的类似性查询,则应设true来提高性能。高亮功能依赖此项
    termPositions  是否存储词向量的位置信息,这会增长存储成本。高亮功能依赖此项
    termOffsets    是否存储词向量的位偏移信息,这会增长存储成本。高亮功能依赖此项


定义uniqueKey(指定惟一标识文档的字段):
常见为: <uniqueKey>id</uniqueKey>


定义fieldType:    
描述了solr文档字段的可用类型, 通常有:string, boolean, int, float, long, date ...
例如: <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
fieldType除了传统类型,亦可定义中文分词器引入的字段类型


############################################ solrconfig配置 ###############################################
solrconfig是solr的配置文件,它描述了solr的索引存储路径,请求处理器(/query、/export等)及缓存策略等
文件位于: server/solr/corename/conf/solrconfig.xml:

    

    这里介绍两类经常使用的导入数据方法,其余方法请参考官方手册
mysql

    方法1:Post命令接口 - 推送格式化文件数据到Solr中
web

post -c corename files|directories  #支持json、xml、csv、excel、word、pdf等等格式的文件

例如推送xml格式为例的一篇文档:
post -c corename exam.xml

## exam.xml
<add>
    <doc>
	<field name="id">SOLR1000</field>
	<field name="name">汤臣一品</field>
	<field name="city">上海</field>
	<field name="country">中国</field>
	<field name="desc">牛逼哄哄的高端住宅</field>
	<field name="date">2010-01-17T00:00:00.000Z</field>
    </doc>
</add>


    方法2:DIH(DataImportHandler)方法 - 导入其余数据源的数据到Solr中sql

    DIH包含多种导入类型:shell

        1.从DB导入
数据库

        2.从RSS导入
apache

        3.从IMAP邮件服务导入
django

        4.从其余solr core拷贝
json

        5.经过Tika集成从其余格式文档如HTML, PDF, Doc导入

    更多细节可参考solr自带dih样例

    这里介绍DIH中的MysqlDB导入类型

安装java-mysql链接驱动:
sudo yum install mysql-connector-java
cp mysql-connector-java.jar server/solr-webapp/webapp/WEB_INF/lib/


拷贝 dist/solr-dataimporthandler-5.3.1.jar 到 server/solr-webapp/webapp/WEB_INF/lib/


修改solr配置文件 server/solr/corename/conf/solrconfig.xml:
添加:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> 
    <lst name="defaults"> 
        <str name="config">data-config.xml</str> 
    </lst> 
</requestHandler>
还要添加:
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-\d.*\.jar"/> (在 regex="solr-cell-\d.*\.jar" 以前添加 )


建立data-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>  
	<dataSource type="JdbcDataSource"
				driver="com.mysql.jdbc.Driver"
				url="jdbc:mysql://localhost/django_blog"
				user="root"
				password=""/>  
	<document name="blog">  
		<entity name="blog_blog" pk="id"
				query="select id,title,content from blog_blog"
				deltaImportQuery="select id,title,content from blog_blog where ID='${dataimporter.delta.id}'" 
				deltaQuery="select id  from blog_blog where add_time > '${dataimporter.last_index_time}'"  
				deletedPkQuery="select id  from blog_blog where id=0">  
				<field column="id" name="id" />  
				<field column="title" name="title" />  
				<field column="content" name="content"/>  
		</entity>  
	</document> 
</dataConfig>

## data-config.xml说明:
query 用于初次导入到索引的sql语句。
      若数据表中的数据量很是大,不能一次索引完,则分批完成。查询语句query设置两个参数:${dataimporter.request.length} ${dataimporter.request.offset}
      query=”select id,title,content from blog_blog limit ${dataimporter.request.length} offset ${dataimporter.request.offset}”
      请求:http://localhost:8983/solr/collection2/dataimport?command=full-import&commit=true&clean=false&offset=0&length=10000
deltaImportQuery  根据ID取得须要进入的索引的单条数据。
deltaQuery        用于增量索引的sql语句,用于取得须要增量索引的ID。
deletedPkQuery    用于取出须要从索引中删除文档的的ID


#########################################################################


数据查询

基于http的get请求
可用参数:
q      #搜索关键字
fl     #指定返回字段
wt     #指定返回格式
index  #是否缩进
sort   #指定排序字段,默认按score倒序
hl     #指定高亮字段, 用法:hl=true&hl.fl=filedName

例子:
 ask &indent=true


#########################################################################


数据更新

Solr数据更新只需导入id相同的文档便可。
solr会根据文档的id字段惟一标识文档,若是导入的文档的id已经存在solr中,那么这份文档就被最新导入的同id的文档自动替换。


#########################################################################


数据删除

post -c corename "<delete><id>SOLR1000</id></delete>"  #删除指定id文档
post -c corename "<delete><query>city:上海</query></delete>"  #搜索删除查询匹配文档
post -c corename "<delete><query>city:上海 AND country:中国</query></delete>"  #搜索删除多个条件的查询匹配文档
post -c corename "<delete><query>*:*</query></delete>"  #清空solr文档



层面浏览 Facet

Facet特性提供了对某一字段下的标签进行聚合统计的功能



集成中文分词IK Analyzer





后台管理

服务启动后咱们便能访问管理界面了,地址栏输入:
ip:8983 #ip为solr服务所在主机ip


管理界面 - Overview菜单

    截图以下:

    功能简介:

numDocs:当前系统中的文档数量,可能大于推送的文件个数,由于一个推送文件可能包含多个文档(即多个<doc>标签)
maxDoc:可能比numDocs的值要大,由于solr中的一次更新操做也会致使maxDoc增大
deletedDocs:文档的更新也会致使deltedDocs的值也会加1




管理界面 - query菜单

    截图下:


    功能简介:

q输入框:
指定搜索语法,如搜索city字段为上海的文档, 语法为 city:上海
相关文章
相关标签/搜索