solr介绍及使用

什么是solr:

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中。

Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化

使用Solr 进行创建索引和搜索索引的实现方法很简单,如下:

  1. 创建索引:客户端(可以是浏览器可以是Java程序)用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr服务器根据xml文档添加、删除、更新索引 。
  2. 搜索索引:客户端(可以是浏览器可以是Java程序)用 GET方法向 Solr 服务器发送请求,然后对 Solr服务器返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建页面UI的功能,但是Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况

Solr的使用:

schema.xml它是Solr数据表配置文件,在此配置文件中定义了域以及域的类型还有其他一些配置,在solr中域必须先定义后使用

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />

 

  1. Name:域的名称
  2. Type:域的类型
  3. Indexed:是否索引
  4. Stored:是否存储
  5. Required:是否必须
  6. multiValued:是否是多值,存储多个值时设置为true,solr允许一个Field存储多个值,比如存储一个用户的好友id(多个),商品的图片(多个,大图和小图)

复制域:

<copyField source="cat" dest="text" />   dest是目标域:目标域必须可以多只存储

动态域:

<dynamicField  name="*_i"  type="int"  indexed="true"  stored="true"/>

搜索时只有有一个***_i就可以匹配这个域不需要重新定义这个域  例如product_i 和 goods_i 都可以匹配这个域

添加索引:

@Test

public void addDocument() throws Exception {

 

// 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。

HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");

// 2、 创建SolrInputDocument对象,然后通过它来添加域。

SolrInputDocument document = new SolrInputDocument();

// 第一个参数:域的名称,域的名称必须是在schema.xml中定义的

document.addField("id", "c0001");

document.addField("title_ik", "使用solrJ添加的文档");

document.addField("content_ik", "文档的内容");

document.addField("product_name", "商品名称");

// 3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。

server.add(document);

// 4、 提交。

server.commit();

}

如果这个域中id是唯一键,若添加的id已经存在则执行更新操作,若添加的id不存在则执行插入的操作

查询操作

q - 查询关键字  如果查询所有则是 *:*

fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的

query.set("fq","price:[10 TO 50]");    * 代表无限   

价格大于50   query.set("fq","price:[50 TO *]");

价格小于50 query.set("fq","price:[*  TO 50]");

sort 排序

query.setSortField("weekSales_i", SolrQuery.ORDER.desc);

start - 分页显示使用,开始记录下标,从0开始

rows - 指定返回结果最多有多少条记录,配合start来实现分页

fl - 指定返回那些字段内容,用逗号或空格分隔多个

df-指定一个搜索Field  即默认域

 

@Test

public void queryIndex2() throws Exception {

// 创建HttpSolrServer对象,通过它和Solr服务器建立连接。

HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");

// 创建SolrQuery对象

SolrQuery query = new SolrQuery();

// 设置查询条件

query.setQuery("钻石");

// 设置过滤条件

query.setFilterQueries("product_catalog_name:幽默杂货");

// 设置排序

query.setSort("product_price", ORDER.desc);

// 设置分页信息

query.setStart(0);

query.setRows(10);

// 设置显得的域的列表

query.setFields("id", "product_name", "product_price",

"product_catalog_name", "product_picture");

 

// 设置默认搜索域

query.set("df", "product_name");

 

// 设置高亮

query.setHighlight(true);

query.addHighlightField("product_name");

query.setHighlightSimplePre("<em>");

query.setHighlightSimplePost("</em>");

 

// 调用server的查询方法,查询索引库

QueryResponse response = server.query(query);

 

// 查询结果

SolrDocumentList results = response.getResults();

 

// 查询结果总数

long cnt = results.getNumFound();

System.out.println("查询结果总数:" + cnt);

 

for (SolrDocument solrDocument : results) {

System.out.println(solrDocument.get("id"));

 

String productName = (String) solrDocument.get("product_name");

 

//获取高亮列表

Map<String, Map<String, List<String>>> highlighting = response

.getHighlighting();

//获得本文档的高亮信息

List<String> list = highlighting.get(solrDocument.get("id")).get(

"product_name");

//如果有高亮,则把商品名称赋值为有高亮的那个名称

if (list != null) {

productName = list.get(0);

}

 

System.out.println(productName);

System.out.println(solrDocument.get("product_price"));

System.out.println(solrDocument.get("product_catalog_name"));

System.out.println(solrDocument.get("product_picture"));

 

}

}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值