solr的基本应用

一、Solr的特性:
    Apache Solr是一个开源的搜索服务器,使用java语言开发,主要基于http和Apache Lucene实现。定制solr索引的方法就是用psot方法向solr服务器发送一个描述所有Field及其内容的xml文档就行了,solr开始支持从数据库(通过JDBC)、RSS提要、Web页面和文件中导入数据,但是不直接支持从二进制文件中读取内容(pdf,MS office)。更重要的是,Solr创建的索引与Lucene搜索引擎库完全兼容。

二、Solr服务器原理:
    Solr对外提供标准的http接口来实现对数据的索引的增加、删除、修改、查询。Solr的工作流程大概是这样的:用户通过向部署在servlet容器中的Solr Web应用程序发送http请求来启动索引和搜索。solr接受请求,确定要使用适当的SolrRequestHandler,然后处理请求。通过HTTP以同样的方式返回相应。默认配置返回solr的标准XML相应,也可以配置Solr的备用相应格式。

三、Solr的分词配置:
    solr的缺省的中文分词方案可以采用mmseg4j 项目库:http://code.google.com/p/mmseg4j,也可以采用庖丁解牛(lucene)作为solr的缺省的中文分词方案  项目库:http://code.google.com/p/paoding/

四、Solr的多core配置(MultiCore):
    、、、、、、、、、、、、、

五、Solr的索引配置:
    、、、、、、、、、、、、、

六、Solr的配置文件:
    1、schema.xml:相当于数据表配置文件,他定义了加入索引的数据的数据类型,主要包括:types、fields和其他的一些缺省配置。

   
<uniqueKey>id</uniqueKey>:这个配置将id字段作为索引文档的唯一标识符,非常重要
    <fields>
        <field name="id" type="integer" indexed="true" stored="true" required="true"/>
        <field name="name" type="text" indexed="true" stored="true"/>
        <field name="email" type="text" indexed="true" stored="true" multiValued="true"/>
        <field name="copy_email" type="text" indexed="true" stored="false" multiValued="true"/>

        <copyField source="email" dest="copy_email"/>

        <dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>

    </fields>
/**
    name是定义的字段名
    type为字段类型,可以是基本的也可以是自定义的
    indexed表示是否被索引
    stored表示字段是否被存储,如果为false表示可以进行检索,但是不能够现实该字段的内容(搜索的字段内容不保存到返回结果中).
    multiValued表示是否又多个值
    required为true时表示当字段没有值,则solr会索引文档失败
    dynamicField为定义的动态字段,定义字段名称的规则,那么任何以attr_开头的字段都被认为符合这个定义的.
*/

    2、solrconfig.xml:它制定了Solr如何处理索引、突出显示、分类、搜索以及其他请求,还指定了用于指定缓存的处理方法的属性,以及用于指定Lucene管理索的方法的属性





七、Solr的应用模式:
    1、对于原油系统已有的数据或需要索引的数据量较大的情况:
        这种情况直接采用通过http方式调用solr的接口方式效率较差,应采用solr本身对cvs的支持,将数据导出为csv格式,然后调用solr的csv接口。

        、、、、、、、、

    2、对于系统新增的数据:
        将数据组装成xml格式,直接调用solr的http接口。

        数据库数据导入生成索引:可以通过程序将数据读取出来,如果内存够大可以读取100甚至1000条或者更多,然后放到Collection中批量提交到solr,但是我们还可以通过配置文件直接读取数据库建立索引。
            (1) 全量更新索引
                 一、提供对应数据库的jdbc驱动.将jdbc驱动放在TOMCAT_HOME\webapps\solr\WEB_INF\lib目录下。
                 二、在c:\solr-tomcat\solr\conf目录下新建db文件夹,在db文件夹中新建db-data-config.xml:
<dataConfig>
    <dataSource type="jdbcDataSource" driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@192.168.11.1:1521:数据库名" user="#" password="#"/>

    <document name="messages">
        <entity name="message" transformer="ClobTransformer" query="select * from tb_message">
            <field column="ID" name="id"/>
            <field column="TITLE" name="title"/>
            <field column="CONTENT" clob="true" name="content"/>
            <field column="SENDTIME" name="sendtime"/>
        </entity>
    </document>
</dataConfig>

                 三、修改c:\solr-tomcat\solr\conf目录下的solrconfig.xml文件,添加如下代码:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
        <str name="config">c:\solr-tomcat\solr\conf\db\db-data-config.xml</str>
    </lst>
</requestHandler>


document:一个文档、也是lucene的document.
entity:主要针对的是一个数据库表
field:属性column是数据库的字段,name是field的名字(schema的field)

                四、启动tomcat,输入地址进行导入,导入分为多种模式:这里使用的是完全导入模式 http://localhost:8080/solr/dataimport?command=full-import

                五、扩展:
                    上面的例子只不过是很简单的一个部分,针对solr的MultiCore,可以配置db-data-config.xml也可以实现,还有多表或者是多表关联等等操作,只要在db-data-config.xml中配置清楚都可以进行数据的导入。solr1.4有很多功能为重建索引提供很方便的操作。而且datasource不单单指的是database,也可以是xml文件或者来自网络上的一些内容。
            (2) 增量更新索引:
                1、首先确认表中有last_modified字段。
                2、修改c:\solr-tomcat\solr\conf\db\db-data-config.xml文件,内容如下:
