Solr是一个比较成熟和热门的搜索引擎解决方案,之前的博客也提到过。最近在学习搜索开发也查阅过solr的资料,相对elasticsearch来说资料更全,案例更多也更让人放心,我现在还没发做很细致的比较,但个人认为中小型搜索用solr可能会更合适,毕竟更成熟可靠一些。
介绍Solr的资料也有不少,比如书籍就有 Solr.3.Enterprise.Search.Server和Apache Solr 3.1 Cookbook。前者更适合完全搜索新手,如果你是对检索有一定了解,尤其是对lucene有了解的,我更推荐ApacheSolrRefGuide,这本书比较偏手册型,更适合开发者定位到问题。虽然目前solr已经到了4.0版本,不过很久旧版本的教程应该还是差不多可以对得上。
下面就列出一些我在学习过程中记录的一些要点:
1. 启动
1.1 jetty试用,
通过-D指定其他属性
cd example
java -Dsolr.solr.home=/some/dir -jar start.jar, -D
1.2 tomcat
1) 拷贝solr.war到$TOMCAT_HOME/webapps
2) 拷贝solr实例需要的配置目录(example/solr)至$SOLR_HOME
3) 在$TOMCAT_HOME/conf/Catalina/localhost下创建个solr.xml, 内容为,注意路径要自己写,别直接贴我这个上去用
<Context docBase="
YOUR_TOMCAT_HOME
/webapps/solr" debug="0" crossContext="true" >
<Environment name="solr/home" type="java.lang.String" value="YOUR_SOLR_HOME" override="true" />
</Context>
4) 启动tomcat 启动solr项目
2. 配置,
配置是非常重要的部分,例子给出比较全的配置项,但需要好好理解
每个collection都有一般性配置solrconfig.xml 和表配置schema.xml
2.1 schema.xml
types: 定义字段类型、怎么分词等
例如<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>以及: <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"><analyzer type="index"><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /><!-- in this example, we will only use synonyms at query time<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>--><filter class="solr.LowerCaseFilterFactory"/></analyzer><analyzer type="query"><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /><filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/><filter class="solr.LowerCaseFilterFactory"/></analyzer></fieldType>
fields: 表字段
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="sku" type="text_en_splitting_tight" indexed="true" stored="true" omitNorms="true"/>copyField: 用来标识字段不同的索引方式,或者多个字段联合索引
2.2 solrconfig.xml : collection核心配置<copyField source="cat" dest="text"/>
requestHandler: 分发Http request到不同Handler执行,包括search和update两部分
UpdateRequestProcessorChain: 定义一些列更新操作,之后在requestHandler的属性
<str name="update.chain">指定
highlighting: 高亮设定
主要参数:
searchComponent: 提供搜索的核心功能,主要包括检索、高亮、分组等
queryResponseWriter: 结果输出格式定义
2.3 solr.xml core admin配置
包括设置每个collection数据存放目录,admin路径;
通常可以在用户界面上操作并修改
必须保证至少有一个core,否则启动solr admin管理GUI会报错
3. 索引,索引其实就是为solr传入文档
默认支持XML JSON CSV格式,
4.0开始支持原子操作
add, set 和 inc,但如果文档指定id没有出现在索引里,会添加只有部分字段的文档,也就是upsert
可以去重(一般情况可能用不着):updaterequestChain中需要增设
<updateRequestProcessorChain name="dedupe">
<processor
class="org.apache.solr.update.processor.SignatureUpdateProcessorFactory">
</processor>
<processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>
并在handler中启用:<str name="update.chain">dedupe</str>
HTTP删除collection内的文档:
curl -XPOST http://localhost:8080/solr/collection1/update?commit=true
<delete><query>*:*</query></delete>
4. 搜索,拼接http url字符串来获取搜索结果
4.1 设置search的requestHandler和返回的responsewriter。
4.2 设置search的参数
q: 查询词。格式field:query
defType: 指定query parser
fq: 过滤器,类似SQL的where
qt: 指定Handler处理请求
start和rows: 分页功能
fl:输出字段列表
sort:排序
wt: 输出格式,需要在solrconfig.xml定义queryResponseWriter, 默认是xml
echoHandler和echoParams: 指定debug时候输出的信息
facet.*: 分组功能,详见:http://wiki.apache.org/solr/SimpleFacetParameters
mlt.*: moreLikeThis功能, 详见:http://wiki.apache.org/solr/MoreLikeThis
hl.*: 高亮功能,详见:http://wiki.apache.org/solr/HighlightingParameters
4.3 结果分组功能grouping:类似facet。
http://wiki.apache.org/solr/FieldCollapsing
4.4 join功能(暂缺)
5. queryparser
用于解析query语法,defType参数设置
standard和Dismax的区别:
Standard要求输入的查询内容符合SolrQuerySyntax查询语法,特殊字符要进行转义。如果不符合语法,会报错。Dismax查询就不会存在这样的问题,对于用户的输入始终都不会报错http://ericbao.blog.sohu.com/200652504.html
6 加载分词
6.1 IK分词
注意下载适合solr版本的ikanalyzer, 以tomcat版本为例
1. 将jar包放入{$tomcat}的webapps/
solr/WEB-INF/lib 下 ,
动态方法不需要重启solr实例:放在需要添加的collection目录的lib下, 目录自行新建。然后再solrconfig.xml加一行 <lib dir="./lib" />
2. 将IKAnalyzer.cfg.xml 和 需要的字典文件放在
{$tomcat}的webapps/
solr/WEB-INF/classes (
目录可能需新建
)
3. schema.xml中在fieldType 加入
<fieldType name="text" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
即可使用相应fieldType 的
在solr admin中可以在对应collection下进行测试。tomcat要注意uri的编码问题(在server.xml中 Connector中加入
URIEncoding="utf-8")
6.2 smartcn分词
jar包直接加入lib
7 solrj
JAVA API:主要就是把java对象拼装成Http字符串通过Httpclient来发送请求。
以上几点我认为使用solr需要注意的事项吧,有关更深入的学习笔记,会在之后陆续放出