广告
返回顶部
首页 > 资讯 > 精选 >如何使用solr实现商品的搜索功能
  • 465
分享到

如何使用solr实现商品的搜索功能

solr 2023-05-30 20:05:25 465人浏览 独家记忆
摘要

小编给大家分享一下如何使用solr实现商品的搜索功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为什么要用solr服务,为什么要用luncence?问题提出:当

小编给大家分享一下如何使用solr实现商品的搜索功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

为什么要用solr服务,为什么要用luncence?

问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据不可能是根据数据库的字段查询的,那是怎么查询出来的呢,为什么千奇百怪的关键字都可以查询出来呢?

答案就是全文检索工具的实现,luncence采用了词元匹配和切分词。举个例子:北京天安门------luncence切分词:北京 京天 天安 安门 等等这些分词。所以我们搜索的时候都可以检索到。

有一种分词器就是IKAnalyzer中文分词器,它有细粒度切分和智能切分,即根据某种智能算法

这就使用solr的最大的好处:检索功能的实现。

使用步骤;

(1)solr服务器搭建,因为solr是用java5开发的,所以需要jdk和tomcat。搭建部署

(2)搭建完成后,我们需要将要展示的字段引入solr的库中。配置spring与solr结合,工程启动的时候启动solr

(3)将数据库中的查询内容导入到solr索引库,这里使用的是solrj的客户端实现的。具体使用可以参考api

(4)建立搜索服务,供客户端调用。调用solr,查询内容,这中间有分页功能的实现。solr高亮显示的实现。

(5)客户端接收页面的请求参数,调用搜索服务,进行搜索。

业务字段判断标准:

在搜索时是否需要在此字段上进行搜索。例如:商品名称、商品的卖点、商品的描述

(这些相当于将标签给了solr,导入商品数据后,solr对这些字段的对应的商品的具体内容进行分词切分,然后,我们就可以搜索到相关内容了)

后续的业务是否需要用到此字段。例如:商品id。

需要用到的字段:

商品id

商品title

卖点

价格

商品图片

商品分类名称

商品描述

Solr中的业务字段:

id——》商品id

其他的对应字段创建solr的字段。

<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" stored="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"/>

重新启动Tomcat

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化

Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务。有效降低频繁访问数据库对数据库造成的压力。

将solr部署在linux系统下。

solrJ是solr的客户端,使用它需要依赖solrJ的jar包。

将数据库的内容添加到solr的索引库,这样查询就在索引库查询,而不是数据库了。

controller层:

@Controller@RequestMapping("/manager")public class ItemController { @Autowired private ItemService itemService; @RequestMapping("/importall") @ResponseBody public TaotaoResult importAllItem(){   TaotaoResult result= itemService.importAllItem();   return result; }}<br>service层编写:<br>多表查询商品,显示在页面的逻辑编写:<br>mapper.java
package com.taotao.search.mapper; import java.util.List; import com.taotao.search.pojo.Item; public interface ItemMapper { List<Item> getItemList(); }

mapper.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""Http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.taotao.search.mapper.ItemMapper"><select id="getItemList" resultType="com.taotao.search.pojo.Item"> SELECT a.id, a.title, a.sell_point, a.price, a.image, b. NAME category_name FROM tb_item a LEFT JOIN tb_item_cat b ON a.cid = b.id</select></mapper>

如何使用solr实现商品的搜索功能

从索引库查询的逻辑编写:

//从索引库里面获取商品信息,现在这个dao层是从索引库获取信息,因为之前的写的逻辑是将db里面的数据导入到索引库。后面的查询都是从索引库中进行,而不从数据库了@Repositorypublic class SearchDaoImpl implements SearchDao { @Autowired private SolrServer solrServer;  @Override public 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中获取的  Map<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; } }

索引库内容建立好后,开始编写对外的服务接口,即通过条件搜索具体的商品,比如手机,会显示出总共的手机列表信息,第几页,总共多少页,总共多少个搜索结果

