Solr搜索应用服务器

一,Solr简介

1,Solr是什么

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http G SolrJ操作提出查找请求(也可以提交json格式),并得到XML格式的返回结果.

2,Solr与lucene的关系

Luncene是一套信息检索工具包,但并不包含搜索引擎系统,它包含了索引结构,读写索引工具、相关性工具(其他的搜索组件)、排序等功能,因此在使用luncene时你扔需要关注搜索引擎系统,例如数据获取、解析、分词等方面的东西。
首先solr是基于luncene做的,solr的目标是打造一款企业级的搜索引擎系统,因此它更接近于我们认识到的搜索引擎系统,它是一个搜索引擎服务,通过各种API可以让你的应用使用搜索服务,而不需要将搜索逻辑耦合在应用中。而且solr可以根据配置文件定义数据解析的方式,更像是一个搜索框架,它也支持主从(集群中的方式)、热换库(索引的数据与数据库的同步)等操作,还添加了高亮、facet(搜索组件)等搜索引擎常见功能的支持。
在这里插入图片描述

二,Solr环境配置

(1),Solr下载
solr安装包的下载
(2),整合Solr和tomcat
Solrhome目录是Solr运行的主目录,目录中包括了运行Solr实例所有配置文件和数据文件,Solr实例是SolrCore,一个SolrHome可以包括多个SolrCore,每个SolrHome提供单独的搜索和索引服务。
②将Solr里面的solr.war文件解压拷贝到tomcat里面的webapps目录下
1.solr.war的路径

solr路径
2.solr解压路径
在这里插入图片描述
③将solr-4.10中依赖包导入tomcat的solr中
1.solr-4.10包的位置
在这里插入图片描述
2.导入tomcat的solr位置
在这里插入图片描述
④将solr-4.10中SolrCore(solr实例)导入Solrhome中
solr-4.10中SolrCore(solr实例)路径
在这里插入图片描述
Solrhome路径
在这里插入图片描述
⑤在solrCode的web.xml中配置Solrhome中
solrCode的web.xml路径
在这里插入图片描述
solrCode的web.xml配置代码(web-app标签中)

<env-entry>
     <env-entry-name>solr/home</env-entry-name>
     <env-entry-value>C:\myself\solrhome</env-entry-value>
     <env-entry-type>java.lang.String</env-entry-type>
  </env-entry>

⑥启动tomcat

三,collection介绍

(1)collection集合介绍

在这里插入图片描述

(2)collection添加

1.将collection1复制一份改名为collection2

在这里插入图片描述
2.更改配置文件
在这里插入图片描述
注意:collection是对搜索分模块用到一般用不到

(3)添加IKAnalyzer分析器

1.IKAnalyzer包导入
在这里插入图片描述
2.在tomcat的WEN-INF文件夹里面新建一个classes文件夹添加以下文件文件内容可以在lucene中找到
在这里插入图片描述

3.在solrHome\collection1\config\schema.xml添加如下代码

<!--IKAnalyzer-->
 <fieldType name="text_ik" class="solr.TextField">
  <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
 </fieldType>
 <!--IKAnalyzer Field-->
 <field name="title_ik" type="text_ik" indexed="true" stored="true" />
 <field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>
(4)导入数据

1.在solrhome\collection1目录新建lib目录导入两个数据导入包和一个数据库驱动包

在这里插入图片描述
两个数据导入包位置
在这里插入图片描述
配置数据库域
在solrhome\collection1\conf\solrconfig.xml文件里面找到

<!-- Legacy config for the admin interface -->
  <admin>
    <defaultQuery>*:*</defaultQuery>
  </admin>
  
  <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
 <lst name="defaults">
  <str name="config">data-config.xml</str>
 </lst>
 </requestHandler>

在solrhome\collection1\conf目录下建一个data-config.xml文件配置数据库

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
 <dataSource type="JdbcDataSource"
 driver="com.mysql.jdbc.Driver"
 url="jdbc:mysql://localhost:3306/shop"
 user="root"
 password="123"/>
 <document>
  <entity name="product" query="SELECT pid,pname,shop_price,pdesc,pimage From product">
   <field column="pid" name="id"/>
   <field column="pname" name="product_name"/>
   <field column="shop_price" name="product_price"/>
   <field column="pdesc" name="product_description"/>
   <field column="pimage" name="product_picture"/>
  </entity>
 </document>
</dataConfig>

3.配置数据库域在solrHome\collection1\config\schema.xml添加如下代码

<!--product-->
 <field name="product_name" type="text_ik" indexed="true" stored="true" />
 <field name="product_price" type="float" indexed="true" stored="false" />
 <field name="product_description" type="text_ik" indexed="true" stored="true" />
 <field name="product_picture" type="string" indexed="false" stored="true" />
 
 <field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
 <copyField source="product_name" dest="product_keywords"/>
 <copyField source="product_description" dest="product_keywords"/>

4.从solr管理系统导入数据
在这里插入图片描述5Solr管理系统查询
在这里插入图片描述

三,代码实现

1.导包
依赖包在这里插入图片描述
在这里插入图片描述
核心包
在这里插入图片描述
2.代码
①添加

//管理系统路径
String base="http://localhost:8080/solr/";
  //单机版solr
  SolrServer solrServer=new HttpSolrServer(base);
  SolrInputDocument docs=new SolrInputDocument();
  docs.setField("id", "hh");
  docs.setField("name", "ttt");
  //添加文档
  solrServer.add(docs);
  solrServer.commit();
  System.out.println("完成!")
  

