全文检索工具solr:第一章:理论知识

什么是Solr

大多数搜索引擎应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗并且它们由于沉重的数据库加载而拖垮你的应用的性能。

这就是为什么转移负载到一个外部的搜索服务器是一个不错的主意,Apache Solr是一个流行的开源搜索服务器,它通过使用类似REST的HTTP API,这就确保你能从几乎任何编程语言来使用solr。

Solr是一个开源搜索平台,用于构建搜索应用程序。 它建立在Lucene(全文搜索引擎)之上。 Solr是企业级的,快速的和高度可扩展的。 使用Solr构建的应用程序非常复杂,可提供高性能。

为了在CNET网络的公司网站上添加搜索功能,Yonik Seely于2004年创建了Solr。并在2006年1月,它成为Apache软件基金会下的一个开源项目。并于2016年发布最新版本Solr 6.0,支持并行SQL查询的执行。

Solr可以和Hadoop一起使用。由于Hadoop处理大量数据,Solr帮助我们从这么大的源中找到所需的信息。不仅限于搜索,Solr也可以用于存储目的。像其他NoSQL数据库一样,它是一种非关系数据存储和处理技术。

总之,Solr是一个可扩展的,可部署,搜索/存储引擎,优化搜索大量以文本为中心的数据。

 
什么是中文分析器IK Analyzer

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

 
什么是Spring Data Solr

虽然支持任何编程语言的能力具有很大的市场价值,你可能感兴趣的问题是:我如何将Solr的应用集成到Spring中?可以,Spring Data Solr就是为了方便Solr的开发所研制的一个框架,其底层是对SolrJ(官方API)的封装。

 
搭建工程

    创建maven工程,pom.xml中引入依赖

      

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.data</groupId>
  4. <artifactId>spring-data-solr</artifactId>
  5. <version>1.5.5.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework</groupId>
  9. <artifactId>spring-test</artifactId>
  10. <version>4.2.4.RELEASE</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>junit</groupId>
  14. <artifactId>junit</artifactId>
  15. <version>4.9</version>
  16. </dependency>
  17. </dependencies>

(2)在src/main/resources下创建  applicationContext-solr.xml

   

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:solr="http://www.springframework.org/schema/data/solr"
  6. xsi:schemaLocation="http://www.springframework.org/schema/data/solr
  7. http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context.xsd">
  12. <!-- solr服务器地址 -->
  13. <solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" />
  14. <!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
  15. <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
  16. <constructor-arg ref="solrServer" />
  17. </bean>
  18. </beans>

@Field 注解

属性使用@Field(“域名”)注解标识 。   如果属性与配置文件定义的域名称不一致,需要在注解中指定域名称。

    public class SkuInfo implements Serializable{
        String id;
        String spuId;
        @Field("sku_price")
        BigDecimal price;
        @Field("sku_name")
        String skuName;
        BigDecimal weight;
        @Field("sku_desc")
        String skuDesc;
        String catalog3Id;
        @Field("sku_default_img")
        String skuDefaultImg;
    .......
    }

增加(修改)

对于修改:如果id存在就认为是修改,若不存在,就认为是新增

创建测试类TestTemplate.java

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations="classpath:applicationContext-solr.xml")
    public class TestTemplate {
     
        @Autowired
        private SolrTemplate solrTemplate;
        
        @Test
        public void testAdd(){
            SkuInfo skuInfo = new SkuInfo();
            skuInfo.setId("1");
            skuInfo.setSkuName("华为");
            skuInfo.setPrice(new BigDecimal(3000.01));
            skuInfo.setCatalog3Id("2");
            skuInfo.setSkuDefaultImg("www.baidu,com");
            skuInfo.setSkuDesc("非常好");
            skuInfo.setSpuId("3");        
        solrTemplate.saveBean(skuInfo);
            solrTemplate.commit();
        }
    }

按主键查询

@Test

public void testFindOne(){

   SkuInfo sku =  template.getById("1",SkuInfo.class);

        System.out.printf(sku.getSkuName());

}
按主键删除

@Test

public void testDelete(){

solrTemplate.deleteById("1");

solrTemplate.commit();

}
分页查询

首先循环插入100条测试数据

@Test

public void testAddList(){

List<TbItem> list=new ArrayList();

for(int i=0;i<100;i++){

TbItem item=new TbItem();

item.setId(i+1L);

item.setBrand("华为");

item.setCategory("手机");

item.setGoodsId(1L);

item.setSeller("华为2号专卖店");

item.setTitle("华为Mate"+i);

item.setPrice(new BigDecimal(2000+i));

list.add(item);

}

solrTemplate.saveBeans(list);

solrTemplate.commit();

}

编写分页查询测试代码:

@Test

public void testPageQuery(){

Query query=new SimpleQuery("*:*");

query.setOffset(20);//开始索引(默认0)

query.setRows(20);//每页记录数(默认10)

ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);

System.out.println("总记录数:"+page.getTotalElements());

List<TbItem> list = page.getContent();

showList(list);

}

//显示记录数据

private void showList(List<TbItem> list){

for(TbItem item:list){

System.out.println(item.getTitle() +item.getPrice());

}

}
条件查询

 Criteria 用于对条件的封装:

@Test

public void testPageQueryMutil(){

Query query=new SimpleQuery("*:*");

Criteria criteria=new Criteria("item_title").contains("2");

criteria=criteria.and("item_title").contains("5");

query.addCriteria(criteria);

//query.setOffset(20);//开始索引(默认0)

//query.setRows(20);//每页记录数(默认10)

ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);

System.out.println("总记录数:"+page.getTotalElements());

List<TbItem> list = page.getContent();

showList(list);

}

 
删除全部数据

@Test

public void testDeleteAll(){

Query query=new SimpleQuery("*:*");

solrTemplate.delete(query);

solrTemplate.commit();

}

项目:solrTest