<dataConfig>
     <dataSource type="jdbcDataSource" driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@192.168.11.1:1521:数据库名" user="#" password="#"/>

    <document name="message">
        <entity name="message" pk="ID" transformer="ClobTransformer"
                query="select * from tb_message"
                delaQuery="select id from tb_message where to_char(last_modified,'YYYY-MM-DD HH24:MI:SS')">'${dataimport.last_index_time}'>
            <field column="ID" name="id"/>
            <field column="TITLE" name="title"/>
            <field column="CONTENT" clob="true" name="content"/>
            <field column="SENDTIME" name="sendtime"/>
        </entity>
     </document>
</dataConfig>

                 3、重启tomcat,添加一条记录http://localhost:8089/solr/dataimport?command=delta-import
    3、嵌入式solr
        、、、、、、、、、
    4、分布式索引
        、、、、、、、、、


八:Solr的使用步骤:
    1、搜索引擎规划设计
        定制好业务模型:分析确定有哪些内容需要进行检索,这些内容的来源,更新的频次等信息,
        定制好索引结构:定制索引服务就是对索引源进行结构化的索引,即索引后的结果是结构化的有意义的信息。主要涉及一下几点:(1)分类:多核解决方案 (2)需要检索的字段 (3)需要存储的方案  (4)过滤的条件  (5)排序  (6)索引的跟新频次.

        定制好搜索策略:指的是确定搜索支持的规则(1)过滤条件  (2)排序规则
       
    2、搜索引擎配置
        根据搜索引擎的规划,配置solr的schema.xml等配置文件:配置好Fieldtype、Fields、copyField、dynamicField的配置。
    3、构建索引并定时更新索引
        通过调用索引接口进行索引的构建与更新:
   
    4、搜索
        1、solr的查询参数说明
            1) q        -- 查询字符串
            2)fl       -- 指定返回那些字段的内容,用逗号或空格分隔多个
            3)start    -- 返回第一次记录在完整找到结果中的偏移位置,0开始
            4) rows     -- 指定返回结果最多有几条记录,一般配合start来实现分页
            5) sort     -- 排序 注意:排序只能针对数值型.
            6) wt       -- 指定输出格式,可以有xml,json,php
            7) fq       -- 过滤查询,在q查询符合结果中同时是fq查询符合的.例如:q=mm&fq=date_time:[200809 TO 201206],找到关键字mm,并且date_time是200809到201206之间的。

        2、solr检索的运算符
            1)":"       -- *:*查询所有,id:1查询id为1的内容
            2)"?"       -- 表示单个任意字符的通配
            3)"*"       -- 表示多个任意字符的通配
            4)"~"       -- 表示模糊检索,如检索类似于“roam”的内容:roam~将找到foam和roams的单词,roam~0.8表示检索返回相似度在0.8以上的记录。
            5)"^"       -- 控制相关度检索,如检索jakarta apache,同时希望"Jakarta"的相关度更加好,那么在其后加上"^"和增量值,即:jakarta^4 apache
            6)布尔操作符AND、||  OR、&&   NOT、!
            7)"-" 排除操作符不能单独与项使用构成查询  "+" 存在操作符,要求符号"+"后的项在文档相应的域中存在.
            "()"      --用于构成子查询
            9)"[]"、"{}" --范围检索.如date:[200707 TO 200710]表示包含头(200707)和尾(200710),而date:{200707 TO 200710}表示不包含头和尾.
            10)"\"       -- 转义字符,将特殊字符转义:"+ - && || ! () {} [] ^ ~ * ? : \"

        3、查询规则.
           1)要限定输出结果的内容用"fl="加上你要的字段名称:
                http://localhost:8080/solr/q=text:北京+ OR+text:亿度&start=0&rows=10&fl=name,address,tel  在返回的结果中只包括name、address以及tel三个内容.
           3)若搜寻联集结果,用OR连接:
               text:海淀 OR text:亿度
           4)若搜寻交集结果,用AND 或者 "+":
               text:海淀 AND 亿度    +text:海淀 +text:亿度   name:(+亿度 +海淀)
           5)排除查询:在排除词前加上"-"
               海淀 -亿度      这样搜索结果不会有包含亿度的词在结果中
           6)增加权重: 如搜寻“北京 加油站”,因为回传的资料大多包含“中国”或“加油站”的结果,所以想要把包含“加油站”的数据往前排,可以使用“^”在后面加上愈增加权重数:  北京 加油站^2     这样在搜寻时会先判断加油站这个词在搜寻结果中的比重,甚至假设一笔数据内加油站出现过两次以上的就更加具有优先权。

               title:(test1 test2)^4 content:(test1 test2)这样就给title字段增加权重,进行优先匹配。

           7)*符号:如果查询条件为“中国*银”    --他表示中国及银之间可夹任何长短字词    --那么结果会有 中国信托商业银行、中国输出入银行图书馆阅览室、中国商银证券   
       

