solr学习笔记(一):入门

来源:互联网 发布:java基础做题网站 编辑:程序博客网 时间:2024/06/05 01:53

     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: 用来标识字段不同的索引方式,或者多个字段联合索引
<copyField source="cat" dest="text"/>
     2.2 solrconfig.xml : collection核心配置
        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.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需要注意的事项吧,有关更深入的学习笔记,会在之后陆续放出

原创粉丝点击