1.solr是一个全文检索引擎系统,通过部署到tomcat下就可以独立运行,通过http协议对外提供全文检索服务,
就是索引和文档的正删改查服务
2. solr直接操作索引库和文档库, 我们的业务系统中可以使用solrJ(solr的客户端,就是一堆jar包)来调用solr服务端,
让solr服务端操作文档库和索引库,完成正删改查的任务,将结果返回给solrJ客户端,我们在业务系统中就可以,
获取到结果然后返回给客户在浏览器中显示.
3. solrHome:solrhome就是solr最核心的目录, 一个solrhome中可以有多个solr实例
4. solrCore:一个solrCore就是一个solr实例,solr中实例与实例之间他们的索引库和文档库是相互隔离的
每个实例对外单独的提供索引和文档的增删改查服务,默认实例叫做collection1
5. 文档和索引的增加和修改必须要有id, 主键域,没有会报错
6. 域名和类型必须先定义后使用,如果没有定义就使用会报错
7. 域的分类
普通域:string long 等
动态域:起到模糊匹配的效果,可以模糊匹配没有定义过的域名
例如:xxxx这个域名没有定义,但是xxxx_s这个域名模糊匹配了*_s这个域,所以相当于xxxx_s这个域定义了
主键域:<uniqueKey>id</uniqueKey> 一般主键域就用默认的这个就可以不需要更改或者添加
复制域: 复制域用于查询的时候从多个域中进行查询,这样可以将多个域复制到某一个统一的域中,
然后搜索的时候从这个统一的域中进行查询,就相当于从多个域中查询了.
7.是否存储和是否索引无关, 索引后就能查询,不索引就不能根据这个域搜索,
存储后就能取出来里面的内容,不存储就取不出这个域内容
8. 一般企业中将数据全部放入数据库中, 由于查询的时候需要使用like模糊查询,模糊查询数据库中使用的是全表扫描算法,
这样效率低级,所以需要使用全文检索,来优化查询速度.
package sorlj;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.junit.Test;
import java.util.List;
import java.util.Map;
public class IndexSearchTest {
@Test
public void testIndexSearch()throws Exception{
//连接solr服务端
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//创建solr查询条件对象
SolrQuery solrQuery=new SolrQuery();
//查询所有
solrQuery.setQuery("*:*");
//查询并获取查询相应对象
QueryResponse queryResponse=solrServer.query(solrQuery);
//从查询相应中获取查询结果集对象
SolrDocumentList results=queryResponse.getResults();
//查询结果总数
System.out.println("========count========"+results.getNumFound());
//遍历查询结果集
for (SolrDocument doc : results) {
System.out.println("=============="+doc.get("id"));
System.out.println("=============="+doc.get("product_name"));
System.out.println("=============="+doc.get("product_price"));
System.out.println("=========================================");
}
}
@Test
public void testIndexSearch2()throws Exception{
//连接solr服务端
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//创建solr查询条件对象
SolrQuery solrQuery=new SolrQuery();
//查询关键字输入
solrQuery.setQuery("猫");
//设置默认搜素域
solrQuery.set("df","product_keywords");
//设置过滤查询
solrQuery.addFilterQuery("product_price:[10 TO 30]");
//设置排序
solrQuery.setSort("product_price", SolrQuery.ORDER.desc);
//设置分页
//设置起始条数
solrQuery.setStart(0);
//设置查询多少条
solrQuery.setRows(50);
//设置高亮显示
//高亮默认是关闭的,所以要手动开启
solrQuery.setHighlight(true);
//设置需要高亮显示的域
solrQuery.addHighlightField("product_name");
//设置高亮前缀
solrQuery.setHighlightSimplePre("<span style=\"color:red\">");
//设置高亮后缀
solrQuery.setHighlightSimplePost("</span>");
//查询并获取查询相应对象
QueryResponse queryResponse=solrServer.query(solrQuery);
//从查询相应中获取查询结果集对象
SolrDocumentList results=queryResponse.getResults();
//查询结果总数
System.out.println("========count========"+results.getNumFound());
//遍历查询结果集
for (SolrDocument doc : results) {
System.out.println("=============="+doc.get("id"));
System.out.println("=============="+doc.get("product_name"));
//获取高亮
Map<String,Map<String, List<String>>>highlighting=queryResponse.getHighlighting();
List<String>list=highlighting.get(doc.get("id")).get("product_name");
if(list!=null&&list.size()>0){
String hlName=list.get(0);
System.out.println("====high lighting===="+hlName);
}
System.out.println("=============="+doc.get("product_name"));
System.out.println("=============="+doc.get("product_price"));
System.out.println("=========================================");
}
}
}
查询结果如下: