今日目标 [搜索解决方案–solr]

1. 完成solr环境安装,中文分析器和业务域的配置
2. 会使用Spring Data Solr完成增删改查操作
3. 完成批量数据导入功能
4. 完成按关键字搜索功能

solr安装与配置

1. 什么是solr?* 相对于Luncene而言,它是跨平台的,它是建立在Luncene之上的用于构建搜索应用的程序;* 它可以与Hadoop一起使用处理大数据,也可以像其他NoSql数据库一样,用于储存目的,因为它是一种非关系数据储存和处理技术* 总之,Solr是一个可扩展的,可部署,搜索/储存引擎,优化搜索大量以文本为中心的数据;* 它提供了HTTP服务,其他的应用都可以通过HTTP调用,而Luncene是jar包,只能java程序调用,所以solr是跨平台的;2. 安装:1. 安装Tomcat,解压缩2. 解压solr3. 把solr下的dist目录solr-4.10.3.war部署到Tomcat\webapps下(去掉solr版本号)4. 启动Tomcat解压缩war包5. 把solr下example/lib/ext目录下的所有jar包,添加到solr的工程中(\WEB-INF\lib目录下)6. 创建一个solrhome.    solr下的/example/solr目录就是一个solrhome.复制此目录到D盘改名为solrhome;7. 关联solr及solrhome.需要修改solr工程的web.xml文件:<env-entry><env-entry-name>solr/home</env-entry-name><env-entry-value>d:\solrhome</env-entry-value><env-entry-type>java.lang.String</env-entry-type></env-entry>8. 启动Tomcat* 启动成功后输入网址:http://localhost:8080/solr/* 如果出现相应的界面则配置成功!3. 使用* 界面上的功能:1. Core Selector: 查看本地数据库  [刚开始有一个默认的collection1]2. 选择好了数据库之后,有一个下拉列表:* Query:查询* q:查询表达式        [*:*  -->代表查询所有,第一个* 代表字段名称,第二个* 代表查询条件值]* Analysis:分词

中文分词器[中文分析器]

1. IK Analyzer简介:* 它是一个开源的,基于java语言开发的轻量级的中文分词工具包,以Luence为应用主体,结合词典分词和文法分析算法的中文分词组件;
2. 扩展词典:* 它支持扩展词典,除了内置的词库,可以添加一些新的词语;
3. 停用词      * 它支持停用词,可以忽略一些无意义的搜索词;4. 文件名含义:1. mydict.dic:  扩展词典2. ext_stopword.dic:   停用词典3. IKAnalyzer.cfg.xml:      配置文件5. 配置:1. 把 IKAnalyzer2012FF_u1.jar 添加到 solr 工程的 lib 目录下2. 创建 WEB-INF/classes 文件夹 把扩展词典、停用词词典、配置文件放到 solr 工程的 WEB-INF/classes 目录下。3. 修改 Solrhome 的 schema.xml 文件,配置一个 FieldType,使用 IKAnalyzer:<fieldType name="text_ik" class="solr.TextField"><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/></fieldType>4. 启动Tomcat* 启动成功后输入网址:http://localhost:8080/solr/* 输入中文进行分词,选项选择:text_ik   如果有则配置成功!

solr域

1. 域的定义:* 域相当于数据库的表字段,用户存放数据,因此用户根据业务需要去定义相关的 Field
(域),一般来说,每一种对应着一种数据,用户对同一种数据进行相同的操作。
2. 域的常用属性:* name:指定域的名称* type:指定域的类型* indexed:是否索引* stored:是否存储   --展示* required:是否必须* multiValued:是否多值        --["sadsa","dadasd"]3. 域* 修改solrhome的schema.xml文件  设置业务系统Field<field name="item_goodsid" type="long" indexed="true" stored="true"/><field name="item_title" type="text_ik" indexed="true" stored="true"/><field name="item_price" type="double" indexed="true" stored="true"/><field name="item_image" type="string" indexed="false" stored="true" /><field name="item_category" type="string" indexed="true" stored="true" /><field name="item_seller" type="text_ik" indexed="true" stored="true" /><field name="item_brand" type="string" indexed="true" stored="true" />
4. 复制域* 复制域的作用在于将某一个Field中的数据复制到另一个域中<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/><copyField source="item_title" dest="item_keywords"/><copyField source="item_category" dest="item_keywords"/><copyField source="item_seller" dest="item_keywords"/><copyField source="item_brand" dest="item_keywords"/>5. 动态域* 当我们需要动态扩充字段时,需要使用动态域;对于某些项目,数据库的某些列的值是不确定的,我们就可以使用动态域来实现;<dynamicField name="item_spec_*" type="string" indexed="true" stored="true" />

