一、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]