【黑马程序员】面试题-利用solr实现商品的搜索功能
linux练习题

Linux系统实战1.Linux系统有哪些部分组成?Linux内核shell 文件系统应用程序2.新建一个文本文件有有哪些命令可以实现?Touch +包名Vi + 文件名3.Linux关机与重启命令?Shutdown+时间关机Reboot 重启4.Linux切换工作目录命令?cd /5.Linux显示工作路径命令?pwd6.Linux查看目录中的文件命令?ls7.Linux显示文件和目录由根目录开始的树形结构命令?8.Linux创建目录命令?9.Linux删除文件命令?10.Linux删除目录命令?11.Linux重命名/移动命令?12.Linux复制文件命令?13.Linux创建链接命令?14.Linux文件搜索命令?15.Linux创建用户组命令?16.Linux删除用户组命令?17.Linux重命令用户组命令?18.Linux创建用户命令?19.Linux删除用户命令?20.Linux修改用户属性命令?21.Linux修改密码命令?22.Linux设置权限命令?23.Linux改变文件用户组命令?24.Linux解压缩命令有哪些?25.Linux软件包升级及安装命令?26.Linux查年文件命令有哪些?27.Linux怎样查看进程?28.Linux怎样修改环境变量?29.Linux(centos)怎样修改防火墙?30.【上机】centos在vmware中的安装31.【上机】jdk的安装与验证32.【上机】Tomcat在centos的安装与使用33.【上机】在虚拟机上安装部署web项目(ssh带有CRUD的项目),并在windows34.系统上访问。
逆向工程、分页插件35.什么是MyBatis逆向工程?有什么好处?36.逆向工程原理是什么?37.逆向工程怎样指定数据库表?38.逆向工程如何定义Java对象名称?39.如何搭建逆向工程?40.逆向工程生成的代码怎样实现crud操作?41.什么是分页插件?有什么好处?42.分页插件如何调用?43.【上机】搭建逆向工程。
【黑马程序员】面试题-利用solr实现商品的搜索功能

【⿊马程序员】⾯试题-利⽤solr实现商品的搜索功能【⿊马程序员】⾯试题-利⽤solr实现商品的搜索功能问题提出:当我们访问购物⽹站的时候,我们可以根据我们随意所想的内容输⼊关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据不可能是根据数据库的字段查询的,那是怎么查询出来的呢,为什么千奇百怪的关键字都可以查询出来呢?答案就是全⽂检索⼯具的实现,luncence采⽤了词元匹配和切分词。
举个例⼦:北京天安门------luncence切分词:北京京天天安安门等等这些分词。
所以我们搜索的时候都可以检索到。
有⼀种分词器就是ik中⽂分词器,它有细粒度切分和智能切分,即根据某种智能算法。
这就使⽤solr的最⼤的好处:检索功能的实现。
使⽤步骤;(1)solr服务器搭建,因为solr是⽤java5开发的,所以需要jdk和tomcat。
搭建部署(2)搭建完成后,我们需要将要展⽰的字段引⼊solr的库中。
配置sring与solr结合,⼯程启动的时候启动solr(3)将数据库中的查询内容导⼊到solr索引库,这⾥使⽤的是solrj的客户端实现的。
具体使⽤可以参考api(4)建⽴搜索服务,供客户端调⽤。
调⽤solr,查询内容,这中间有分页功能的实现。
solr⾼亮显⽰的实现。
(5)客户端接收页⾯的请求参数,调⽤搜索服务,进⾏搜索。
业务字段判断标准:1、在搜索时是否需要在此字段上进⾏搜索。
例如:商品名称、商品的卖点、商品的描述(这些相当于将标签给了solr,导⼊商品数据后,solr对这些字段的对应的商品的具体内容进⾏分词切分,然后,我们就可以搜索到相关内容了)2、后续的业务是否需要⽤到此字段。
例如:商品id。
需要⽤到的字段:1、商品id2、商品title3、卖点4、价格5、商品图⽚6、商品分类名称7、商品描述Solr中的业务字段:1、id——》商品id其他的对应字段创建solr的字段。
[AppleScript] 纯⽂本查看复制代码01 02 03 04 05 06 0708 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23stored="true"/>stored="false" multiValued="true"/>重新启动tomcatSolr 是Apache下的⼀个顶级开源项⽬,采⽤Java开发,它是基于Lucene的全⽂搜索服务器。
solr索引搜索

Solr全文搜索服务1Solr介绍1.1什么是solrSolr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。
Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中。
Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
使用Solr 进行创建索引和搜索索引的实现方法很简单,如下:●创建索引:客户端(可以是浏览器可以是Java程序)用POST 方法向Solr 服务器发送一个描述Field 及其内容的XML 文档,Solr服务器根据xml文档添加、删除、更新索引。
●搜索索引:客户端(可以是浏览器可以是Java程序)用GET方法向Solr 服务器发送请求,然后对Solr服务器返回Xml、json等格式的查询结果进行解析,组织页面布局。
Solr不提供构建页面UI的功能,但是Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
1.2Solr和Lucene的区别Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索应用。
Lucene仅提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索应用。
Solr的目标是打造一款企业级的搜索引擎系统,它是基于Lucene一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。
2Solr安装配置2.1下载solrSolr和lucene的版本是同步更新的,最新的版本是5.2.1本课程使用的版本:4.10.3下载地址:/dist/lucene/solr/下载版本:4.10.3Linux下需要下载lucene-4.10.3.tgz,windows下需要下载lucene-4.10.3.zip。
seo面试题及答案