如何使用solr实现商品的搜索功能

请求的url:

/search/query?q={查询条件}&page={page}&rows={rows}

返回的结果:TaotaoResult包装商品列表。

创建一个sql语句对应的pojo,单独建立一个pojo

用来装显示的内容列表:

public class Item {  private String id;  private String title;  private String sell_point;  private long price;  private String image;  private String category_name;  private String item_des; }

controller层:

@Controllerpublic class SearchController { @Autowired private SearchService searchService;   @RequestMapping(value="/query", method=RequestMethod.GET) @ResponseBody public TaotaoResult search(@RequestParam("q")String queryString,   @RequestParam(defaultValue="1")Integer page,   @RequestParam(defaultValue="60")Integer rows) {  //查询条件不能为空  if (StringUtils.isBlank(queryString)) {   return TaotaoResult.build(400, "查询条件不能为空");  }  SearchResult searchResult = null;  try {   queryString = new String(queryString.getBytes("iso8859-1"), "utf-8");   searchResult = searchService.search(queryString, page, rows);  } catch (Exception e) {   e.printStackTrace();   return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));  }  return TaotaoResult.ok(searchResult);    }  }<br><br><br>1<span >service层:利用solrJ的solrQurery来查询:</span>

前提是要写好如何从索引库读取数据:  

下面是服务的接口层编写:

controller:

@Controllerpublic class SearchController { @Autowired private SearchService searchService;   @RequestMapping(value="/query", method=RequestMethod.GET) @ResponseBody public TaotaoResult search(@RequestParam("q")String queryString,   @RequestParam(defaultValue="1")Integer page,   @RequestParam(defaultValue="60")Integer rows) {  //查询条件不能为空  if (StringUtils.isBlank(queryString)) {   return TaotaoResult.build(400, "查询条件不能为空");  }  SearchResult searchResult = null;  try {   queryString = new String(queryString.getBytes("iso8859-1"), "utf-8");   searchResult = searchService.search(queryString, page, rows);  } catch (Exception e) {   e.printStackTrace();   return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));  }  return TaotaoResult.ok(searchResult);    }  }
@Servicepublic class SearchServiceImpl implements SearchService { @Autowired private SearchDao searchDao;    @Override public SearchResult search(String queryString, int page, int rows) throws Exception { SolrQuery query=new SolrQuery(); query.setQuery(queryString); query.setStart((page-1)*rows); query.setRows(rows); //设置默认的查询搜索域,即默认的查询 query.set("df","item_keywords"); //设置高亮显示 query.setHighlight(true);   query.addHighlightField("item_title"); query.setHighlightSimplePre("<em style=\"color:red\">"); query.setHighlightSimplePost("</em>");//执行查询 SearchResult searchResult = searchDao.search(query); //根据结果来计算商品总共多少页 long recordCount=searchResult.getRecordCount(); long pageCount=recordCount/rows; if (recordCount % rows > 0) {  pageCount++;  } searchResult.setPageCount(pageCount); searchResult.setCurPage((long) page);    return searchResult; } }

客户端通过输入商品来实现搜索功能:

controller层:

@Controller

public class SearchController { @Autowired private SearchService searchService;   @RequestMapping("/search") public String search(@RequestParam("q")String queryString, @RequestParam(defaultValue="1")Integer page, Model model) {  if (queryString != null) {   try {    queryString = new String(queryString.getBytes("iso8859-1"), "utf-8");   } catch (UnsupportedEncodingException e) {    e.printStackTrace();   }  }  SearchResult searchResult = searchService.search(queryString, page);  //向页面传递参数  model.addAttribute("query", queryString);  //model.addAttribute("totalPages", searchResult.getPageCount());  model.addAttribute("itemList", searchResult.getItemList());  model.addAttribute("page", page);     return "search";    }}

service层:

@Servicepublic class SearchServiceImpl implements SearchService {   @Value("${SEARCH_BASE_URL}") private String SEARCH_BASE_URL;  @Override public SearchResult search(String queryString, int page) {  //这里需要的是连接+参数.这里每页显示的记录条数,可以传递也可以不用传递  // 调用taotao-search的服务  //查询参数  Map<String, String> param = new HashMap<>();  param.put("q", queryString);  param.put("page", page + "");  try {   //调用服务   String JSON = HttpClientUtil.doGet(SEARCH_BASE_URL, param);   //把字符串转换成java对象   TaotaoResult taotaoResult = TaotaoResult.fORMatToPojo(json, SearchResult.class);   SearchResult result = (SearchResult) taotaoResult.getData();   return result;        } catch (Exception e) {   e.printStackTrace();   return null;  }   } }

以上是“如何使用solr实现商品的搜索功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 如何使用solr实现商品的搜索功能

本文链接: https://www.lsjlt.com/news/220856.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用solr实现商品的搜索功能
    小编给大家分享一下如何使用solr实现商品的搜索功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为什么要用solr服务,为什么要用luncence?问题提出:当...
    99+
    2023-05-30
    solr
  • 买菜系统中如何实现商品搜索功能?
    随着互联网的发展,传统的购物方式已经逐渐被线上购物所取代。如今,越来越多的人选择在网上购买日常生活所需的食品。因此,一个完善的买菜系统是必不可少的。在买菜系统中,商品搜索功能无疑是一个非常重要的功能。本文将介绍如何实现一个高效、准确的商品搜...
    99+
    2023-11-01
    实现功能 商品搜索 买菜系统
  • 微信小程序实现搜索商品和历史记录的功能
    本文主要基于微信小程序实现和uni-app实现搜索商品和历史记录的功能。 不详细介绍,主看代码注释即可!! 1、搜索组件页面代码块 <template>   <vi...
    99+
    2022-11-13
  • 如何使用PHP实现商品推荐功能
    随着电子商务的不断发展,商品推荐功能已经成为了所有网站不可或缺的一部分。商品推荐功能可以为用户提供更加个性化的购物体验,从而提高网站用户的活跃度和转化率。而PHP作为最流行的Web开发语言之一,可以很好地实现商品推荐功能。本文将介绍如何使用...
    99+
    2023-05-25
    PHP数据分析 PHP推荐算法 商品推荐逻辑
  • MySQL 实现点餐系统的菜品搜索功能
    MySQL 实现点餐系统的菜品搜索功能,需要具体代码示例标题:MySQL 实现点餐系统的菜品搜索功能在点餐系统中,菜品搜索功能是非常重要且常见的功能之一。借助MySQL数据库的强大功能,我们可以轻松地实现菜品搜索功能,为用户提供更快捷、更方...
    99+
    2023-11-01
    MySQL 点餐系统 菜品搜索
  • PHP商城中的关键词搜索功能实现
    在现如今的电商时代,搜索功能已成为了电商网站上不可或缺的一部分,能够大大提高用户的购物体验。在PHP商城中,关键词搜索功能更是实现了这个功能的集大成者。本文将从关键词搜索的原理开始,深入探讨PHP商城中的关键词搜索功能实现。一、关键词搜索原...
    99+
    2023-05-22
    PHP 商城 关键词搜索 功能实现
  • javaweb搜索功能如何实现
    要实现JavaWeb的搜索功能,可以按照以下步骤进行:1. 建立数据库:创建一个适合存储搜索内容的数据库表。例如,可以创建一个包含标...
    99+
    2023-09-21
    javaweb
  • 如何使用PHP实现商城的热门商品推荐功能
    随着电商的快速发展,更多的企业开始选择在网络上开展业务。对于一个商城网站而言,产品推荐功能非常重要,因为它可以帮助企业促进销售、提高客户满意度。在本文中,我们将介绍如何使用PHP实现商城的热门商品推荐功能。一、收集数据要实现热门商品推荐功能...
    99+
    2023-05-21
    PHP 商城 推荐功能
  • 如何利用PHP开发买菜系统的商品搜索与智能推荐功能?
    如何利用PHP开发买菜系统的商品搜索与智能推荐功能?随着互联网技术的发展和普及,购物已经不再局限于传统的实体商店,越来越多的人开始选择线上购物的方式。买菜系统作为其中的一部分,借助于PHP语言的开发,提供了更加便捷和智能的购物体验。本文将介...
    99+
    2023-11-01
    PHP开发 智能推荐功能 买菜系统
  • css如何实现带搜索图标的搜索框功能
    这篇文章给大家分享的是有关css如何实现带搜索图标的搜索框功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言给大家分享一下前端用处很多的带小图标的搜索框的制作方法。效果展示基本思路搜索图像用绝对定位放到搜索框...
    99+
    2023-06-08
  • web用php如何实现搜索功能
    本篇内容介绍了“web用php如何实现搜索功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!创建搜索表单在网站主页面上添加一个搜索表单,通常...
    99+
    2023-07-05
  • 如何使用PHP实现商城的品牌专区功能
    随着电商行业的不断发展,商城的品牌专区功能越来越受到企业和消费者的关注。品牌专区是商城中用于展示和推销特定品牌产品的区域,可以帮助品牌提高曝光度和销售额。本文将介绍如何使用PHP实现商城的品牌专区功能。一、设计数据库首先,我们需要设计数据库...
    99+
    2023-05-23
    PHP 商城 品牌专区
  • vue如何实现搜索小功能
    这篇文章主要介绍vue如何实现搜索小功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下<!DOCTYPE html><html> <head>&nb...
    99+
    2023-06-21
  • vs中如何实现搜索功能
    在VS中实现搜索功能可以通过以下步骤进行:1. 添加搜索框:在界面中添加一个文本框作为搜索框,供用户输入搜索关键字。2. 添加搜索按...
    99+
    2023-08-23
    vs
  • 如何使用PHP开发点餐系统的菜品搜索功能?
    如何使用PHP开发点餐系统的菜品搜索功能?简介:随着科技的发展和人们生活水平的提高,越来越多的餐厅开始引入点餐系统,以提高效率和满足顾客的需求。而菜品搜索功能作为点餐系统的核心功能之一,必不可少。本文将介绍如何使用PHP开发点餐系统的菜品搜...
    99+
    2023-11-02
    PHP(开发语言) 点餐系统(应用场景) 菜品搜索(功能需求)
  • vue如何实现商品详情页功能
    这篇文章将为大家详细讲解有关vue如何实现商品详情页功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。vue是什么Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框架的区别是...
    99+
    2023-06-14
  • 如何使用PHP实现商品分类和筛选功能
    随着越来越多的电子商务平台的出现,商品分类和筛选功能成为了一个成功的商业网站所必须的基本功能之一。在本文中,我们将介绍如何使用PHP实现商品分类和筛选的功能,让您的网站能够更加方便和易于使用。一、商品分类定义商品分类首先,你需要对商品进行分...
    99+
    2023-05-21
    筛选功能 PHP 商品分类
  • 如何使用MongoDB实现数据的全文搜索功能
    如何使用MongoDB实现数据的全文搜索功能导语:随着信息化时代的迅猛发展,全文搜索功能成为了许多应用程序的必备功能。作为一个流行的NoSQL数据库,MongoDB也提供了强大的全文搜索能力。本文将介绍如何使用MongoDB实现数据的全文搜...
    99+
    2023-10-22
    MongoDB 全文搜索 数据实现
  • jquery如何实现静态搜索功能
    这篇文章主要为大家展示了“jquery如何实现静态搜索功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jquery如何实现静态搜索功能”这篇文章吧。效果图:代...
    99+
    2022-10-19
  • Vue如何实现简单搜索功能
    这篇文章主要讲解了“Vue如何实现简单搜索功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue如何实现简单搜索功能”吧!1、概述在vue项目中,搜索功能是我们经常需要使用的一个场景,最常...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作