JAVA拓展之Solr搜索引擎
引言:最近工作需要涉及到solr搜索引擎的使用, 因此也接着这个宝贵的机会,好好整理一下solr的知识点,在这里记录一下,方便以后好复习。
1、Solr是什么?
Solr是一个基于Lucene的Java搜索引擎服务器。Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。Solr已经在众多大型的网站中使用,较为成熟和稳定。Solr 包装并扩展了 Lucene,所以Solr的基本上沿用了Lucene的相关术语。更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。通过对Solr 进行适当的配置,某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此外,很多 Lucene 工具(如Nutch、 Luke)也可以使用Solr 创建的索引。
在版本上,solr5.0已经开始支持独立运行,不再需要依赖tomcat,成为了独立的服务器。
2、solr的安装与配置
- jkd要求:Solr 4.10 要求JDK版本必须是1.7或更高,solr7需要java8环境,且需要在环境变量中添加 JAVA_HOME变量
- 下载地址: http://www.apache.org/dyn/closer.cgi/lucene/solr/
- 安装:1、 将solr-4.10.2.zip文件拷贝到E盘;(或者其他盘都可以,只要目录中不要出现中文就行。)
2、 解压solr-4.10.2.zip文件,得到solr-4.10.2目录。
3、运行cmd,执行命令进入C:\solr-4.10.2\example
4、 执行命令:java -jar start.jar
5、 打开浏览器,输入地址:http://localhost:8983/solr
3、solr的基本使用
1、数据导入
导入数据到Solr的方式也是多种多样的:
- 可以使用DIH(DataImportHandler)从数据库导入数据
- 支持CSV文件导入,因此Excel数据也能轻松导入
- 支持JSON格式文档
- 二进制文档比如:Word、PDF
- 还能以编程的方式来自定义导入
2、数据更新
solr会根据文档的字段id来唯一标识文档,如果导入的文档的id已经存在solr中,那么这份文档就被最新导入的同id的文档自动替换。管理界面的有值得关注的几个参数:Num Docs,Max Doc,Deleted Docs的变化。
- numDocs:当前系统中的文档数量,它有可能大于xml文件个数,因为一个xml文件可能有多个doc标签。
- maxDoc:maxDoc有可能比numDocs的值要大,比如重复post同一份文件后,maxDoc值就增大了。
- deletedDocs:重复post的文件会替换掉老的文档,同时deltedDocs的值也会加1,不过这只是逻辑上的删除,并没有真正从索引中移除掉
3、数据删除
通过id删除指定的文档,或者通过一个查询来删除匹配的文档
通过id删除指定的文档,或者通过一个查询来删除匹配的文档
java -Ddata=args -jar post.jar "<delete><id>SOLR1000</id></delete>"
java -Ddata=args -jar post.jar "<delete><query>name:DDR</query></delete>"
备注:solr也有数据库中的事务,执行删除命令的时候事务自动提交了,文档就会立即从索引中删除。你也可以把commit设置为false,手动提交事务。
java -Ddata=args -Dcommit=false -jar post.jar "<delete><id>3007WFP</id></delete>"
执行完上面的命令时文档并没有真正删除,还是可以继续搜索相关结果,最后可以通过命令:
java -jar post.jar -
4、查询数据
查询数据都是通过HTTP的GET请求获取的,搜索关键字用参数q指定,另外还可以指定很多可选的参数来控制信息的返回,例如:用fl指定返回的字段,比如f1=name,那么返回的数据就只包括name字段的内容
http://localhost:8983/solr/collection1/select?q=solr&fl=name&wt=json&indent=true
Solr提供排序的功能,通过参数sort来指定,它支持正序、倒序,或者多个字段排序
q=video&sort=price desc
q=video&sort=price asc
q=video&sort=inStock asc, price desc
网页搜索中,为了突出搜索结果,可能会对匹配的关键字高亮出来,Solr提供了很好的支持,只要指定参数:
hl=true #开启高亮功能
hl.fl=name #指定需要高亮的字段
文本字段通过把文本分割成单词以及运用各种转换方法(如:小写转换、复数移除、词干提取)后被索引,schema.xml文件中定义了字段在索引中,这些字段将作用于其中.
默认情况下搜索”power-shot”是不能匹配”powershot”的,通过修改schema.xml文件(solr/example/solr/collection1/conf目录),把features和text字段替换成”text_en_splitting”类型,就能索引到了。
<field name="features" type="text_en_splitting" indexed="true" stored="true" multiValued="true"/>
<field name="text" type="text_en_splitting" indexed="true" stored="false" multiValued="true"/>