本文共 4131 字,大约阅读时间需要 13 分钟。
引入依赖
org.springframework.boot
spring-boot-starter-data-solr
添加配置(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 specMap;//最好将范型加上
}
solrCoreName为对应collection名称
添加Repository类
@Repository
public interface UserRepository extends SolrCrudRepository {
@Query(value="address:?0",fields ={"address"},filters = {"id:?0"})
public List 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 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 list = userService.queryByPage(address);
return JSON.toJSONString(list);
}
}
高亮查询
public List queryHeightLight(String address){
List itemList = new ArrayList<>();
HighlightQuery highlightQuery = new SimpleHighlightQuery(new SimpleStringCriteria("address:开平"));
HighlightOptions options = new HighlightOptions();
options.addField("address");
options.setSimplePrefix("
");options.setSimplePostfix("");
highlightQuery.setHighlightOptions(options);
HighlightPage page = solrTemplate.queryForHighlightPage("demo",highlightQuery,Item.class);
//获取高亮数据
List> highlighted = page.getHighlighted();
for (HighlightEntry itemHighlightEntry : highlighted) {
//获取SKU信息
Item item = itemHighlightEntry.getEntity();
//获取高亮数据
List 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){
}
}
转载地址:http://nadnv.baihongyu.com/