SolrJ 复杂查询 高亮显示

SolrJ 复杂查询 高亮显示

上一章搭建了Solr服务器和导入了商品数据,本章通过SolrJ去学习Solr在企业中的运用。笔者最先是通过公司的云客服系统接触的Solr,几百万的留言秒秒钟就查询并高亮显示,不同的广告员还可以只检索自己所属的国家的留言。瞬间就跪拜在Solr的石榴裙下。现在看来其实就是 q + fq + lg 的用法。通过本章内容你将会学习到Solr分词配置;SolrJ的复杂查询和关键字高亮语法;Solr各版本之间SolrJ的语法差异;Solr7与Spring的整合等使用技能。

需求:搜索栏输入关键字全文检索商品,选择类目或价格区间筛选商品,选择价格排序商品。
技术:SolrJ,Spring,SpringMVC
说明:通过本章内容你将会学习到Solr分词配置;SolrJ的复杂查询和关键字高亮语法;Solr各版本之间SolrJ的语法差异;Solr7与Spring的整合;搜索商品开发思路;本教程页面来源网络,笔者做了简单的修改,仅供学习使用。关注文章底部微信公众号领红包哦!
源码:见文章底部
项目结构:

项目结构

效果图:

效果图

Solr分词配置

solr7 安装部署:

[tomtop926@localhost lib]$ll IK* -rw-rw-r--. 1 tomtop926 tomtop926 1165908 Dec 6 15:06 IKAnalyzer2012FF_u1.jar [tomtop926@localhost lib]$cd ../classes/ [tomtop926@localhost classes]$ll total 16 -rw-rw-r--. 1 tomtop926 tomtop926 168 Dec 6 15:08 ext_stopword.dic -rw-rw-r--. 1 tomtop926 tomtop926 419 Dec 6 15:07 IKAnalyzer.cfg.xml -rw-r--r--. 1 tomtop926 tomtop926 1421 Dec 5 12:09 log4j.properties -rw-rw-r--. 1 tomtop926 tomtop926 12 Dec 6 15:08 mydict.dic [tomtop926@localhost classes]$cd [tomtop926@localhost ~]$vim solr/apache-tomcat-8.5/solrhome/new_core/conf/managed-schema <fieldType> <analyzer type="index"> <tokenizer useSmart="true"/> </analyzer> <analyzer type="query"> <tokenizer useSmart="true"/> </analyzer> </fieldType> ...... <field type="string" indexed="true" stored="true"/> <field type="string" indexed="true" stored="true"/> <field type="text_ik" indexed="true" stored="false"/> <field type="text_ik" indexed="true" stored="true"/> <field type="string" indexed="false" stored="true"/> <field type="pfloat" indexed="true" stored="true"/> <field type="text_ik" multiValued="true" indexed="true" stored="false"/> <copyField source="product_description" dest="product_keywords"/> <copyField source="product_name" dest="product_keywords"/>

第一步:将IKAnalyzer2012.jar导入到tomcat/webapps/solr/WEB-INF/lib目录下
第二步:将ext_stopword.dic(停用词词典),IKAnalyzer.cfg.xml(配置文件),mydict.dic(自定义词典) 导入到tomcat/webapps/solr/WEB-INF/classes
第三步:编辑managed-schema 文件,配置中文分析器
第四步:并配置业务域(solr字段),给product_description,product_name设置中文分词并放在product_keywords目标域中。下一章会重点介绍schema文件。

SolrJ 复杂查询 高亮显示

SolrJ 单元测试

在采用Solr实现全文检索功能时,我们需对Solr的java客户端SolrJ语法有一定的了解。这里创建 SolrJTest.java 类测试SolrJ的连接,查询,过滤,排序,分页,高亮等功能,以及索引的维护。