Spring Data Solr 入门

1. 为什么要使用solr搜索?* 使用传统数据库进行搜索有几个缺陷:1. 查询速度慢2. 没有分词3. 搜索功能频繁,数据库压力大* solr是为了解决这些问题而出现的;2. 流程是怎样的?* 先从数据库中将数据导入到索引库中,并且数据随着数据库的改变而改变;* 搜索的时候直接使用solr进行搜索* 对solr必然要进行查询,所以我们也需要对solr进行增删改查3. 操作方式:1. 官方类库:solrJ     * 支持绝大部分的关系数据库,比如mysql,orcale等      -- 原理:交互方面是HTTP请求和响应,它是对整个网络请求过程封装2. 框架:Spring Data solr     * 我们使用这个进行操作     -- 原理:它是对官方类库的封装3. httpClient:     * 手动请求solr   手动处理响应    4. 注解:* @Field注解:* 在一个变量上添加此注解   * 表示该变量时该域中的这个变量* 如果该变量值名字与域的名字对应不上则可以在注解内告诉是哪个与之对应;* 举例:1. 变量一样的:* @Field
5. 增加修改:* 它的增加和修改是一样的,以id值为基准,1. 如果id值一样,但是其他的不一样,则修改;2. 如果id值不一样,但是其他的一样也是增加;

环境配置

  1. 创建一个Maven工程,在pom.xml导入依赖:

     <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.itcast.demo</groupId><artifactId>springdatasolrDemo</artifactId><version>1.0-SNAPSHOT</version><dependencies><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.9</version></dependency></dependencies>
    
  2. 创建src/main/java/cn/itcast/pojo/TbItem.java :

     package cn.itcast.pojo;import java.io.Serializable;import java.math.BigDecimal;import java.util.Date;import java.util.Map;import org.apache.solr.client.solrj.beans.Field;import org.springframework.data.solr.core.mapping.Dynamic;public class TbItem implements Serializable{@Fieldprivate 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;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;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 == null ? null : title.trim();}public String getSellPoint() {return sellPoint;}public void setSellPoint(String sellPoint) {this.sellPoint = sellPoint == null ? null : sellPoint.trim();}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 == null ? null : barcode.trim();}public String getImage() {return image;}public void setImage(String image) {this.image = image == null ? null : image.trim();}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 == null ? null : status.trim();}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 == null ? null : itemSn.trim();}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 == null ? null : isDefault.trim();}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 == null ? null : sellerId.trim();}public String getCartThumbnail() {return cartThumbnail;}public void setCartThumbnail(String cartThumbnail) {this.cartThumbnail = cartThumbnail == null ? null : cartThumbnail.trim();}public String getCategory() {return category;}public void setCategory(String category) {this.category = category == null ? null : category.trim();}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand == null ? null : brand.trim();}public String getSpec() {return spec;}public void setSpec(String spec) {this.spec = spec == null ? null : spec.trim();}public String getSeller() {return seller;}public void setSeller(String seller) {this.seller = seller == null ? null : seller.trim();}
    

    }

  3. 在src/main/resources/applicationContext-solr.xml :

             <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:solr="http://www.springframework.org/schema/data/solr"xsi:schemaLocation="http://www.springframework.org/schema/data/solr http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- solr服务器地址 --><solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" /><!-- solr模板,使用solr模板可对索引库进行CRUD的操作 --><bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate"><constructor-arg ref="solrServer" /></bean></beans>
    

