TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
应用场景
当安装部署完solr之后,我们可以通过solrj来连接solr,进行新建,删除索引等等操作,达到全文检索的效果。
操作步骤
1. Solrj的使用
1.1什么是solrj
solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:
Solrj和图形界面操作的区别就类似于数据库中你使用jdbc和mysql客户端的区别一样。
1.2 添加solrj jar包
solrj5.4.0的jar包下载地址
2 初始化
步骤:
创建HttpSolrClient对象(solrj4的HttpSolrServer被废弃),通过它和Solr服务器建立连接;
说明:
这一步是第一步,通过URL来调用搭建的solr服务,让solr服务给我们提供增删改查索引服务:
3 添加域
步骤:
1、调用SchemaRequest.AddField,添加域的一个Map;
2、通过HttpSolrClient对象的request方法进行添加域属性;
说明:
这一步主要是向schema.xml中添加域,标识域的属性,是否存储,是否索引等。
添加域:
删除域:
更新域:
示例:
- [code] /** * 添加域或删除域 * @throws Exception * */
- @Test
- public void addFields() throws Exception{
- //创建HttpSolrClient,可以访问solr服务,参数是solr服务的url
- HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
- //相当于在managed-schema文件中加入一个field
- Map<String, Object> fields = new LinkedHashMap<>();
- fields.put("name","product_name"); //域名
- fields.put("type","text_ik"); //域的类型,可以是string,int,如果需要分词设为text_ik
- fields.put("indexed",true); //是否索引,默认为true
- fields.put("stored",true); //是否存储,默认为true
- fields.put("multiValued",false); //是否多值,默认为false
- fields.put("required",false); //是否必须,默认false,schema文件中有一个id已默认必须
- //添加域
- SchemaRequest.AddField addFieldtoSchema = new SchemaRequest.AddField(fields);
- server.request(addFieldtoSchema);
- //删除域
- // SchemaRequest.DeleteField delFieldtoSchema = new SchemaRequest.DeleteField("product_name");
- // server.request(delFieldtoSchema);
- //更新域
- // SchemaRequest.ReplaceField repFieldtoSchema = new SchemaRequest.ReplaceField(fields);
- // server.request(repFieldtoSchema);
- }
复制代码 [/code]
4 新增索引
步骤:
1、创建SolrInputDocument对象,然后通过它来添加域值;
2、调用SolrInputDocument的对象的addField方法添加域值;
3、通过HttpSolrClient对象将SolrInputDocument添加到索引库;(如果id存在,则进行修改操作);
4、调用HttpSolrClient对象的commit方法进行提交。
说明:
这一步主要是给值添加索引。其中域id是必须需要添加的,这是由底层配置文件决定的,id中有一个属性叫required,是唯一一个,如果不添加id,会报错。
添加,并提交:
示例:
- [code] /** * 添加域值或修改域值 * @throws Exception * 根据id来添加,如果id存在则看成是修改进行覆盖,如果id不存在则是添加 */
- @Test
- public void addFieldValue() throws Exception{
- //创建HttpSolrClient,可以访问solr服务,参数是solr服务的url
- HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
- //创建SolrInputDocument对象,然后通过它来添加域值。
- SolrInputDocument document = new SolrInputDocument();
- // 第一个参数:域的名称,域的名称必须是在schema.xml中定义的,也就是上一步操作了
- // 第二个参数:域的值
- // 注意:id的域不能少,因为底层schema配置文件决定,id是required的
- document.addField("id", "001");
- document.addField("product_name", "张家港特产沙洲优黄");
- document.addField("product_info", "沙洲优黄是江苏省张家港酿酒有限公司的著名产品。江苏省张家港酿酒有限公司是江苏酿酒行业重点骨干企业,紧靠张家港保税区和对外开放港口张家港,区域经济发达,自然条件优越,投资兴业环境优良。");
- //通过HttpSolrServer对象将SolrInputDocument添加到索引库。
- // 执行添加操作,如果该id存在,则进行修改
- server.add(document);
- //提交
- server.commit();
- }
复制代码 [/code]
5 修改索引
注:修改索引其实是和新增一样的,新增索引的时候域id是必须的,id也是唯一的:
如果新增的时候id不存在,则进行新增或添加操作;
如果新增的时候id存在,则进行修改操作,覆盖原来已添加的;
代码与新增过程保持不变。
6 删除索引
步骤:
1、通过调用HttpSolrClient对象的deleteByQuery方法进行删除操作;
2、调用HttpSolrClient对象的commit方法进行提交。
说明:
这一步主要通过solrj对已建的索引进行删除操作。
主要有以下三种形式:
根据id来删除索引:
根据查询条件来删除:
全部删除,注意慎用:
示例:
- [code] /** * 删除域值 * @throws Exception * 根据id来进行删除 */
- @Test
- public void delFieldValue() throws Exception{
- //创建HttpSolrClient,可以访问solr服务,参数是solr服务的url
- HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
- // 根据id删除
- // server.deleteById("001");
- // 根据查询条件删除
- server.deleteByQuery("product_name:沙洲优黄");
- // 全部删除、慎用!!!!
- // server.deleteByQuery("*:*");
- // 提交
- server.commit();
- }
复制代码 [/code]
7 查询索引
步骤:
1、创建solrQuery对象,来对对象设置查询条件;
2、创建QueryResponse对象,通过HttpSolrClient对象调用query方法,来获得执行搜索获得的返回值;
3、创建SolrDocumentList方法,通过QueryResponse对象调用getResults方法,来根据查询条件匹配出结果对象
4、最后进行遍历输出
说明:
这一步主要对前面新建了索引的数据进行查询。
查询参数:
创建solrQuery对象:
设置查询条件(q),两种写法:
设置过滤查询条件(fq),两种写法:
设置排序(sort),两种写法:
设置分页信息(start,rows):
设置fl指定返回结果字段:
设置默搜索域df:
设置高亮:
执行搜索获得返回值:
根据查询条件匹配出结果对象:
结果展示:
示例:
- [code] @Test
- public void search() throws Exception {
- // 创建HttpSolrServer,可以访问solr服务
- // 参数就是solr服务的url
- HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
- // 创建solrQuery对象
- SolrQuery query = new SolrQuery();
- // 设置q,查询条件
- //query.setQuery("product_name:张家港");
- query.set("q", "product_name:沙洲优黄");
- // 设置fq,过滤查询条件
- //query.setFilterQueries("product_info:张家港");
- query.set("fq", "product_info:江苏省");
- // 设置sort,排序
- //query.setSort("id", ORDER.desc);
- query.set("sort", "id desc");
- // 设置start、rows,分页信息(写上默认值)
- query.setStart(0);
- query.setRows(10);
- // 设置fl,即要显示的域的列表
- query.set("fl", "id,product_name","product_info");
- // 设置默认搜索域
- query.set("df", "product_info,product_name,id");
- // 设置高亮
- query.setHighlight(true);
- query.addHighlightField("product_info");
- query.addHighlightField("product_name");
- query.setHighlightSimplePre("<font style="color:red">");
- query.setHighlightSimplePost("</font>");
- // 执行搜索,并获得返回值
- QueryResponse response = server.query(query);
- // 根据查询条件匹配出的结果对象
- SolrDocumentList list = response.getResults();
- // 匹配出的结果总数
- long count = list.getNumFound();
- //输出查询结果
- System.out.println("匹配出的结果总数:" + count);
- for (SolrDocument solrDocument : list) {
- System.out.println("商品id:" + solrDocument.get("id"));
- System.out.println("商品名称:" + solrDocument.get("product_name"));
- System.out.println("商品信息:" + solrDocument.get("product_info"));
- }
- System.out.println("----------------------------------------------------");
- }
复制代码 [/code]
8 高亮设置
步骤:
1、创建solrQuery对象,来对对象设置查询条件;
2、创建QueryResponse对象,通过HttpSolrClient对象调用query方法,来获得执行搜索获得的返回值;
3、创建SolrDocumentList对象,通过QueryResponse对象调用getResults方法,来根据查询条件匹配出结果对象;
4、调用QueryResponse对象的getHighlighting方法获取高亮列表; 5、遍历结果列表,获得本文档的高亮信息;
6、循环遍历高亮后的信息,进行输出。
说明:
获取高亮列表:
获得文档高亮信息,以及高亮结果展示:
示例:
- [code] @Test
- public void search() throws Exception {
- // 创建HttpSolrServer,可以访问solr服务
- // 参数就是solr服务的url
- HttpSolrClient server = new HttpSolrClient("http://192.168.199.23:8080/solr/collection1");
- // 创建solrQuery对象
- SolrQuery query = new SolrQuery();
- // 设置q,查询条件
- //query.setQuery("product_name:张家港");
- query.set("q", "product_name:沙洲优黄");
- // 设置fq,过滤查询条件
- //query.setFilterQueries("product_info:张家港");
- query.set("fq", "product_info:江苏省");
- // 设置sort,排序
- //query.setSort("id", ORDER.desc);
- query.set("sort", "id desc");
- // 设置start、rows,分页信息(写上默认值)
- query.setStart(0);
- query.setRows(10);
- // 设置fl,即要显示的域的列表
- query.set("fl", "id,product_name","product_info");
- // 设置默认搜索域
- query.set("df", "product_info,product_name,id");
- // 设置高亮
- query.setHighlight(true);
- query.addHighlightField("product_info");
- query.addHighlightField("product_name");
- query.setHighlightSimplePre("<font style="color:red">");
- query.setHighlightSimplePost("</font>");
- // 执行搜索,并获得返回值
- QueryResponse response = server.query(query);
- // 根据查询条件匹配出的结果对象
- SolrDocumentList list = response.getResults();
- // 匹配出的结果总数
- long count = list.getNumFound();
- //获取高亮列表
- Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
- for (SolrDocument solrDocument : list) {
- System.out.println("商品id:" + solrDocument.get("id"));
- System.out.println("商品名称:" + solrDocument.get("product_name"));
- System.out.println("商品信息:" + solrDocument.get("product_info"));
- //获得本文档的高亮信息
- List<String> list2 = highlighting.get(solrDocument.get("id")).get("product_info");
- if(list2!=null){
- System.out.println("高亮后的信息:"+list2.get(0));
- }
- //获得本文档的高亮信息
- List<String> list3 = highlighting.get(solrDocument.get("id")).get("product_name");
- if(list2!=null){
- System.out.println("高亮后的信息:"+list3.get(0));
- }
- }
- }
复制代码 [/code]
|
|