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]