增加修改

  1. 创建src/test/java/cn/itcast/test/TestTemplate.java: 开始测试–>

       package cn.itcast.test;import cn.itcast.pojo.TbItem;import org.apache.solr.client.solrj.response.UpdateResponse;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.solr.core.SolrTemplate;import org.springframework.data.solr.core.query.Criteria;import org.springframework.data.solr.core.query.Query;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 javax.swing.*;import java.math.BigDecimal;import java.util.ArrayList;import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations="classpath:applicationContext-solr.xml")public class TestTemplate {@Autowiredprivate SolrTemplate solrTemplate;/** 增加修改,*   * 它的增加和修改是一样的,以id值为基准,1. 如果id值一样,但是其他的不一样,则修改;2. 如果id值不一样,但是其他的一样也是增加;* */@Testpublic void add() {TbItem item=new TbItem();item.setId(1L);item.setTitle("华为Mate10");item.setCategory("手机");item.setBrand("华为");item.setSeller("华为官方旗舰店");item.setGoodsId(1L);item.setPrice(new BigDecimal(3000.01));solrTemplate.saveBean(item);solrTemplate.commit();}/** 按照id值查询** */@Testpublic void findById(){TbItem item=solrTemplate.getById(1L, TbItem.class);System.out.println(item.getTitle());}/** 按照id值删除** */@Testpublic void deleteById(){UpdateResponse item=solrTemplate.deleteById("1");System.out.println(item);solrTemplate.commit();}/** 批量插入数据:* 循环插入100条数据* 后面使用分页查询需要用到* */@Testpublic void testAddList(){List list=new ArrayList();for (int i=0; i < 100; i++) {TbItem item=new TbItem();item.setId(i+1L);item.setTitle("华为METE"+i);item.setCategory("手机");item.setBrand("华为"+i);item.setSeller("华为旗舰店");item.setGoodsId(10L);item.setPrice(new BigDecimal(3000.01+i));list.add(item);}solrTemplate.saveBeans(list);solrTemplate.commit();}/*** 分页查询数据** */@Testpublic void testPageQuery(){Query query=new SimpleQuery("*:*");query.setOffset(0);  //开始索引query.setRows(10);       //结束索引ScoredPage<TbItem> page=solrTemplate.queryForPage(query, TbItem.class);for (TbItem item : page.getContent()) {System.out.println(item.getTitle()+"  "+item.getPrice()+"  "+item.getBrand());}System.out.println("总记录数"+page.getTotalElements());System.out.println("总页数"+page.getTotalPages());}/** 条件查询数据** */@Testpublic void testPageQueryByTerm(){Query query=new SimpleQuery("*:*");Criteria criteria=new Criteria("item_category").is("手机");           //这里也可以将is替换为contains,含义一样criteria=criteria.and("item_brand").contains("2");query.addCriteria(criteria);query.setOffset(0);  //开始索引query.setRows(10);       //结束索引ScoredPage<TbItem> page=solrTemplate.queryForPage(query,TbItem.class);for (TbItem item : page.getContent()) {System.out.println(item.getTitle()+"  "+item.getPrice()+"  "+item.getBrand());}System.out.println("总记录数"+page.getTotalElements());System.out.println("总页数"+page.getTotalPages());}/** 删除全部* */@Testpublic void deleteAll(){//这里的构造里必须带条件,如果构造里面没有带条件,想删除的话,应该在删除之前给query添加条件,否则删除不成功Query query=new SimpleQuery("*:*");solrTemplate.delete(query);solrTemplate.commit();}}
    
  2. 注意:

    1. 环境搭建和测试类等完成后,先启动已经前面配置好了的tomcat运行solr,然后再启动测试类进行保存;
    2. 保存完成后可以登录localhost:8080/solr ->> collection 1 ->> Query 进行查询是否已经成功保存
    3. 记住,增删改操作一定要commit提交事务,否则保存不成功;

如何将数据存入动态域

  1. pojo对象代码演示:

        package com.pinyougou.pojo;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 {@Fieldprivate 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;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;public Map<String, String> getSpecMap() {return specMap;}public void setSpecMap(Map<String, String> specMap) {this.specMap=specMap;}//这个注解表示下面的变量是一个动态域@Dynamic@Field("item_spec_*")private Map<String, String> 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 == null ? null : title.trim();}public String getSellPoint() {return sellPoint;}public void setSellPoint(String sellPoint) {this.sellPoint=sellPoint == null ? null : sellPoint.trim();}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 == null ? null : barcode.trim();}public String getImage() {return image;}public void setImage(String image) {this.image=image == null ? null : image.trim();}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 == null ? null : status.trim();}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 == null ? null : itemSn.trim();}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 == null ? null : isDefault.trim();}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 == null ? null : sellerId.trim();}public String getCartThumbnail() {return cartThumbnail;}public void setCartThumbnail(String cartThumbnail) {this.cartThumbnail=cartThumbnail == null ? null : cartThumbnail.trim();}public String getCategory() {return category;}public void setCategory(String category) {this.category=category == null ? null : category.trim();}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand=brand == null ? null : brand.trim();}public String getSpec() {return spec;}   public void setSpec(String spec) {this.spec=spec == null ? null : spec.trim();}public String getSeller() {return seller;}public void setSeller(String seller) {this.seller=seller == null ? null : seller.trim();}}
    
  2. 测试代码演示:

     package com.pinyougou.solrutil;import com.alibaba.fastjson.JSON;import com.pinyougou.mapper.TbItemMapper;import com.pinyougou.pojo.TbItem;import com.pinyougou.pojo.TbItemExample;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.data.solr.core.SolrTemplate;import org.springframework.stereotype.Component;import java.util.List;import java.util.Map;@Componentpublic class SolrUtil {@Autowiredprivate TbItemMapper itemMapper;@Autowiredprivate SolrTemplate solrTemplate;public void importItemData(){TbItemExample example=new TbItemExample();TbItemExample.Criteria criteria=example.createCriteria();criteria.andStatusEqualTo("1");         //审核通过的才导入的List<TbItem> itemList=itemMapper.selectByExample(example);System.out.println("----商品列表----");for (TbItem item : itemList) {System.out.println(item.getId()+" "+item.getTitle()+" "+item.getPrice());Map specMap=JSON.parseObject(item.getSpec(),Map.class);         //从数据库中提取规格json字符串转换为mapitem.setSpecMap(specMap);}solrTemplate.saveBeans(itemList);       //将集合批量导入solr库solrTemplate.commit();System.out.println("-------结束------");}public static void main(String[] args) {//导入xml文件ApplicationContext context=new ClassPathXmlApplicationContext("classpath*:spring/applicationContext*.xml");SolrUtil solrUtil=(SolrUtil) context.getBean("solrUtil");solrUtil.importItemData();}}
    
  3. 分析:

    • 在pojo中,存入动态域,首先在pojo上使用注解@Filed,值带* 号通配, 以及使用注解@Dynamic标明此变量是一个动态域;
    • 动态域是动态变化的,所以可以使用Map集合进行储存;在SolrUtil类中,使用JSON.parseObject(xxx.xxx(),Map.class)转为map属性,再赋值即可;
    • 因为存入的是Map里面的值;key值与pojo的通配值相融合变为solr库中的字段值,value值则变为它的value值;
  4. 拓展:

    • itchat4j: 用java扩展个人微信号的能力
    • 作用: 可以是用它接收信息,发送信息;比如机器人[图灵机],群发广告等…

Spring Data Solr在SSM项目中:

1. 在一般的电商项目中,导入相关依赖,分为interface,service,web,util四层,
2. 通过util层的类将数据库中的数据导入solr库,加入bean
3. 通过interface关联pojo层的实体类,并且提供相关的接口:public interface ItemSearchService {/*** 搜索方法* @param searchMap* @return*/public Map search(Map searchMap);}
* 通过serviceimpl继承接口,实现query的查询:package com.pinyougou.search.service.impl;import java.util.HashMap;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.solr.core.SolrTemplate;import org.springframework.data.solr.core.query.Criteria;import org.springframework.data.solr.core.query.Query;import org.springframework.data.solr.core.query.SimpleQuery;import org.springframework.data.solr.core.query.result.ScoredPage;import com.alibaba.dubbo.config.annotation.Service;import com.pinyougou.pojo.TbItem;import com.pinyougou.search.service.ItemSearchService;@Service(timeout=5000)public class ItemSearchServiceImpl implements ItemSearchService {@Autowiredprivate SolrTemplate solrTemplate;@Overridepublic Map search(Map searchMap) {Map map=new HashMap();Query query=new SimpleQuery("*:*");Criteria criteria=new Criteria("item_keywords").is(searchMap.get("keywords"));query.addCriteria(criteria);ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);map.put("rows", page.getContent());return map;}}* 通过controller,实现前端与后端的交互:package com.pinyougou.search.controller;import java.util.Map;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.alibaba.dubbo.config.annotation.Reference;import com.pinyougou.search.service.ItemSearchService;@RestController@RequestMapping("/itemsearch")public class ItemSearchController {@Referenceprivate ItemSearchService itemSearchService;@RequestMapping("/search")public Map search(@RequestBody Map searchMap){return itemSearchService.search(searchMap);}}
* 通过web层,使用angularJS,完成数据请求,数据绑定,数据展示等,通过点击'搜索'按钮,发送搜索请求,controller调用service处理请求,返回数据,完成搜索功能;

**海量搜索解决方案_Spring Data Solr [篇1/共3篇]*相关推荐

  1. Java接收solr动态域_Spring Data Solr创建动态域报错:org.springframework.data.solr.UncategorizedSolrException...

    今天在项目中使用Spring Data Solr导入动态域数据报错, 控制台打印错误信息如下 Exception in thread "main" org.springframew ...

  2. 《博客园精华集》WebService 篇(共79篇)

    转自(http://www.cnblogs.com/jacklaw/archive/2008/06/14/1222107.html) 深入学习Web Service系列之异步开发模式 作者:Terry ...

  3. Spring Data Solr入门

    Spring Data Solr是Spring Data项目的扩展,该项目旨在简化Apache Solr在Spring应用程序中的使用. 请注意,这不是Spring(数据)或Solr的简介. 我认为您 ...

  4. 搜索解决方案Solr

    网页右边,向下滑有目录索引,可以根据标题跳转到你想看的内容 如果右边没有就找找左边 Solr Solr是基于Apache Lucene构建的用于搜索和分析的开源解决方案.可提供可扩展索引.搜索功能.高 ...

  5. 搜索解决方案-Solr

    1什么是Solr? 大多数搜索引擎应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗并且它们由于沉重的数据库加载而拖垮你的应用的性能. 这就是为什么转移负载到一个外部的搜索服务器是一个不错 ...

  6. Spring Data Solr教程:分页

    在我的Spring Data Solr教程的较早部分中,我们实现了一个简单的搜索功能,该功能用于搜索待办事项的信息. 我们搜索功能的当前实现将所有搜索结果显示在一个页面中. 对于大多数现实生活中的应用 ...

  7. Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

    Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...

  8. Spring Data Solr教程:将自定义方法添加到单个存储库

    我的Spring Data Solr教程的前一部分教我们如何使用查询方法创建静态查询. 自然而然的下一步将是描述如何使用Spring Data Solr创建动态查询. 但是,在继续讨论该主题之前,我们 ...

  9. solr crud_Spring Data Solr教程:CRUD(差不多)

    solr crud 在我的Spring Data Solr教程的上一部分中,我们学习了如何配置Spring Data Solr. 现在该迈出一步,了解我们如何管理Solr实例中存储的信息. 此博客文章 ...

最新文章

  1. Serlvet学习笔记之四—对文件的操作
  2. 浙江省计算机网络技术比赛,[2018年最新整理]0509浙江省三级计算机网络技术历年真题(含答桉).doc...
  3. 启动python内核时发生错误_启动内核时出错
  4. 在命令提示符下输入的命令
  5. kpi绩效考核流程图_公开!松松团队KPI绩效考核表分享
  6. 机器学习基石HOW BETTER部分(1)
  7. 激光SLAM框架总结
  8. java 文档比较功能_java 实现在线比较两个版本的Word文档的功能
  9. 企业招聘软件测试笔试题,奇虎软件测试工程师招聘面试笔试题题
  10. android baseview,Android BaseAdapter:在getView()重新输入时conver...
  11. 【TIC6657 DSP学习笔记】02 RTSC平台配置组件创建
  12. gcat广告电商云南百收涉及传销新模式:社交电商消费返利
  13. 2020书单、影单、电视剧
  14. 从 git 的历史记录中彻底删除文件或文件夹
  15. java课程设计打字训练测试软件_打字训练测试软件-Java课程设计
  16. python数学符号代码_用Python学数学之Sympy代数符
  17. linux ip1180,canon ip1180驱动下载
  18. (转载)页面静态化(JSP动态页面转静态化)
  19. 如何俘获一个 IT 男的心
  20. linux下网口监控软件_linux下监控软件

热门文章

  1. 液压系统管路流速推荐表_液压系统的几种管路
  2. android将彩图转为黑白_android 彩色图片二值化转可打印的点阵黑白图
  3. Unity Photon服务器
  4. Axure无法打开问题解决
  5. 杰理AD14N/AD15N---UART串口使用问题
  6. ThreeJs ObjLoader 编码问题
  7. layui 多选插件selectM实现联动
  8. PopWindow踩坑
  9. 关于pyCharm运行测试用例无法生成测试报告
  10. EAUML日拱一卒-状态图::庖丁解牛