solr的基本应用

一、Solr的特性:

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

二、Solr服务器原理:

Solr对外提供标准的http接口来实现对数据的索引的增加、删除、修改、查询。Solr的工作流程大概是这样的:用户通过向部署在servlet容器中的SolrWeb应用程序发送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:[200809TO201206],找到关键字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)"^"--控制相关度检索,如检索jakartaapache,同时希望"Jakarta"的相关度更加好,那么在其后加上"^"和增量值,即:jakarta^4apache

6)布尔操作符AND、||OR、&&NOT、!

7)"-"排除操作符不能单独与项使用构成查询"+"存在操作符,要求符号"+"后的项在文档相应的域中存在.

"()"--用于构成子查询

9)"[]"、"{}"--范围检索.如date:[200707TO200710]表示包含头(200707)和尾(200710),而date:{200707TO200710}表示不包含头和尾.

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:海淀ORtext:亿度

4)若搜寻交集结果,用AND或者"+":

text:海淀AND亿度+text:海淀+text:亿度name:(+亿度+海淀)

5)排除查询:在排除词前加上"-"

海淀-亿度这样搜索结果不会有包含亿度的词在结果中

6)增加权重:如搜寻“北京加油站”,因为回传的资料大多包含“中国”或“加油站”的结果,所以想要把包含“加油站”的数据往前排,可以使用“^”在后面加上愈增加权重数:北京加油站^2这样在搜寻时会先判断加油站这个词在搜寻结果中的比重,甚至假设一笔数据内加油站出现过两次以上的就更加具有优先权。

title:(test1test2)^4content:(test1test2)这样就给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

分词举例:Ican*t====》Icant字母切词

2、solr.WhitespaceTokenizerFactory

切除所有空白字符

3、solr.LowerCaseTokenizerFactory

分词举例:Ican*t====》icant主要是大写转小写

4、solr.StandardTokenizerFactory

该分词器会自动的给每个分词添加type,以便接下的对type敏感的过滤器进行处理,目前仅仅只有StandardFilter对Token的类型是敏感的。

分词举例:I.B.Mcat*scan*t====》ACRONYM:"I.B.M",APOSTROPHE:"cat*s",APOSTROPHE:"can*t"

5、solr.HTMLStripWhitespaceTokenizerFactory

从结果中除去HTML标签,将结果交给WhitespaceTokenizer处理。

分词举例:my<ahref="#">link</a>====》mylink

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.Mcat'scan't====>IBMcatcan'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

采用PorterStemingAlgorithm算法去掉单词的后缀,例如将复数形式变为单数形式

8、solr.EnglishPorterFilterFactory

关于句子主干的处理,其中的“protected”指定不允许修改的词的文件

9、solr.WordDelimiterFilterFactory:关于分隔符的处理

10、solr.SynoymFilterFactory

关于同义词的处理

11、solr.RemoveDuplicatesTokenFilterFactory:避免重复处理.

[url]

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