Solr的分词器、过滤器、分析器的学习:
   
    分析就是组合分词和过滤:对于一个document进行索引时,其中的每个Field中的数据都会经历分析,最终讲一句话分成单个的单词,去掉句子当中的空白符号,大写转换为小写,复数转为单数,去掉多余的词,进行同义词代换等等。
   
    分析器(Analyzer)
        分析器是包含两个部分,分词器和过滤器。分词器功能将句子分成单个的词元token,过滤器就是对词元进行过滤。
        solr自带了一些分词器,如果你需要使用自定义的分词器,需要修改schema.xml,schema.xml文件允许两种凡是修改文本被分析的方式,通常只有field类型为solr.TextField的field的内容允许定制分析器。
        方法一:使用任何org.apache.lucene.analysis.Analyzer的子类进行设定。
<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    </analyzer>
</fieldType>

        方法二:制定一个TokenizerFactory,后面跟一系列的TokenFilterFactories(他们将按照所列的顺序发生作用),Factories被用来创建分词器和分词过滤器,他们用于对分词器和分词过滤器的准备配置,这样做的目的是为了避免(通过反射创建的开销)
<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" />
        <!-- 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" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>


        注意:任何Analyzer、TokenizerFactory、TokenFilterFactory应该带包名的全类名进行指定,并确保他们位于Solr的classpath路径下。如果需要自己的分词器或者过滤器,需要自己写一个factory,但是它必须是BaseTokenizerFactory(分词器)或BaseTokenFilterFactory(过滤器)的子类。

        solr提供的TokenizerFactories:
            1、solr.LetterTokenizerFactory
                分词举例:I can*t  ====》  I   can   t   字母切词
            2、solr.WhitespaceTokenizerFactory
                切除所有空白字符
            3、solr.LowerCaseTokenizerFactory
                分词举例:I can*t   ====》 i can t   主要是大写转小写
            4、solr.StandardTokenizerFactory
                该分词器会自动的给每个分词添加type,以便接下的对type敏感的过滤器进行处理,目前仅仅只有StandardFilter对Token的类型是敏感的。
                分词举例:I.B.M    cat*s   can*t  ====》ACRONYM:"I.B.M",APOSTROPHE:"cat*s",APOSTROPHE:"can*t"
            5、solr.HTMLStripWhitespaceTokenizerFactory
                从结果中除去HTML标签,将结果交给WhitespaceTokenizer处理。
                分词举例:my <a href="#">link</a>   ====》  my link
            6、solr.HTMLStripStandardTokenizerFactory
                从结果中除去HTML标签,将结果交给StandardTokenizer处理。
            7、solr.PatternTokenizerFactory
                说明:按照规则表达式对文本进行分词
                分词举例:处理对象 mice; kittens;  dogs,他们由分号加一个或多个空格分隔,
<filedType name="semicolonDelimited" class="solr.TextField">
    <analyzer>
        <tokenizer class="solr.PatternTokenizerFactory" pattern="; *"/>
    </analyzer>
</fieldType>


        solr提供的TokenFilterFactories:
            1、solr.StandardFilterFactory:
               移除首字母简写中的点和Token后面的 ’s。仅仅作用域由StandardTokenizer产生的有类的Token。
               分词实例:I.B.M cat's can't  ====>  IBM cat  can't
            2、solr.TrimFilterFactory
               去掉Token两端的空白符。
               分词实例:" Kittens!  ", "Duck" ====> "Kittens!","Duck"
            3、solr.LowerCaseFilterFactory
            4、solr.StopFilterFactory:
               去掉如下的通用词,多为虚词:a,an,and,are,as,at,be,but,by,for,if,in,into,is,it,no等
<fieldtype name="testtop" class="sole.TextField">
    <analyzer>
        <tokenizer class="solr.LowerCaseTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
    </analyzer>
</fieldtype>

            5、solr.KeepWordFilterFactory
                作用与solr.StopFilterFactory相反,保留词的列表
            6、solr.LengthFilterFactory
                过滤掉长度在某个范围之外的词。
<fieldtype name="lengthfilt" class="solr.TextField">
    <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LengthFilterFactory" min="2" max="5"/>
    </analyzer>
</fieldtype>

            7、solr.ProterStemFilterFactory
               采用Porter Steming Algorithm算法去掉单词的后缀,例如将复数形式变为单数形式
            8、solr.EnglishPorterFilterFactory
                关于句子主干的处理,其中的“protected”指定不允许修改的词的文件
            9、solr.WordDelimiterFilterFactory:关于分隔符的处理
            10、solr.SynoymFilterFactory
                关于同义词的处理
            11、solr.RemoveDuplicatesTokenFilterFactory:避免重复处理.



[url]
http://www.open-open.com/doc/view/1a455ab64f364ba18a097d1829646549[/url]

猜你喜欢

转载自wangxinhong4468.iteye.com/blog/2160372