②删除

String base="http://localhost:8080/solr/";
  //单机版solr
  SolrServer solrServer=new HttpSolrServer(base);
  //条件删除
  solrServer.deleteByQuery("*:*",1000);
  
  solrServer.commit();
  System.out.println("完成!");

④查询

String base="http://localhost:8090/solr/";
  //单机版solr
  SolrServer solrServer=new HttpSolrServer(base);
  //过滤对象
  SolrQuery solrQuery=new SolrQuery();
  //关键词
  solrQuery.set("q", "*:*");
  //solrQuery.setQuery("product_name:索尼");
  //执行查询
  QueryResponse response=solrServer.query(solrQuery);
  //文档结果集
  SolrDocumentList docs=response.getResults();
  long numFound=docs.getNumFound();
  System.out.println(numFound);
  for(SolrDocument doc:docs)
  {
   System.out.println(doc.get("product_picture"));
   System.out.println(doc.get("id"));
   System.out.println(doc.get("product_price"));
   System.out.println(doc.get("product_name"));
  }
  System.out.println("完成!");

⑤条件查询

	String base="http://localhost:8090/solr/";
  //单机版solr
  SolrServer solrServer=new HttpSolrServer(base);
  //过滤对象
  SolrQuery solrQuery=new SolrQuery();
  //关键词
  //solrQuery.set("q", "*:*");
  //solrQuery.setQuery("product_name:索尼");
  solrQuery.setQuery("小米");
  //设置过滤条件
  solrQuery.set("fq", "id:[* TO 2]");
  //id排序
  solrQuery.addSort("id",ORDER.desc);
  //分页
  solrQuery.setStart(0);
  solrQuery.setRows(3);
  //默认域
  solrQuery.set("df", "product_name");
  //指定查询域
  solrQuery.set("fl", "id,product_picture,product_name");
  //高亮
  //打开高亮开关
  solrQuery.setHighlight(true);
  //指定高亮域
  //高亮前后缀
  solrQuery.setHighlightSimplePre("<span style='color:red'>");
  solrQuery.setHighlightSimplePost("/<span>");
  //执行查询
  QueryResponse response=solrServer.query(solrQuery);
  //获得高亮
  Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
  //Map k id V MAp
  //Map K 域名 V LIst
  //List list.get(0)
  //文档结果集
  SolrDocumentList docs=response.getResults();
  //总条数
  long numFound=docs.getNumFound();
  System.out.println(numFound);
  for(SolrDocument doc:docs)
  {
   System.out.println(doc.get("product_picture"));
   System.out.println(doc.get("id"));
   System.out.println(doc.get("product_name"));
   Map<String, List<String>> map = highlighting.get(doc.get("id"));
   List<String> list = map.get("product_name");
   System.out.println(list.get(0)+":::::");
  }
  System.out.println("完成!");

⑥条件查询京东案例
1).配置SolrJ bean

<bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
         <constructor-arg value="http://localhost:8090/solr/collection1"/>
        </bean>

2).代码

@Autowired
 SolrServer solrServer;
 @Override
 public List<Product> selectProductModelListByQuery(String queryString, String catalog_name, String price,
   String sort) throws Exception {
   //条件对象
  SolrQuery solrQuery=new SolrQuery();
  //过滤条件
  //搜索关键词
  if(queryString!=null&&!"".equals(queryString))
  {
   
  solrQuery.setQuery(queryString);
  }
  else
  {
   solrQuery.setQuery("*");
  }
  //过滤条件
  if(catalog_name!=null&&!"".equals(catalog_name))
  {
   solrQuery.set("fq", "product_catalog_name:"+catalog_name);
  }
  System.out.println(price);
  //价格范围
  if(price!=null&&!"".equals(price))
  {
   String[] p=price.split("-");
   solrQuery.set("fq","product_price:["+p[0]+" TO "+p[1]+"]");
  }
  //价格排序方式
  if("1".equals(sort))
  {
   solrQuery.addSort("product_price",ORDER.desc);
  }
  else
  {
   solrQuery.addSort("product_price",ORDER.asc);
  }
   //分页
  solrQuery.setStart(0);
  solrQuery.setRows(12);
  //默认域
  solrQuery.set("df","product_name");
  //只查指定域
  solrQuery.set("fl", "id,product_name,product_price,product_picture");
  //高亮
  //开关
  solrQuery.setHighlight(true);
  //前缀后缀
  solrQuery.setHighlightSimplePre("<span style='color:red'>");
  solrQuery.setHighlightSimplePost("</span>");
  //执行查询
  QueryResponse response=solrServer.query(solrQuery);
  //结果收集文档
  
  
  SolrDocumentList docs=response.getResults();
  //总条数
  Map<String,Map<String,List<String>>> highlighting=response.getHighlighting();
  long number=docs.getNumFound();
  List<Product> productModels=new ArrayList<Product>();
  //遍历
  for(SolrDocument doc:docs)
  {
   Product product=new Product();
   System.out.println("id:"+doc.get("id"));
   product.setPid((String)doc.get("id"));
   Map<String, List<String>> map = highlighting.get(doc.get("id"));
   List<String> list = map.get("product_name");
   System.out.println(list.get(0)+":::::");
   product.setPicture((String)doc.get("product_picture"));
   product.setPrice((Double)doc.get("product_price"));
   System.out.println(doc.get("product_name"));
   product.setName(list.get(0));
    productModels.add(product);
   //Map K id V Map
   //Map K 域名 V List
   //List list.get(0)
  }
  return productModels;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值