全文检索引擎Solr(入门及其相关案例分析)

什么是Solr

大多数搜索引擎应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗,并且它们会由于沉重的数据库加载而拖垮你的应用的性能。
这就是为什么转移负载到一个外部的搜索服务器的主要原因,Apache Solr是一个流行的开源搜索服务器,它通过使用类似REST的HTTP API,确保你能从几乎任何编程语言来使用solr。Solr是一个开源搜索平台,用于构建搜索应用程序。 它建立在Lucene(全文搜索引擎)之上。Solr是企业级的,快速的,高度可扩展的

总之,Solr是一个可扩展的,可部署,搜索/存储引擎,优化搜索大量以文本为中心的数据,我们常用这中搜索引擎来实现我们的工作,而不是在数据库中来实现我们的搜索功能,能够加快我们的工作效率等

中文分析器IK Analyzer

IK Analyzer简介

IK Analyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。从 3.0 版本开始,IK 发展为面向 Java 的公用分词组件,独立 Lucene 项目,同时提供了对 Lucene 的默认优化实现。在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化

IK Analyzer配置
上传文件到相对对应的solar路径,并填写其相对于的数据到对应的schema.xml文件,即是配置ik分词器到对应的搜索引擎中
在这里插入图片描述
在这里插入图片描述
Spring Data Solr入门

Spring Data Solr简介

经过上面的安装和配置大家应该已经知道如何配置Solr,那么就会思考一个问题了:这个solr项目和我们实际的项目查询有什么关系呢?是怎么结合的呢?

solr官方提供了solrj API,就是一个jar文件,我们可以通过solr官方提供的接口来实现本地项目和solr项目的交互;而这里我们要介绍的是Spring Data Solr,它是Spring Data家族对solrj进行封装后的框架。

创建项目并导入相关的pom文件中依赖

 <dependencies>
        <!--显然是solr各层的相关的数据的整合 桌面的各层的业务的逻辑的体现-->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-solr</artifactId>
            <version>1.5.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
 </dependencies>

配置相关的solr的配置文件

    <!-- solr服务器地址 可以查询其相对应的其服务器地址-->
    <solr:solr-server id="solrServer" url="http://192.168.220.130:8080/solr/collection1"/>

    <!-- solr模板,使用solr模板可对索引库进行CRUD操作 -->
    <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
        <!--构造方法,将其服务的地址给传递出来,可以在工程中直接引用-->
        <constructor-arg ref="solrServer"/>
    </bean>

在这里插入图片描述
配置其相关的实体类(表实合一)

package com.offcn;

import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.solr.core.mapping.Dynamic;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;

public class TbItem implements Serializable {

    @Field
    private Long id;

    @Field("item_title")
    private String title;

    private String sellPoint;

    @Field("item_price")
    private BigDecimal price;
    private Integer stockCount;
    private Integer num;
    private String barcode;

    @Field("item_image")
    private String image;
    private Long categoryid;
    private String status;
    private Date createTime;
    @Field("item_updatetime")
    private Date updateTime;
    private String itemSn;
    private BigDecimal costPirce;
    private BigDecimal marketPrice;
    private String isDefault;
    @Field("item_goodsid")
    private Long goodsId;
    private String sellerId;
    private String cartThumbnail;

    @Field("item_category")
    private String category;

    @Field("item_brand")
    private String brand;
    private String spec;
    @Field("item_seller")
    private String seller;
    @Dynamic
    @Field("item_spec_*")
    private Map<String,String> specMap;

