Solr是基于Lucene Java搜索库的企业级全文搜索引擎,目前是apache的一个项目。它的特点包括支持XML/HTTP和JSON API,支持高亮显示,支持缓存机制以及支持分布式等等。
下载和安装自己去看文档好了。我们主要研究一下它的配置和使用以及如何实现对中文分词的支持。
假设你现在已经安装好了一个带有Jetty的Solr服务器,那么它的目录结构应该是这样的:
$mySolr
|– etc
| |– LICENSE.javax.servlet.txt
| |– LICENSE.javax.xml.html
| |– LICENSE.jsse.txt
| |– admin.xml
| |– jetty-jmx.xml
| |– jetty.xml
| `– webdefault.xml
|– ext
| |– ant.jar
| |– commons-el.jar
| |– commons-logging.jar
| |– jasper-compiler.jar
| |– jasper-runtime.jar
| |– mx4j-remote.jar
| |– mx4j-tools.jar
| `– mx4j.jar
|– lib
| |– javax.servlet.jar
| |– jsp
| |– org.mortbay.jetty.jar
| `– org.mortbay.jmx.jar
|– solr
| |– README.txt
| `– conf
| |– admin-extra.html
| |– protwords.txt
| |– schema.xml
| |– scripts.conf
| |– solrconfig.xml
| |– stopwords.txt
| |– synonyms.txt
| `– xslt
| `– example.xsl
|– start.jar
`– webapps
`– mySolr
|– META-INF
| |– LICENSE.txt
| |– MANIFEST.MF
| `– NOTICE.txt
|– WEB-INF
| |– lib
| | |– apache-solr-1.2-dev-incubating.jar
| | |– commons-fileupload-1.1.1.jar
| | |– commons-io-1.2.jar
| | |– lucene-core-nightly.jar
| | |– lucene-highlighter-nightly.jar
| | |– lucene-snowball-nightly.jar
| | `– xpp3-1.1.3.4.O.jar
| `– web.xml
`– index.html
Solr是用xml文件进行配置的,其中最主要的配置文件在solr/conf/下面。
首先是schema.xml,它是用来设置你要加入索引的数据的数据类型的,首先你要定义一个FieldType,包括name,class,positionIncrementGap等等一些参数,name就是这个FieldType的名称,class指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为。在FieldType定义的时候最重要的就是定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer,包括分词和过滤。你会看到在例子中text这个FieldType在定义的时候,在index的analyzer中使用solr.WhitespaceTokenizerFactory这个分词包,就是空格分词,然后使用solr.StopFilterFactory,solr.WordDelimiterFilterFactory,solr.LowerCaseFilterFactory,solr.EnglishPorterFilterFactory,solr.RemoveDuplicatesTokenFilterFactory这几个过滤器。在向索引库中添加text类型的索引的时候,Solr会首先用空格进行分词,然后把分词结果依次使用指定的过滤器进行过滤,最后剩下的结果才会加入到索引库中以备查询。定义完FieldType以后就是定义具体的字段(类似数据库中的字段),就是filed,filed定义包括name,type(就是之前定义过的各种FieldType),indexed(是否被索引),stored(是否被储存),multiValued(是否有多个值)等等。除此之外,你还可以定义动态字段,所谓动态字段就是不用指定具体的名称,只要定义字段名称的规则,例如定义一个dynamicField,name为*_i,定义它的type为text,那么在使用这个字段的时候,任何以_i结尾的字段都被认为是符合这个定义的,例如name_i,gender_i,school_i等。
还有solrconfig.xml,这个文件用来定义Solr的一些基本特性,最重要的一个就是可以通过更改其中的dataDir属性来指定索引文件的存放位置。
这些都定义好之后,你可以重新启动你的服务器,然后向其中添加数据。
添加数据是通过向服务器的update服务POSTxml格式的数据来实现的,xml结构是这样的add中间有很多个doc,每个doc中有很多个field。添加到索引库中的每条记录都必须指定唯一的数字id来唯一标识这条索引。建立好xml文件(例如a.xml)之后,在exampledocs目录下执行:java -jar post.jar a.xml来添加索引数据。根据实验,每个xml文件最好不要超过30M,不然会添加失败。
添加成功之后就可以通过web服务来进行查询了,查询方法是把“字段名称:要查询的值”这样的字符串传递给服务器,服务器返回xml格式的结果。例如要在一个名为user_name的字段上查询值为”test”的数据,那么传递给服务器的就是”user_name:test”.多个查询之间用”&&”连接。
返回的结果包括查询所用时间,找到的符合条件的记录数,以及根据指定的start和limit确定的部分记录(这个可以用来实现分页)。可以根据自己的需要对结果xml进行解析。查询速度还不错(当然这个和运行环境和网络环境等有关)。在同一个查询进行第二次的时候,Solr会从缓存中取得数据,只要几毫秒。
下面说说索引的删除和更新,更新很容易,只要把新的数据按照对应的唯一id重新添加一次就可以了,删除有几种情况,一是删除指定id的一条记录,那么就建立一个简单的xml片段:《delete》id:21《/delete》,如果删除某一类字段,例如删除所有user_name是john的记录,那么可以建立这样的xml片段:《delete》《query》user_name:john《/query》《/delete》。因此,如果要删除所有的索引的话,你可以把其中的user_name:john替换成*.*。然后把这个xml用添加索引同样的办法POST到服务器就可以了。当然如果想删除所有的索引,你也可以先停止服务,然后删除index目录,然后再重新启动服务:)
好了,现在可以自由的管理索引,也可以方便的进行查询了,接下来说说怎么实现对中文分词的支持。
根据前面说的,分词是在添加索引和进行查询的时候实现的,就是在定义FieldType的时候进行对应分词方法的定义。Solr默认是不支持中文分词的,但是lucene中提供了用来实现中文分词的包,按照Solr的方法包装成ChineseFilterFactory.java和ChineseTokenizerFactory.java两个类,然后在定义FieldType的时候指定使用这两个类来进行分词和过滤就可以了(这里只是思路,具体方法自己琢磨,嘿嘿)。
好了,现在可以用它来代替以前的weblucene了。hoho。



1 comment so far ↓
写的再深入些就好了 还有一点 solr支持中文分词
再研究研究吧
说吧。。。