package com.itdragon.test; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery.ORDER; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.params.MapSolrParams; import org.junit.Test; public class SolrJTest { /** * 不同Solr 版本之间创建连接方式不同 * Solr4 : SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr"); * Solr5 :HttpSolrClient solrClient = new HttpSolrClient("http://localhost:8080/solr/new_core"); * Solr7 :HttpSolrClient solrClient = new HttpSolrClient.Builder("http://localhost:8080/solr/new_core").build(); * * SolrQuery 对应的api接口 * q : setQuery * fq : addFilterQuery * sort : setSort * start : setStart(0); * rows : setRows(10); * fl : setFields * */ private final static String BASE_SOLR_URL = "http://localhost:8080/solr/new_core"; // solrJ 基础用法 @Test public void queryDocumentBasic() throws Exception { // 创建连接 HttpSolrClient solrClient = new HttpSolrClient.Builder(BASE_SOLR_URL).build(); /* 不推荐 Map<String, String> queryParamMap = new HashMap<String, String>(); // 封装查询参数 queryParamMap.put("q", "*:*"); // 添加到SolrParams对象 MapSolrParams query = new MapSolrParams(queryParamMap); */ // 设置查询条件 SolrQuery query = new SolrQuery(); query.setQuery("*:*"); // 执行查询 QueryResponse response = solrClient.query(query); // 获取doc文档 SolrDocumentList documents = response.getResults(); System.out.println("共查询到记录:" + documents.getNumFound()); for (SolrDocument solrDocument : documents) { System.out.println("ID : " + solrDocument.get("id") + " \t Name : " + solrDocument.get("product_name")); } } // solrJ 的复杂查询 @Test public void queryDocument() throws Exception { // 创建连接 HttpSolrClient solrClient = new HttpSolrClient.Builder(BASE_SOLR_URL).build(); SolrQuery query = new SolrQuery(); // 设置查询条件 query.setQuery("product_name:街头原木电话亭"); // 设置分页信息 query.setStart(0); query.setRows(10); // 设置排序 query.setSort("id", ORDER.desc); // 设置显示的Field的域集合,即设置那些值有返回值 query.setFields("id,product_name"); // 设置默认域 query.set("df", "product_keywords"); // 设置高亮信息 query.setHighlight(true); query.addHighlightField("product_name"); query.setHighlightSimplePre("<em>"); query.setHighlightSimplePost("</em>"); // 执行查询 QueryResponse response = solrClient.query(query); // 获取doc文档 SolrDocumentList documents = response.getResults(); System.out.println("共查询到记录:" + documents.getNumFound()); // 获取高亮显示信息 Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); for (SolrDocument doc : documents) { System.out.println(doc.get("id")); List<String> hightDocs = highlighting.get(doc.get("id")).get("product_name"); if (hightDocs != null) System.out.println("高亮显示的商品名称:" + hightDocs.get(0)); else { System.out.println(doc.get("product_name")); } } } // 添加索引 @Test public void addDocuments() throws SolrServerException, IOException { HttpSolrClient solrClient = new HttpSolrClient.Builder(BASE_SOLR_URL).withConnectionTimeout(10000) .withSocketTimeout(60000).build(); // 创建一个文档对象 SolrInputDocument document = new SolrInputDocument(); document.addField("id", "add-001"); document.addField("product_name", "ITDragon-Solr7系列博客"); // 将文档对象写入到索引库中 solrClient.add(document); // 提交 solrClient.commit(); } // 更新的逻辑:先通过id将直接的数据删掉,然后再创建,所以update 和 create 是同一代码 // 删除/批量删除索引 @Test public void deleteDocument() throws SolrServerException, IOException { HttpSolrClient solrClient = new HttpSolrClient.Builder(BASE_SOLR_URL).build(); //solrClient.deleteById("add-001"); 通过id删除 /* 批量删除 ArrayList<String> ids = new ArrayList<String>(); ids.add("1"); ids.add("2"); solrClient.deleteById(ids); */ solrClient.deleteByQuery("id:add-001"); // 通过查询条件删除 solrClient.commit(); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzzzg.html