    public Map<String, String> getSpecMap() {
        return specMap;
    }
    public void setSpecMap(Map<String, String> specMap) {
        this.specMap = specMap;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getSellPoint() {
        return sellPoint;
    }

    public void setSellPoint(String sellPoint) {
        this.sellPoint = sellPoint;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public Integer getStockCount() {
        return stockCount;
    }

    public void setStockCount(Integer stockCount) {
        this.stockCount = stockCount;
    }

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    public String getBarcode() {
        return barcode;
    }

    public void setBarcode(String barcode) {
        this.barcode = barcode;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public Long getCategoryid() {
        return categoryid;
    }

    public void setCategoryid(Long categoryid) {
        this.categoryid = categoryid;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public String getItemSn() {
        return itemSn;
    }

    public void setItemSn(String itemSn) {
        this.itemSn = itemSn;
    }

    public BigDecimal getCostPirce() {
        return costPirce;
    }

    public void setCostPirce(BigDecimal costPirce) {
        this.costPirce = costPirce;
    }

    public BigDecimal getMarketPrice() {
        return marketPrice;
    }

    public void setMarketPrice(BigDecimal marketPrice) {
        this.marketPrice = marketPrice;
    }

    public String getIsDefault() {
        return isDefault;
    }

    public void setIsDefault(String isDefault) {
        this.isDefault = isDefault;
    }

    public Long getGoodsId() {
        return goodsId;
    }

    public void setGoodsId(Long goodsId) {
        this.goodsId = goodsId;
    }

    public String getSellerId() {
        return sellerId;
    }

    public void setSellerId(String sellerId) {
        this.sellerId = sellerId;
    }

    public String getCartThumbnail() {
        return cartThumbnail;
    }

    public void setCartThumbnail(String cartThumbnail) {
        this.cartThumbnail = cartThumbnail;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getSpec() {
        return spec;
    }

    public void setSpec(String spec) {
        this.spec = spec;
    }

    public String getSeller() {
        return seller;
    }

    public void setSeller(String seller) {
        this.seller = seller;
    }

    @Override
    public String toString() {
        return "TbItem{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", sellPoint='" + sellPoint + '\'' +
                ", price=" + price +
                ", stockCount=" + stockCount +
                ", num=" + num +
                ", barcode='" + barcode + '\'' +
                ", image='" + image + '\'' +
                ", categoryid=" + categoryid +
                ", status='" + status + '\'' +
                ", createTime=" + createTime +
                ", updateTime=" + updateTime +
                ", itemSn='" + itemSn + '\'' +
                ", costPirce=" + costPirce +
                ", marketPrice=" + marketPrice +
                ", isDefault='" + isDefault + '\'' +
                ", goodsId=" + goodsId +
                ", sellerId='" + sellerId + '\'' +
                ", cartThumbnail='" + cartThumbnail + '\'' +
                ", category='" + category + '\'' +
                ", brand='" + brand + '\'' +
                ", spec='" + spec + '\'' +
                ", seller='" + seller + '\'' +
                ", specMap=" + specMap +
                '}';
    }
}

在这里插入图片描述
在这里插入图片描述
建立相关的测试类

package com.offcn;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.data.solr.core.query.result.ScoredPage;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.math.BigDecimal;
import java.util.ArrayList;

/**
 * @author liugang
 * @version 1.0
 * @date 2019/11/28
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring_solr.xml")
public class SolrDemo1 {
    
    @Autowired
    SolrTemplate  solrTemplate;

    @Test
    public void addSourceToSolr(){
        TbItem item = new TbItem();
        item.setId(3L);
        item.setBrand("蛤蛤");
        item.setCategory("手机pluse");
        item.setGoodsId(1L);
        item.setSeller("小米1号专卖店");
        item.setTitle("红米Mate9");
        item.setPrice(new BigDecimal(2200));
        solrTemplate.saveBean(item);
        solrTemplate.commit();
    }

    @Test
    public  void queryId(){
        TbItem byId = solrTemplate.getById(856645, TbItem.class);
        System.out.println(byId);
    }

    @Test
    public void createListDataBeat(){
        ArrayList<TbItem> tbItems = new ArrayList<>();
        for (int i = 0; i < 200; i++) {
            TbItem item = new TbItem();
            item.setId(Long.valueOf(i));
            item.setBrand("摩托多拉");
            item.setCategory("手机");
            item.setGoodsId(1L);
            item.setSeller("摩托多拉"+i+"号专卖店");
            item.setTitle("摩托多拉"+i);
            item.setPrice(new BigDecimal(2000+i));
            tbItems.add(item);
        }
        solrTemplate.saveBeans(tbItems);
        solrTemplate.commit();
    }

    @Test
    public void pageQuery(){
        SimpleQuery simpleQuery = new SimpleQuery("*:*");
        simpleQuery.setOffset(10);
        simpleQuery.setRows(5);
        ScoredPage<TbItem> tbItems = solrTemplate.queryForPage(simpleQuery, TbItem.class);
        //获取数据在库总量
        System.out.println(tbItems.getTotalElements());
        //设置我们设置的中参数,判断一共多少页
        System.out.println(tbItems.getTotalPages());

        for (TbItem tbItem : tbItems) {
            System.out.println(tbItem);
        }
    }

    /**
     * 模糊查询
     */
    @Test
    public void searyQueryData(){

        SimpleQuery simpleQuery = new SimpleQuery("*:*");
        Criteria criteria = new Criteria("item_title").contains("2");
        criteria =  criteria.and("item_price").greaterThan(2020);
        simpleQuery.addCriteria(criteria);
        simpleQuery.addSort(new Sort(Sort.Direction.DESC, "item_price"));
        simpleQuery.setOffset(10);
        simpleQuery.setRows(10);

        ScoredPage<TbItem> tbItems = solrTemplate.queryForPage(simpleQuery, TbItem.class);
        System.out.println(tbItems.getTotalElements());
        System.out.println(tbItems.getTotalPages());

        for (TbItem tbItem : tbItems) {
            System.out.println(tbItem.toString());
        }

    }
    /**
     * 第一,solr引擎中需要存在样本数据
     * 第二,根据solrTempate的相关api进行操作
     */


}

在这里插入图片描述
在这里插入图片描述

发布了63 篇原创文章 · 获赞 54 · 访问量 9128

猜你喜欢

转载自blog.csdn.net/loveyouyuan/article/details/103301570