seo面试题及答案SEO面试题及答案一、单选题1. SEO代表什么?A. Search Engine OptimizationB. Standard Engine OptimizationC. Social Engine OptimizationD. Secured Engine Optimization答案:A2. 在SEO中,"白帽"技术指的是什么?A. 非法的搜索引擎优化手段B. 合法的搜索引擎优化手段C. 搜索引擎优化的软件D. 搜索引擎优化的服务答案:B3. 下列哪项不是搜索引擎优化的目标?A. 提高网站在搜索引擎中的排名B. 增加网站流量C. 减少网站跳出率D. 增加网站服务器的负载答案:D4. 什么是长尾关键词?A. 与网站主题无关的关键词B. 搜索量较低但转化率较高的关键词C. 由多个词汇组成的关键词D. 只有行业专家才会搜索的关键词答案:B5. 对于SEO来说,网站加载速度为什么重要?A. 它影响用户体验B. 它影响搜索引擎排名C. 它增加了网站内容的可信度D. 以上都是答案:D二、多选题6. 下列哪些因素会影响网站的搜索引擎排名?A. 网站内容的质量B. 网站的反向链接数量C. 网站的域名年龄D. 网站的社交媒体活跃度答案:A, B, C, D7. 在进行关键词研究时,你应该考虑哪些因素?A. 关键词的搜索量B. 关键词的竞争力C. 关键词与网站内容的相关性D. 关键词的商业价值答案:A, B, C, D8. 下列哪些是提高网站SEO的合法做法?A. 使用隐藏文本B. 购买高质量的反向链接C. 优化网站内部链接结构D. 过度使用关键词填充内容答案:B, C三、简答题9. 什么是“沙盒效应”?答:沙盒效应是指新网站在开始的一段时间内排名较低,这是搜索引擎用来防止垃圾网站操纵排名的一种机制。
新网站需要一段时间来证明自己的质量和可信度,之后才能获得更好的排名。
10. 如何对一个网页进行页面优化?答:对一个网页进行页面优化包括以下几个步骤:- 确保内容质量和相关性。
Solr系列六:solr搜索详解优化查询结果(分面搜索、搜索结果高亮、查询建议、折叠展开结。。。

Solr系列六:solr搜索详解优化查询结果(分⾯搜索、搜索结果⾼亮、查询建议、折叠展开结。
⼀、分⾯搜索1. 什么是分⾯搜索?分⾯搜索:在搜索结果的基础上进⾏按指定维度的统计,以展⽰搜索结果的另⼀⾯信息。
类似于SQL语句的group by分⾯搜索的⽰例:2. Solr中⽀持的分⾯查询字段分⾯、区间分⾯、决策树分⾯、查询分⾯2.1 字段分⾯执⾏搜索时,根据查询请求返回特定分⾯字段中找到的唯⼀值以及找到的⽂档数。
通⽤查询参数:facet:true/false 对当前搜索是否启⽤分⾯facet.query:指定⼀个额外的分⾯查询语句字段分⾯查询参数:facet.field:指定对哪个字段进⾏分⾯计算。
该参数可以多次指定以返回多个字段⽅⾯。
字段需是索引字段。
facet.sort:分⾯结果的排序⽅式:count:根据统计数量排,index:索引的词典顺序facet.limit:确定每个分⾯返回多少个唯⼀分⾯值。
可取值:整数>=-1,-1表⽰不限制,默认100。
facet.offset:对分⾯值进⾏分页,指定页偏移。
>=0 默认0。
facet.prefix:指定限制字段分⾯值必须以xxx开头,⽤以筛选分⾯值。
facet.missing:true/false,是否在分⾯字段中返回所有不包含值(值为缺失)的⽂档计数。
facet.mincount:指定分⾯结果中的分⾯值的统计数量>=mincount的才返回⽰例:sort、limit、offset、prefix、missing、mincount 可根据字段指定: f.filedname.facet.sort=count2.2 区间分⾯区间分⾯将数值或时间字段值分成⼀些区间段,按区间段进⾏统计。
区间分⾯查询参数:facet.range:指定对哪个字段计算区间分⾯。
可多次⽤该参数指定多个字段。
facet.range=price&facet.range=agefacet.range.start:起始值f.price.facet.range.start=0.0&f.age.facet.range.start=10stModified_dt.facet.range.start=NOW/DAY-30DAYSfacet.range.end:结束值f.price.facet.range.end=1000.0&f.age.facet.range.start=99stModified_dt.facet.range.end=NOW/DAY+30DAYSfacet.range.gap:间隔值,创建⼦区间。
Solr搜索引擎的设计和实现

Solr搜索引擎的设计和实现搜索引擎是当今互联网上最重要的工具之一。
对于企业和网站来说,搜索引擎不仅能够使用户更快地找到他们所需要的信息,而且还能够提高网站的可用性和搜索排名。
Solr搜索引擎是一个基于Lucene的搜索平台,可以提供快速、准确和可扩展的搜索功能。
在本文中,我们将探讨Solr搜索引擎的设计和实现。
一、Solr搜索引擎的概述Solr搜索引擎是一个开源的搜索平台,由Apache基金会开发和维护。
Solr搜索引擎的基础是Lucene搜索引擎,它在性能和可扩展性方面做出了大量的改进。
Solr搜索引擎可以满足不同的搜索需求,包括全文搜索、过滤搜索和数据聚合搜索等。
此外,Solr 搜索引擎还提供了丰富的管理界面和API,可以方便地配置和管理搜索应用程序。
二、Solr搜索引擎的架构Solr搜索引擎的架构由以下组件组成:1. HTTP服务器 - Solr搜索引擎基于HTTP协议实现,因此需要一个HTTP服务器来处理请求。
Solr搜索引擎提供了内置的Jetty服务器和外部Web服务器支持。
2. XML配置文件 - Solr搜索引擎的配置是通过XML文件实现的。
配置文件包括核心配置文件、请求处理器配置文件、查询解析器配置文件等。
3. Lucene索引库 - Solr搜索引擎建立在Lucene索引库的基础上,通过对Lucene索引库的扩展和优化,支持更加灵活的搜索和查询操作。
4. 请求处理器 - Solr搜索引擎的请求处理器负责处理用户提交的搜索请求。
Solr搜索引擎提供多个请求处理器,包括查询处理器、提交处理器、导入处理器和更新处理器等。
5. 查询解析器 - Solr搜索引擎的查询解析器是查询请求的重要组成部分,它负责将用户的查询请求解析为Lucene索引库的查询表达式。
6. 响应生成器 - Solr搜索引擎的响应生成器负责将查询结果转化为响应格式,包括XML、JSON和CSV等。
三、Solr搜索引擎的工作原理Solr搜索引擎的工作过程包括索引构建和搜索查询两个阶段。
Solr文档

Solr全文检索服务1企业站内搜索技术选型在一些大型门户网站、电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一些高级的搜索需求,比如:搜索速度要快、搜索结果按相关度排序、搜索内容格式不固定等,这里就需要使用全文检索技术实现搜索功能。
1.1单独使用Lucene实现单独使用Lucene实现站内搜索需要开发的工作量较大,主要表现在:索引维护、索引性能优化、搜索性能优化等,因此不建议采用。
1.2使用Google或Baidu接口通过第三方搜索引擎提供的接口实现站内搜索,这样和第三方引擎系统依赖紧密,不方便扩展,不建议采用。
1.3使用Solr实现基于Solr实现站内搜索扩展性较好并且可以减少程序员的工作量,因为S olr提供了较为完备的搜索引擎解决方案,因此在门户、论坛等系统中常用此方案。
2什么是Solr什么是SolrSolr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。
Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引。
Solr搜索只需要发送 HTTP GET 请求,然后对 Solr返回Xml、json等格式的查询结果进行解析,组织页面布局。
Solr不提供构建UI 的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
Solr与Lucene的区别Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索引擎。
solr简单搜索案例

solr简单搜索案例solr简单搜索案例使⽤Solr实现电商⽹站中商品信息搜索功能,可以根据关键字搜索商品信息,根据商品分类、价格过滤搜索结果,也可以根据价格进⾏排序,实现分页。
架构分为:1、 solr服务器2、⾃⼰的web服务器(需要开发)3、数据库mysql solr案例本案例⽤的springmvc+solr+mysql⾃⼰开发的应⽤1、 Controller获取搜索条件,并响应搜索结果到前台页⾯。
2、 Service使⽤solrj来调⽤solr的服务进⾏索引和搜索Service调⽤dao进⾏商品数据的维护时,要同步更新索引库(不实现)3、 Dao(本案例不实现)对商品数据进⾏维护和查询功能:接收service层传递过来的参数,根据参数查询索引库,返回查询结果。
参数:SolrQuery对象返回值:⼀个商品列表List<ProductModel>,还需要返回查询结果的总数量。
返回:ResultModel⽅法定义:ResultModel queryProduct(SolrQuery query) throws Exception;商品对象模型:public class ProductModel {// 商品编号private String pid;// 商品名称private String name;// 商品分类名称private String catalog_name;// 价格private float price;// 商品描述private String description;// 图⽚名称private String picture;}返回值对象模型public class ResultModel {// 商品列表private List<ProductModel> productList;// 商品总数private Long recordCount;// 总页数private int pageCount;// 当前页private int curPage;}Dao接⼝:public ResultModel productSearch(SolrQuery solrQuery) throws Exception; DaoImp:@Repositorypublic class ProductDaoimp implements ProductDao {@Autowiredprivate SolrServer solrServer;@Overridepublic ResultModel productSearch(SolrQuery solrQuery) throws Exception {// TODO Auto-generated method stubResultModel resultModel = new ResultModel();QueryResponse query = solrServer.query(solrQuery);SolrDocumentList results = query.getResults();resultModel.setRecordCount(results.getNumFound());List<ProductModel> productList = new ArrayList<>();for (SolrDocument doc : results) {ProductModel productModel = new ProductModel();String id = (String) doc.get("id");Map<String, Map<String, List<String>>> highlighting = query.getHighlighting();String productname = "";if (highlighting != null && highlighting.size() > 0) {List<String> list2 = highlighting.get(doc.get("id")).get("product_name");if (list2 != null) {productname = list2.get(0);} else {productname = (String) doc.get("product_name");}}productModel.setPid(id);productModel.setName(productname);productModel.setCatalog_name((String) doc.get("product_catalog_name"));productModel.setPicture((String) doc.get("product_picture"));productModel.setPrice(Float.parseFloat((String.valueOf(doc.get("product_price"))))); productList.add(productModel);}resultModel.setProductList(productList);return resultModel;}Service层(接⼝及实现):接⼝:public interface ProductService {ResultModel productSearch(String queryString,String catalog_name, String price, Integer page, String sort, Model model) throws Exception; }实现:@Service@Transactionalpublic class ProductServiceimp implements ProductService {private final int PAZE_SIZE = 8;@Autowiredprivate ProductDao productDao;@Overridepublic ResultModel productSearch(String queryString, String catalog_name, String price, Integer page, String sort,Model model) throws Exception {// TODO Auto-generated method stub// 拼装查询条件SolrQuery query = new SolrQuery();query.set("df", "product_keywords");// 查询条件if (null != queryString && !"".equals(queryString)) {query.setQuery(queryString);} else {query.setQuery("*:*");}// 商品分类名称过滤if (null != catalog_name && !"".equals(catalog_name)) {query.addFilterQuery("product_catalog_name:" + catalog_name);}// 价格区间过滤if (null != price && !"".equals(price)) {String[] strings = price.split("-");query.addFilterQuery("product_price:[" + strings[0] + " TO " + strings[1] + "]");}// 排序条件if ("1".equals(sort)) {query.setSort("product_price", ORDER.desc);} else {query.setSort("product_price", ORDER.asc);}if (null == page) {page = 1;}int start = (page - 1) * PAZE_SIZE;//设置默认搜索域query.setStart(page);query.setRows(PAZE_SIZE);// ⾼亮设置query.setHighlight(true);query.addHighlightField("product_name");query.setHighlightSimplePre("<span style=\"color:red\">");query.setHighlightSimplePost("</span>");// 查询商品列表ResultModel resultModel = productDao.productSearch(query);// 计算总页数long pages = ( resultModel.getRecordCount() / PAZE_SIZE);if ( resultModel.getRecordCount() % PAZE_SIZE > 0) {pages = pages + 1;}resultModel.setPageCount(pages);resultModel.setCurPage(page);return resultModel;}}Controller层:@Controllerpublic class ProductController {@Autowiredprivate ProductService productservice;@RequestMapping("/list")public String productSearch(String queryString,String catalog_name, String price, Integer page, String sort, Model model) throws Exception { ResultModel resultModel= productservice.productSearch(queryString,catalog_name, price, page, sort, model);model.addAttribute("result", resultModel);// 参数回显model.addAttribute("queryString", queryString);model.addAttribute("caltalog_name", catalog_name);model.addAttribute("price", price);model.addAttribute("sort", sort);model.addAttribute("page", page);return "product_list";}}POJO类:public class ProductModel {// 商品编号private String pid;// 商品名称private String name;// 商品分类名称private String catalog_name;// 价格private float price;// 商品描述private String description;// 图⽚名称private String picture;public void setPid(String pid) {this.pid = pid;}public String getName() {return name;}public void setName(String name) { = name;}public String getCatalog_name() {return catalog_name;}public void setCatalog_name(String catalog_name) {this.catalog_name = catalog_name;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public String getPicture() {return picture;}public void setPicture(String picture) {this.picture = picture;}}ResultModel类:public class ResultModel {// 商品列表private List<ProductModel> productList;// 商品总数private Long recordCount;// 总页数private Long pageCount;// 当前页private long curPage;public List<ProductModel> getProductList() {return productList;}public void setProductList(List<ProductModel> productList) {this.productList = productList;}public Long getRecordCount() {return recordCount;}public void setRecordCount(Long recordCount) {this.recordCount = recordCount;}public Long getPageCount() {return pageCount;}public void setPageCount(Long pageCount) {this.pageCount = pageCount;}public long getCurPage() {return curPage;}public void setCurPage(long curPage) {this.curPage = curPage;}}config:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance" xmlns:p="/schema/p"xmlns:context="/schema/context"xmlns:dubbo="/schema/dubbo" xmlns:mvc="/schema/mvc"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-4.0.xsd /schema/mvc /schema/mvc/spring-mvc-4.0.xsd/schema/dubbo /schema/dubbo/dubbo.xsd/schema/context /schema/context/spring-context-4.0.xsd"><!--注解扫描 --><context:component-scan base-package="cn.kingdee"></context:component-scan><!--注解驱动(为了提⾼运⾏速度) --><mvc:annotation-driven /><!--视图解析器 --><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass"value="org.springframework.web.servlet.view.JstlView" /><!--路径前缀 --><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp"></property></bean><!--注⼊solrServer--><bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer"><constructor-arg value="http://localhost:8080/solr"></constructor-arg></bean></beans><web-app xmlns:xsi="/2001/XMLSchema-instance"xmlns="/xml/ns/javaee"xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>springmvcssm</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springMvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.action</url-pattern></servlet-mapping></web-app>jsp:<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="/jsp/jstl/core"%><%@ taglib prefix="fmt" uri="/jsp/jstl/fmt" %><!DOCTYPE html><!-- saved from url=(0047)/list.html?cat=1315,1343,1355 --><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta content="utf-8" http-equiv="charset"><link rel="stylesheet" type="text/css"href="<c:url value='/resource'/>/base.css" media="all"><link rel="stylesheet" type="text/css"href="<c:url value='/resource'/>/plist20131112.css" media="all"><link rel="stylesheet" type="text/css"href="<c:url value='/resource'/>/list-page-20141009.css" media="all"><link rel="stylesheet" type="text/css"href="<c:url value='/resource'/>/pop_compare.css" media="all"><link rel="shortcut icon" type="image/ico"href="/favicon.ico"><script type="text/javascript"src="<c:url value='/resource'/>/jquery-1.2.6.pack.js"></script><style id="style-1-cropbar-clipper">/* Copyright 2014 Evernote Corporation. All rights reserved. */.en-markup-crop-options {top: 18px !important;left: 50% !important;margin-left: -100px !important;width: 200px !important;border: 2px rgba(255,255,255,.38) solid !important;border-radius: 4px !important;}.en-markup-crop-options div div:first-of-type {margin-left: 0px !important;}</style><script type="text/javascript">function query() {//执⾏关键词查询时清空过滤条件document.getElementById("catalog_name").value="";document.getElementById("price").value="";document.getElementById("page").value="";//执⾏查询queryList();}function queryList() {//提交表单document.getElementById("actionForm").submit();}function filter(key, value) {document.getElementById(key).value=value;queryList();}function sort() {var s = document.getElementById("sort").value;if (s != "1") {s = "1";} else {s = "0";}document.getElementById("sort").value = s;queryList();}function changePage(p) {var curpage = Number(document.getElementById("page").value);curpage = curpage + p;document.getElementById("page").value = curpage;queryList();}</script></head><body class="root61"><div id="shortcut-2013"><div class="w"><ul class="fl lh"><li class="fore1 ld"><b></b><a href="#" rel="nofollow">收藏京东</a></li><li class="fore2 ld"><s></s><a href="#" rel="nofollow">我的订单</a></li><li class="fore2-1 ld" id="jd-vip"><i></i><i></i><s></s><a target="_blank" rel="nofollow" href="/">会员俱乐部</a></li><li class="fore2-2 ld" id="jd-dakehu"> <i></i><s></s> <a href="/" target="_blank" rel="nofollow">企业频道</a> </li><li class="fore3 ld menu" id="app-jd" data-widget="dropdown" clstag="homepage|keycount|home2013|01d"><s></s><i></i><span class="outline"></span><span class="blank"></span><a href="/" target="_blank">⼿机京东</a><b></b></li><li class="fore4 ld menu" id="biz-service" data-widget="dropdown"><s></s><span class="outline"></span><span class="blank"></span>客户服务<b></b></li><li class="fore5 ld menu" id="site-nav" data-widget="dropdown"><s></s><span class="outline"></span><span class="blank"></span>⽹站导航<b></b></li></ul><span class="clr"></span></div></div><!--shortcut end--><div id="o-header-2013"><div class="w" id="header-2013"><div id="logo-2013" class="ld"><a href="/" hidefocus="true"><b></b><img src="<c:url value='/resource'/>/logo-201305.png" width="270" height="60" alt="京东"></a></div> <!--logo end--><div id="search-2013"><div class="i-search ld"><ul id="shelper" class="hide"></ul><form id="actionForm" action="list.action" method="POST"><div class="form"><input type="text" class="text" accesskey="s" name="queryString" id="key" value="${queryString }"autocomplete="off" onkeydown="javascript:if(event.keyCode==13) {query()}"><input type="button" value="搜索" class="button" onclick="query()"></div><input type="hidden" name="catalog_name" id="catalog_name" value="${catalog_name }"/><input type="hidden" name="price" id="price" value="${price }"/><input type="hidden" name="page" id="page" value="${result.curPage }"/><input type="hidden" name="sort" id="sort" value="${sort }"/></form></div><div id="hotwords"></div></div><!--search end--><div id="my360buy-2013"><dl><dt class="ld"><s></s><a href="/">我的京东</a><b></b></dt><dd><div class="loading-style1"><b></b>加载中,请稍候...</div></dd></dl></div><!--my360buy end--><div id="settleup-2013"><dl><dt class="ld"><s></s><span class="shopping"><span id="shopping-amount">0</span></span><a href="/cart/cart.html" id="settleup-url">去购物车结算</a> <b></b> </dt> <dd><div class="prompt"><div class="loading-style1"><b></b>加载中,请稍候...</div></div></dd></dl></div><!--settleup end--></div><!--header end--><div class="w"><div id="nav-2013"><div id="categorys-2013" class="categorys-2014"><div class="mt ld"><h2><a href="/allSort.aspx">全部商品分类<b></b></a></h2></div></div><div id="treasure"></div><ul id="navitems-2013"><li class="fore1" id="nav-home"><a href="/">⾸页</a></li><li class="fore2" id="nav-fashion"><a href="/">服装城</a></li><li class="fore3" id="nav-chaoshi"><a href="/chaoshi.html">⾷品</a></li><li class="fore4" id="nav-tuan"><a href="/" target="_blank">团购</a></li><li class="fore5" id="nav-auction"><a href="/">夺宝岛</a></li><li class="fore6" id="nav-shan"><a href="/">闪购</a></li><li class="fore7" id="nav-jinrong"><a href="/" target="_blank">⾦融</a></li></ul></div></div></div><div class="w"><div class="breadcrumb"><strong><a href="#">服饰内⾐</a></strong><span> > <ahref="#">⼥装</a> > <a href="#">T恤</a></span></div></div><div class="w main"><div class="right-extra"><div id="select" clstag="thirdtype|keycount|thirdtype|select" class="m"><div class="mt"><h1>T恤 -<strong> 商品筛选</strong></h1></div><div class="mc attrs"><div data-id="100001" class="brand-attr"><div class="attr"><div class="a-key">商品类别:</div><div class="a-values"><div class="v-tabs"><div class="tabcon"><div><a href="javascript:filter('catalog_name', '时尚卫浴')">时尚卫浴</a></div><div><a href="javascript:filter('catalog_name', '另类⽂体')">另类⽂体</a></div><div><a href="javascript:filter('catalog_name', '创意相架')">创意相架</a></div><div><a href="javascript:filter('catalog_name', '巧妙收纳')">巧妙收纳</a></div><div><a href="javascript:filter('catalog_name', '与钟不同')">与钟不同</a></div><div><a href="javascript:filter('catalog_name', '个性男⼈')">个性男⼈</a></div><div><a href="javascript:filter('catalog_name', '电脑周边')">电脑周边</a></div><div><a href="javascript:filter('catalog_name', '品质家电')">品质家电</a></div><div><a href="javascript:filter('catalog_name', '品味茶杯')">品味茶杯</a></div><div><a href="javascript:filter('catalog_name', '四季⽤品')">四季⽤品</a></div><div><a href="javascript:filter('catalog_name', '健康宝宝')">健康宝宝</a></div><div><a href="javascript:filter('catalog_name', '新潮美容')">新潮美容</a></div><div><a href="javascript:filter('catalog_name', '产品配件')">产品配件</a></div><div><a href="javascript:filter('catalog_name', '雅致灯饰')">雅致灯饰</a></div><div><a href="javascript:filter('catalog_name', '阳光车饰')">阳光车饰</a></div><div><a href="javascript:filter('catalog_name', '趣味纸抽')">趣味纸抽</a></div><div><a href="javascript:filter('catalog_name', '布艺⽑绒')">布艺⽑绒</a></div><div><a href="javascript:filter('catalog_name', '益智⼿⼯')">益智⼿⼯</a></div><div><a href="javascript:filter('catalog_name', '环保餐具')">环保餐具</a></div><div><a href="javascript:filter('catalog_name', '闪亮匙扣')">闪亮匙扣</a></div><div><a href="javascript:filter('catalog_name', '⼿机饰品')">⼿机饰品</a></div><div><a href="javascript:filter('catalog_name', '精品数码')">精品数码</a></div><div><a href="javascript:filter('catalog_name', '理财钱罐')">理财钱罐</a></div><div><a href="javascript:filter('catalog_name', '美味厨房')">美味厨房</a></div><div><a href="javascript:filter('catalog_name', '保健按摩')">保健按摩</a></div><div><a href="javascript:filter('catalog_name', '魅⼒⼥⼈')">魅⼒⼥⼈</a></div></div></div></div></div></div><div data-id="100002" class="prop-attrs"><div class="attr"><div class="a-key">价格:</div><div class="a-values"><div class="v-fold"><ul class="f-list"><li><a href="javascript:filter('price','0-9')">0-9</a></li><li><a href="javascript:filter('price','10-19')">10-19</a></li><li><a href="javascript:filter('price','20-29')">20-29</a></li><li><a href="javascript:filter('price','30-39')">30-39</a></li><li><a href="javascript:filter('price','40-49')">40-49</a></li><li><a href="javascript:filter('price','50-*')">50以上</a></li></ul></div></div></div></div></div></div><div id="filter"><div class="cls"></div><div class="fore1"><dl class="order"><dt>排序:</dt><dd><a href="javascript:sort()">价格</a><b></b></dd></dl><dl class="activity"><dd></dd></dl><div class="pagin pagin-m"><span class="text"><i>${result.curPage }</i>/${result.pageCount }</span> <a href="javascript:changePage(-1)" class="prev">上⼀页<b></b></a><a href="javascript:changePage(1)" class="next">下⼀页<b></b></a></div><div class="total"><span>共<strong>${result.recordCount }</strong>个商品<span class="clr"></span></div></div><!--商品列表开始--><div id="plist" class="m plist-n7 plist-n8 prebuy"><ul class="list-h"><c:forEach var="item" items="${result.productList }"><li pid="${item.pid }"><div class="lh-wrap"><div class="p-img"><a target="_blank" href="#"><img width="220" height="282" class="err-product" src="<c:url value='/images'/>/${item.picture}"></a></div><div class="p-name"><a target="_blank" href="#">${ }</a></div><div class="p-price"><strong>¥<fmt:formatNumber value="${item.price}" maxFractionDigits="2"/></strong><span id="p1269191543"></span> </div></div></li></c:forEach></ul></div><!--商品列表结束--></div><div class="left"><div id="sortlist" clstag="thirdtype|keycount|thirdtype|sortlist"class="m"><div class="mt"><h2>服饰内⾐</h2></div><div class="mc"><div class="item current"><h3><b></b>⼥装</h3><ul><li><a href="/1315-1343-1355.html">T恤</a></li><li><a href="/1315-1343-1354.html">衬衫</a></li><li><a href="/1315-1343-1356.html">针织衫</a></li><li><a href="/1315-1343-9713.html">雪纺衫</a></li><li><a href="/1315-1343-9710.html">卫⾐</a></li><li><a href="/1315-1343-9714.html">马甲</a></li><li><a href="/1315-1343-9719.html">连⾐裙</a></li><li><a href="/1315-1343-9720.html">半⾝裙</a></li><li><a href="/1315-1343-9715.html">⽜仔裤</a></li><li><a href="/1315-1343-9717.html">休闲裤</a></li><li><a href="/1315-1343-9716.html">打底裤</a></li><li><a href="/1315-1343-9718.html">正装裤</a></li><li><a href="/1315-1343-9711.html">⼩西装</a></li><li><a href="/1315-1343-9712.html">短外套</a></li><li><a href="/1315-1343-9708.html">风⾐</a></li><li><a href="/1315-1343-9706.html">⽑呢⼤⾐</a></li><li><a href="/1315-1343-9707.html">真⽪⽪⾐</a></li><li><a href="/1315-1343-9705.html">棉服</a></li><li><a href="/1315-1343-3983.html">⽻绒服</a></li><li><a href="/1315-1343-9722.html">⼤码⼥装</a></li><li><a href="/1315-1343-9721.html">中⽼年⼥装</a></li><li><a href="/1315-1343-9723.html">婚纱</a></li><li><a href="/1315-1343-11985.html">打底衫</a></li><li><a href="/1315-1343-11986.html">旗袍/唐装</a></li><li><a href="/1315-1343-11987.html">加绒裤</a></li><li><a href="/1315-1343-11988.html">吊带/背⼼</a></li><li><a href="/1315-1343-11989.html">⽺绒衫</a></li><li><a href="/1315-1343-11991.html">短裤</a></li><li><a href="/1315-1343-11993.html">⽪草</a></li><li><a href="/1315-1343-11996.html">礼服</a></li><li><a href="/1315-1343-11998.html">仿⽪⽪⾐</a></li><li><a href="/1315-1343-11999.html">⽺⽑衫</a></li><li><a href="/1315-1343-12000.html">设计师/潮牌</a></li></ul></div><div class="item"><h3><b></b>男装</h3></div><div class="item"><h3><b></b>内⾐</h3></div><div class="item"><h3><b></b>服饰配件</h3></div></div></div><div id="limitBuy"><div id="limitbuy9199"clstag="thirdtype|keycount|thirdtype|limitbuy536"class="m limitbuy hide"><div class="mt"><h2>服饰鞋帽</h2></div><div class="mc"><div id="clock9199" class="clock">正在加载…</div><div id="limit9199"></div></div></div></div><div id="ad_left" reco_id="6" class="m m0 hide"></div><!--⽤户最终购买--><div id="finalbuy" class="hide m m0" style="display: block;"><div class="mt"><h2>浏览<font color="red">T恤</font>最终购买</h2></div><div class="mc"></div></div><div id="weekRank" clstag="thirdtype|keycount|thirdtype|mrank"class="m rank"><div class="mt"><h2>⼀周销量排⾏</h2></div><div class="mc">。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【黑马程序员】面试题-利用solr实现商品的搜索功能问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据不可能是根据数据库的字段查询的,那是怎么查询出来的呢,为什么千奇百怪的关键字都可以查询出来呢?答案就是全文检索工具的实现,luncence采用了词元匹配和切分词。
举个例子:北京天安门------luncence切分词:北京京天天安安门等等这些分词。
所以我们搜索的时候都可以检索到。
有一种分词器就是ik中文分词器,它有细粒度切分和智能切分,即根据某种智能算法。
这就使用solr的最大的好处:检索功能的实现。
使用步骤;(1)solr服务器搭建,因为solr是用java5开发的,所以需要jdk和tomcat。
搭建部署(2)搭建完成后,我们需要将要展示的字段引入solr的库中。
配置sring与solr结合,工程启动的时候启动solr(3)将数据库中的查询内容导入到solr索引库,这里使用的是solrj的客户端实现的。
具体使用可以参考api(4)建立搜索服务,供客户端调用。
调用solr,查询内容,这中间有分页功能的实现。
solr高亮显示的实现。
(5)客户端接收页面的请求参数,调用搜索服务,进行搜索。
业务字段判断标准:1、在搜索时是否需要在此字段上进行搜索。
例如:商品名称、商品的卖点、商品的描述(这些相当于将标签给了solr,导入商品数据后,solr对这些字段的对应的商品的具体内容进行分词切分,然后,我们就可以搜索到相关内容了)2、后续的业务是否需要用到此字段。
例如:商品id。
需要用到的字段:1、商品id2、商品title3、卖点4、价格5、商品图片6、商品分类名称7、商品描述Solr中的业务字段:1、id——》商品id其他的对应字段创建solr的字段。
[AppleScript] 纯文本查看复制代码?01 02 03 04 05 06 07<field name="item_title" type="text_ik" indexed="true" stored="true"/><field name="item_sell_point" type="text_ik" indexed="true" stored="true"/><field name="item_price" type="long" indexed="true"08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23stored="true"/><field name="item_image" type="string" indexed="false" stored="true" /><field name="item_category_name" type="string" indexed="true" stored="true" /><field name="item_desc" type="text_ik" indexed="true" stored="false" /><field name="item_keywords" type="text_ik" indexed="true"stored="false" multiValued="true"/><copyField source="item_title" dest="item_keywords"/><copyField source="item_sell_point" dest="item_keywords"/><copyField source="item_category_name" dest="item_keywords"/><copyField source="item_desc" dest="item_keywords"/>重新启动tomcatSolr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。
Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务。
有效降低频繁访问数据库对数据库造成的压力。
第一步:将solr部署在linux系统下。
第二步:solrJ是solr的客户端,使用它需要依赖solrJ的jar包。
第三步:将数据库的内容添加到solr的索引库,这样查询就在索引库查询,而不是数据库了。
controller层:[AppleScript] 纯文本查看复制代码?01 02 03 04 05 06 07 08 09 10 11 12@Controller@RequestMapping("/manager")public class ItemController {@Autowiredprivate ItemService itemService;@RequestMapping("/importall")@ResponseBodypublic TaotaoResult importAllItem(){TaotaoResult result=itemService.importAllItem();return result;}}<br>service层编写:<br>多表查询商品,显示在页面的逻辑编写:<br>mapper.java[AppleScript] 纯文本查看复制代码?01 02 03 04 05 06 07 08 09 10 11package com.taotao.search.mapper;import java.util.List;import com.taotao.search.pojo.Item;public interface ItemMapper {List<item> getItemList();}</item>mapper.xml [AppleScript] 纯文本查看复制代码?01 02 03 04<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.taotao.search.mapper.ItemMapper">05 06 07 08 09 10 11 12 13 14 15 16 17<select id="getItemList" resultType="com.taotao.search.pojo.Item"> SELECTa.id,a.title,a.sell_point,a.price,a.image,b. NAME category_nameFROMtb_item aLEFT JOIN tb_item_cat b ON a.cid = b.id</select></mapper>四步:从索引库查询的逻辑编写:[AppleScript] 纯文本查看复制代码?01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24//从索引库里面获取商品信息,现在这个dao层是从索引库获取信息,因为之前的写的逻辑是将db里面的数据导入到索引库。
后面的查询都是从索引库中进行,而不从数据库了@Repositorypublic class SearchDaoImpl implements SearchDao {@Autowiredprivate SolrServer solrServer;@Overridepublic SearchResult search(SolrQuery query) throws Exception {//这是从索引库里面,直接执行查询QueryResponse response = solrServer.query(query);//获取查询的结果SolrDocumentList documentList=response.getResults();SearchResult result=new SearchResult();//这是获取总记录数result.setRecordCount(documentList.getNumFound());List<Item> itemList=new ArrayList<>();//商品的高亮显示,即当鼠标移到字上时,该字体变色,这是从QueryResponse中获取的25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();for (SolrDocument solrDocument : documentList) {//每个SolrDocument都是一个商品pojo的内容,所以这里要创建一个商品的pojo对象,来获取详细的字段Item item=new Item();item.setId((String)solrDocument.get("id"));//高亮显示是title的高亮显示List<String> list =highlighting.get(solrDocument.get("id")).get("item_title");String title="";if (list!=null && list.size()>0) {title=list.get(0);}else{title=(String)solrDocument.get("item_title");}item.setTitle(title);item.setPrice((Long)solrDocument.get("item_price"));item.setImage((String)solrDocument.get("item_image"));item.setCategory_name((String) solrDocument.get(" item_category_name"));item.setSell_point((String)solrDocument.get("item_sell_point"));itemList.add(item);}result.setItemList(itemList);return result;}}第五步:索引库内容建立好后,开始编写对外的服务接口,即通过条件搜索具体的商品,比如手机,会显示出总共的手机列表信息,第几页,总共多少页,总共多少个搜索结果请求的url:file:///C:/Users/ADMINI~1.WIN/AppData/Local/Temp/V7(XMW RN]%7BG8~CI%7DBCCR3QC.gif arch/query?q={查询条件}&page={page}&rows={rows}返回的结果:TaotaoResult包装商品列表。