Springboot2(45)集成solr7,solrCloud

源码地址

springboot2教程系列

solrcloud导入mysql数据配置

最简单的solr7集群搭建(不需要tomcat)

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>

添加配置(application.yml)

#solrcloud配置
spring.data.solr.repositories.enabled: true
spring.data.solr.zk-host: 10.10.2.137:2181,10.10.2.138:2181,10.10.2.139:2181

#单机配置
#spring.data.solr.host: http://localhost:8080/solr
#spring.data.solr.core: collection1

添加solr对象

@Data
@Accessors(chain = true)
@SolrDocument(solrCoreName = "demo")
public class UserDto {

    @Field("id")
    private String userId;

    @Field("address")
    private String address;

    @Dynamic //动态域
    @Field("item_spec_*")
    private Map<String,String> specMap;//最好将范型加上
}

solrCoreName为对应collection名称

添加Repository类

@Repository
public interface UserRepository extends SolrCrudRepository<UserDto, String> {

    @Query(value="address:?0",fields ={"address"},filters = {"id:?0"})
    public List<UserDto> findByPage(String searchTerm, Pageable Pageable);

}

通过?0获取searchTerm的值,@Query中的value等于q查询,filters等于fq查询

  • 基本查询

q 查询的关键字,此参数最为重要,例如,q=id:1,默认为q=:

fl 指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort

start 返回结果的第几条记录开始,一般分页用,默认0开始

rows 指定返回结果最多有多少条记录,默认值为 10,配合start实现分页

sort 排序方式,例如id desc 表示按照 “id” 降序

wt (writer type)指定输出格式,有 xml, json, php等

fq (filter query)过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:q=id:1&fq=sort:[1 TO 5],找关键字id为1 的,并且sort是1到5之间的。

df 默认的查询字段,一般默认指定。

qt (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。

indent 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。

version 查询语法的版本,建议不使用它,由服务器指定默认值。

  • Solr的检索运算符

“:” 指定字段查指定值,如返回所有值*?

“?” 表示单个任意字符的通配

” 表示多个任意字符的通配(不能在检索的项开始使用或者?符号)

“~” 表示模糊检索,如检索拼写类似于”roam”的项这样写:roam将找到形如foam和roams的单词;roam0.8,检索返回相似度在0.8以上的记录。

AND、|| 布尔操作符

OR、&& 布尔操作符

NOT、!、-(排除操作符不能单独与项使用构成查询)

“+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在²

( ) 用于构成子查询

[] 包含范围检索,如检索某时间段记录,包含头尾,date:[201507 TO 201510]

{} 不包含范围检索,如检索某时间段记录,不包含头尾date:{201507 TO 201510}

添加Service类


@Service
public class UserService {

    @Resource
    UserRepository userRepository;

    public void save(UserDto userDto){
        userRepository.save(userDto);
    }

    //查找第一页的数据,按ID升序排序
    public List<UserDto> queryByPage(String search){
        Pageable pageable = PageRequest.of(0,3,new Sort(Sort.Direction.ASC, "id"));
        return userRepository.findByPage(search,pageable);
    }
}

添加controller方法(测试)

@RestController
public class SolrController {

    @Autowired
    private UserService userService;

    @RequestMapping("/add/{id}")
    public String add(@PathVariable  String id,@RequestBody String address){
        userService.save(new UserDto().setUserId(id).setAddress(address));
        return id;
    }

    @RequestMapping("/query")
    public String query(@RequestBody String address){
        List<UserDto> list = userService.queryByPage(address);
        return JSON.toJSONString(list);
    }


}

高亮查询

public List<Item> queryHeightLight(String address){
    List<Item> itemList = new ArrayList<>();
    HighlightQuery highlightQuery = new SimpleHighlightQuery(new SimpleStringCriteria("address:开平"));
    HighlightOptions options = new HighlightOptions();
    options.addField("address");
    options.setSimplePrefix("<br>");
    options.setSimplePostfix("</br>");
    highlightQuery.setHighlightOptions(options);
    HighlightPage<Item> page = solrTemplate.queryForHighlightPage("demo",highlightQuery,Item.class);
    //获取高亮数据
    List<HighlightEntry<Item>> highlighted = page.getHighlighted();
    for (HighlightEntry<Item> itemHighlightEntry : highlighted) {
        //获取SKU信息
        Item item = itemHighlightEntry.getEntity();
        //获取高亮数据
        List<HighlightEntry.Highlight> highlights = itemHighlightEntry.getHighlights();
        //高亮数据
        if(highlights!=null && highlights.size()>0 && highlights.get(0).getSnipplets()!=null 
           && highlights.get(0).getSnipplets().size()>0){
            String snipplets = highlights.get(0).getSnipplets().get(0);
            //替换高亮数据
            item.setTitle(snipplets);
            itemList.add(item);
        }
    }
    return itemList;

}

创建文件索引

   /**
     * 创建文件索引
     */
public void upFile(){
    userRepository.deleteAll();
    ContentStreamUpdateRequest up = new ContentStreamUpdateRequest(
        "/update/extract");
    File file = new File("C:/Users/Administrator/Desktop/demo/test.txt");
    try{
        up.addFile(file,"text/plain");
        up.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
        CloudSolrClient solrClient = ((CloudSolrClient)solrTemplate.getSolrClient());
        solrClient.setDefaultCollection("demo");
        solrClient.request(up);
        QueryResponse query = solrClient.query(new SolrQuery("*:*"));
        SolrDocumentList results = query.getResults();
        System.out.println(results);
    }catch (Exception e){

    }

}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值