当前位置:   article > 正文

JAVAWEB开发之Solr的入门——Solr的简介以及简单配置和使用、solrJ的使用、Solr数据同步插件_solr 热词 java

solr 热词 java

Solr简介

Solr是采用Java开发,基于Lucene的全文检索服务器,同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-Service的API接口,用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引,也可以通过Http G Solret操作提出查找请求,并得到XML格式的返回结果。

Solr与Lucene的关系

Lucene是一套信息检索工具包,但是并不包含搜索引擎系统,它包含了索引结构、读写索引工具、相关性工具、排序等功能,因此在使用Lucene时仍需要关注搜索引擎系统,例如数据获取、解析、分词方面的东西。
solr是基于Lucene开发的,Solr主要是为了打造一款企业级的搜索引擎系统,因此它更接近于常用的搜索引擎系统(百度、搜狗),它是一个搜索引擎服务,通过各种API可以让我们的应用使用搜索服务,而不需要将搜索逻辑耦合在应用中。而且solr可以根据配置文件定义数据解析的方式,更像是一个搜索框架,它也支持主从、热换库操作,还添加了高亮、facet等搜索引擎常见的功能支持。
Nutch是一款开源的Java实现的搜索引擎,它提供了我们运行自己的搜索引擎所需的全部工具。包括全文检索和web爬虫。常用来使用Nutch做爬虫。

Solr的简单搭建运行

下载解压后的目录:

配置步骤:
1.解压solr-4.7.0.zip到你想到存放的路径,比如当前用户根目录/Users/liuxun/solr-4.7.0
2.cmd打开命令行窗口,进入/Users/liuxun/solr-4.7.0/example目录
3.执行命令:java -jar start.jar
4.通过第三步以后,系统会启动solr自带的jetty服务器,通过    http://localhost:8983/solr/便可访问solr。
此时,solr已成功启动

操作界面说明:




等等还有查询 界面使用并不麻烦

命令测试管理索引

(一) 创建索引
此时solr已安装并启动,但是还没有索引,只有创建好索引,搜索才能有结果
1、命令进入/solr-4.6.0/example/exampledocs目录
2、执行命令:java -jar post.jar solr.xml monitor.xml,此时你已成功提交了2个solr文档
3、执行完第二步后,我们可以通过浏览器访问:http://localhost:8983/solr/collection1/select?q=solr&wt=xml
如果你想导入更多的文档,执行命令:java -jar post.jar *.xml
(二)更新索引
当重复执行命令:java -jar post.jar *.xml后,发现搜索的结果没有出现重复的数据,原因:example目录下的schema.xml中指定了列id为uniqueKey(即:唯一),所以重复提交数据到索引库时,id相同的数据会替换原来document中的数据。
如果想要得到重复的数据,可以通过修改exampledocs目录下*.xml中id值的方式实现
(三)删除索引
1、执行命 令:
java -Ddata=args -Dcommit=false -jar post.jar “<delete><id>SP2514N</id></delete>”,可以删除id为 SP2514N的document
2、执行第一步后,再去搜索发现搜索结果中还有id为SP2514N的数据,其实不是第一步没有删除成功,因为第一步的命令中-Dcommit=false,所以第一步的删除操作没有提交到索引(index)中。
3、在没有打开新的searcher之前,第一步删除数据会一直存在于搜索结果中,所以我们可以强制打开一个新的searcher,执行命令:java -jar post.jar -
(四)查询索引
solr通过http以get的方式进行搜索数据,如:http://localhost:8983/solr/collection1/select?q=solr&wt=xml
q:查询的关键词(此时查询的字段是solrconfig.xml中指定的默认查询字段<str name=”df”>text</str>)
fl:搜索结果返回的字段
sort:排序
wt:搜索结果返回格式
q=video&fl=name,id (return only name and id fields) 
q=video&fl=name,id,score (return relevancy score as well) 
q=video&fl=*,score (return all stored fields, as well as relevancy score) 
q=video&sort=price desc&fl=name,id,price (add sort specification: sort by price descending) 
q=video&wt=json (return response in JSON format) 

使用SolrJ与Solr服务器交互


我们要使用Solr服务,可以直接使用urlconnecion按照规则去调用Solr服务的接口,如果是web应用除了可以使用URLConnection在后台调用外还可以使用AJAX技术(XmlHttpRequest)调用,但是需要自己封装数据,解析数据,非常麻烦。
SolrJ提供了针对各种客户端的API,可以省去这些繁琐的步骤,面向API编程 直接与Solr服务器进行交互。

SolrJ的简介和使用:

solrj是solr的java客户端,用于访问solr索引库。
它提供了添加、删除、查询、优化等功能。 
Jar 包位置
解压目录:
它是集成到solr压缩包里的,解压文件后,有个目录/dist/,里面就存放了solrj所用到的jar( /dist/solrj-lib/*.jar/dist/*.jar),把这些所有的jar都添加到项目中的classpath就可以直接开发了。
Demo示例如下(以上传GitHub https://github.com/LX1993728/SolrJ_java_Test)
Product.java
  1. public class Product {
  2. //Field中的value要遵循核心中schema中<fields>的规则
  3. @Field(value="id")
  4. private String id;
  5. @Field(value="name")
  6. private String name;
  7. @Field(value="description")
  8. private String desc;
  9. @Field(value="price")
  10. private float price;
  11. // setter getter
  12. // ......
  13. }
@Field 表示 当前属性与索引库中哪个已经声明的字段名相对应  (具体规则由schema指定)
SolrDao.java (索引的增删改查)
  1. package liuxun.solrj.dao;
  2. import java.io.IOException;
  3. import java.util.List;
  4. import java.util.Map;
  5. import org.apache.solr.client.solrj.SolrQuery;
  6. import org.apache.solr.client.solrj.SolrServer;
  7. import org.apache.solr.client.solrj.SolrServerException;
  8. import org.apache.solr.client.solrj.impl.HttpSolrServer;
  9. import org.apache.solr.client.solrj.response.QueryResponse;
  10. import org.apache.solr.common.SolrDocument;
  11. import org.apache.solr.common.SolrDocumentList;
  12. import org.apache.solr.common.SolrInputDocument;
  13. import liuxun.solrj.bean.Product;
  14. /**
  15. * 使用solrJ 向solr 提交请求,增删改查, solrJ 底层页是发送http 协议...
  16. *
  17. * @author liuxun
  18. */
  19. public class SolrDao {
  20. // 在solr 当中有一些默认的字段和动态字段规则,配置在文件/example/solr/collection1/conf/schema.xml
  21. // 添加默认索引属性
  22. public void addDefaultField() throws SolrServerException, IOException {
  23. // 声明要连接solr服务器的地址
  24. String url = "http://localhost:8983/solr";
  25. SolrServer solr = new HttpSolrServer(url);
  26. SolrInputDocument doc = new SolrInputDocument();
  27. doc.addField("id", "默认情况下必须添加的字段,用来区分文档的唯一标识");
  28. doc.addField("name", "默认的名称属性字段");
  29. doc.addField("description", "默认的表示描述信息的字段");
  30. solr.add(doc);
  31. solr.commit();
  32. }
  33. // 添加动态索引属性
  34. public void addDynamicField() throws SolrServerException, IOException {
  35. // 声明要连接solr服务器的地址
  36. String url = "http://localhost:8983/solr";
  37. SolrServer solr = new HttpSolrServer(url);
  38. SolrInputDocument doc = new SolrInputDocument();
  39. doc.addField("id", "adwweqwewe");
  40. doc.addField("nam_s", "动态字段的StringField类型格式为*_s");
  41. doc.addField("desc_s", "动态字段的TextField类型格式为*_t");
  42. solr.add(doc);
  43. solr.commit();
  44. }
  45. // 添加索引
  46. public void addIndex(Product product) throws SolrServerException, IOException {
  47. // 声明要连接solr服务器的地址
  48. String url = "http://localhost:8983/solr";
  49. SolrServer solr = new HttpSolrServer(url);
  50. solr.addBean(product);
  51. solr.commit();
  52. }
  53. // 更新索引
  54. public void updateIndex(Product product) throws IOException, SolrServerException {
  55. // 声明要连接solr服务器的地址
  56. String url = "http://localhost:8983/solr";
  57. SolrServer solr = new HttpSolrServer(url);
  58. solr.addBean(product);
  59. solr.commit();
  60. }
  61. // 删除索引
  62. public void delIndex(String id) throws SolrServerException, IOException {
  63. // 声明要连接solr服务器的地址
  64. String url = "http://localhost:8983/solr";
  65. SolrServer solr = new HttpSolrServer(url);
  66. solr.deleteById(id);
  67. // solr.deleteByQuery("id:*");
  68. solr.commit();
  69. }
  70. // 查找索引
  71. public void findIndex() throws SolrServerException {
  72. // 声明要连接solr服务器的地址
  73. String url = "http://localhost:8983/solr";
  74. SolrServer solr = new HttpSolrServer(url);
  75. // 查询条件
  76. SolrQuery solrParams = new SolrQuery();
  77. solrParams.setStart(0);
  78. solrParams.setRows(10);
  79. solrParams.setQuery("name:苹果 +description:全新4G");
  80. // 开启高亮
  81. solrParams.setHighlight(true);
  82. solrParams.setHighlightSimplePre("<font color='red'>");
  83. solrParams.setHighlightSimplePost("</font>");
  84. // 设置高亮的字段
  85. solrParams.setParam("hl.fl", "name,description");
  86. // SolrParams是SolrQuery的子类
  87. QueryResponse queryResponse = solr.query(solrParams);
  88. // (一)获取查询的结果集合
  89. SolrDocumentList solrDocumentList = queryResponse.getResults();
  90. // (二)获取高亮的结果集
  91. // 第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名
  92. Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
  93. for (SolrDocument solrDocument : solrDocumentList) {
  94. System.out.println("=====" + solrDocument.toString());
  95. Map<String, List<String>> fieldsMap = highlighting.get(solrDocument.get("id"));
  96. List<String> highname = fieldsMap.get("name");
  97. List<String> highdesc = fieldsMap.get("description");
  98. System.out.println("highname======" + highname);
  99. System.out.println("highdesc=====" + highdesc);
  100. }
  101. // (三) 将响应结果封装到Bean
  102. List<Product> products = queryResponse.getBeans(Product.class);
  103. System.out.println(products + "+++++++++++");
  104. for (Product product : products) {
  105. System.out.println(product);
  106. }
  107. }
  108. }
测试:
SolrDaoTest
  1. package liuxun.solrj.junit;
  2. import static org.junit.Assert.*;
  3. import java.io.IOException;
  4. import org.apache.solr.client.solrj.SolrServerException;
  5. import org.junit.Before;
  6. import org.junit.Test;
  7. import liuxun.solrj.bean.Product;
  8. import liuxun.solrj.dao.SolrDao;
  9. public class SolrDaoTest {
  10. private SolrDao solrDao = new SolrDao();
  11. @Test
  12. public void testAddDefaultField() throws SolrServerException, IOException {
  13. solrDao.addDefaultField();
  14. }
  15. @Test
  16. public void testAddDynamicField() throws SolrServerException, IOException {
  17. solrDao.addDynamicField();
  18. }
  19. @Test
  20. public void testAddIndex() throws SolrServerException, IOException {
  21. for(int i=1;i<=2;i++){
  22. Product product=new Product();
  23. product.setId(String.valueOf(i));
  24. product.setName("苹果(Apple)iPhone 5c 16G版 3G手机(白色)电信版");
  25. product.setDesc("选择“购机送费版”北京用户享全新4G合约套餐资费全网最低!");
  26. product.setPrice(9f);
  27. solrDao.addIndex(product);
  28. }
  29. }
  30. @Test
  31. public void testUpdateIndex() throws IOException, SolrServerException {
  32. Product product=new Product();
  33. product.setId(String.valueOf(2));
  34. product.setName("毛衣的毛衣黑色毛衣");
  35. product.setDesc("女士专用 三点不漏..");
  36. product.setPrice(9f);
  37. solrDao.updateIndex(product);
  38. }
  39. @Test
  40. public void testDelIndex() throws SolrServerException, IOException {
  41. solrDao.delIndex("2");
  42. }
  43. @Test
  44. public void testFindIndex() throws SolrServerException {
  45. solrDao.findIndex();
  46. }
  47. }
控制台打印:

在solr图形界面搜索:

Solr安装插件与数据库表进行同步

修改solrconfig.xml,添加下面这段代码: 
  1. <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
  2. <lst name="defaults">
  3. <str name="config">data-config.xml</str>
  4. </lst>
  5. </requestHandler>
然后再solrconfig.xml文件统计的目录下新增上面声明的data-config.xml。内容如下:
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <dataConfig>
  3. <dataSource type="JdbcDataSource"
  4. driver="com.mysql.jdbc.Driver"
  5. url="jdbc:mysql://localhost:3306/solr_test"
  6. user="root"
  7. password="root"/>
  8. <document>
  9. <entity name="id" query="select id,name,manu from solr" dataSource="JdbcDataSource"></entity>
  10. </document>
  11. </dataConfig>
因为需要连接数据库所以需要连接数据库的jar 包,以及操作索引库的jar 包,在collection 下面创建lib 目录将jar 包拷贝到lib 目录下 ( solr-dataimporthandler-4.7.0solr-dataimporthandler-extras-4.7.0以及连接 mysql 的jar 包)
配置的目录如下

测试导入:

查询是否导入成功

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/168210
推荐阅读
相关标签
  

闽ICP备14008679号