转载

SpringDataSolr的入门

olr和SpringDataSolr的关系

solr 作为一个企业及应用,可以理解为一个搜索引擎的大体上的成品。solr的使用 是通过它提供的若干接口,而Spring Data Solr 是spring 调用solr接口的 进一步封装,简化了solr的使用,可以通过spring-data-solr提供的对象 HttpSolrServer 对文档索引的创建、搜索、分组、排序、分页等等进行操控。功能还是较为完善的。

准备工作和测试

第一步:配置solr服务的域

在你的solr服务所对应的本地库中,找到schema.xml的添加如下域

[XML] 纯文本查看 复制代码

?

<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" />
  <field name="item_updatetime" type="date" indexed="true" stored="true" />

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

  <dynamicField name="item_spec_*" type="string" indexed="true" stored="true" />

第二步:引入相关的依赖和JDK插件

[XML] 纯文本查看 复制代码

?

<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>

<build>

<plugins>
       <!-- java编译插件 -->
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>3.7.0</version>
           <configuration>
               <source>1.8</source>
               <target>1.8</target>
               <encoding>UTF-8</encoding>
           </configuration>
       </plugin>

   </plugins>

</build>

第三步:创建实体和编写属性相关的字段映射

自行提供setter和getter方法

[XML] 纯文本查看 复制代码

?

public class TbItem implements Serializable {

@Field
private Long id;

@Field("item_title")
private String title;

@Field("item_price")
private BigDecimal price;

@Field("item_image")
private String image;

@Field("item_goodsid")
private Long goodsId;

@Field("item_category")
private String category;

@Field("item_brand")
private String brand;

@Field("item_seller")
private String seller;

}

第四步:编写applicationContext-solr.xml

[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.xsd
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="com.pinyougou.solrutil">
</context:component-scan>

<!-- solr服务器地址 -->
<solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr/collection1" />

<!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">

    <constructor-arg ref="solrServer" />

</bean>

</beans>

第五步:进行Solr的集成测试

[Java] 纯文本查看 复制代码

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations="classpath:applicationContext-solr.xml")

public class SpringDataSolrTest {

@Autowired
private SolrTemplate solrTemplate;

//集成测试对应的单元

}

在对应的集成测试单元处编写测试方法

1、添加单个对象到solr

[Java] 纯文本查看 复制代码

?

/**

  • 添加单个对象到solr

*/

@Test

public void beanAddSolr(){

TbItem item=new TbItem();

item.setId(1L);

item.setBrand("华为");

item.setCategory("手机");

item.setGoodsId(1L);

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

item.setTitle("华为Mate9");

item.setPrice(new BigDecimal(2000));

solrTemplate.saveBean(item);

solrTemplate.commit();

}

2、根据主键查询

[Java] 纯文本查看 复制代码

?

/**

  • 根据主键查询

*/

@Test

public void findSolrById(){

TbItem item = solrTemplate.getById(1, TbItem.class);

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

}

3、根据主键删除

[Java] 纯文本查看 复制代码

?

/**

  • 根据主键删除

*/

@Test

public void deleteSolrById(){

UpdateResponse response = solrTemplate.deleteById("1");

  solrTemplate.commit();

}

4、批量导入索引

[Java] 纯文本查看 复制代码

?

/**

  • 将List集合中的对象添加到solr中

*/

@Test

public void beanListAddSolr(){

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();

}

5、分页查询

[Java] 纯文本查看 复制代码

?

/**

  • 分页查询

*/

@Test

public void testPageQuery(){

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

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

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

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());
}

}

/**

  • 用于条件的封装

*/

@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);

}

6、高亮查询

[Java] 纯文本查看 复制代码

?

@Test
public void queryPageAndHightFromSolr(){

// Query query=new SimpleQuery("item_title:手机");

SimpleHighlightQuery query = new SimpleHighlightQuery();

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

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


    //设置高亮的域
    HighlightOptions highlightOptions = new HighlightOptions().addField("item_title").addField("item_category");


    //高亮前缀
    highlightOptions.setSimplePrefix("<em style='color:red'>");

    //高亮后缀
    highlightOptions.setSimplePostfix("</em>");

    //设置高亮选项
    query.setHighlightOptions(highlightOptions);


    //添加查询条件
    Criteria criteria = new Criteria("item_keywords").is("手机");

    query.addCriteria(criteria);

    HighlightPage<TbItem> items = solrTemplate.queryForHighlightPage(query, TbItem.class);

    List<HighlightEntry<TbItem>> highlighted = items.getHighlighted();

    for (HighlightEntry<TbItem> temHighlightEntry : highlighted) {

        List<HighlightEntry.Highlight> highlights = temHighlightEntry.getHighlights();


        TbItem item = temHighlightEntry.getEntity();

        for (HighlightEntry.Highlight highlight : highlights) {

            List<String> snipplets = highlight.getSnipplets();


            Field field = highlight.getField();

            String name = field.getName();

            for (String snipplet : snipplets) {

                if ("item_title".equals(name)) {

                    item.setTitle(snipplet);
                }

                if ("item_category".equals(name)) {

                    item.setCategory(snipplet);
                }

// System.out.println("snipplet = " + snipplet);

}
        }


    }

    


    for (TbItem item : items) {

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

        System.out.println("------------------------------");

        System.out.println(item.getCategory());
    }
     

}

7、清空索引

[Java] 纯文本查看 复制代码

?

/**

  • 删除solr全部数据

*/

@Test

public void deleteAllSolr(){

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

solrTemplate.delete(query);

solrTemplate.commit();

}

原文  https://segmentfault.com/a/1190000020797462
正文到此结束
Loading...