首先,建立SolrJ连接:import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.impl.HttpSolrClient; SolrClient solrClient = new HttpSolrClient.Builder("http://localhost:8983/solr/my_core").build(); 这就是最基本的Java连接Solr服务器的方式。高效查询实践:使用SolrQuery对象构建查询。SolrQuery query = new SolrQuery(); query.setQuery("field:value"); query.setStart(0); query.setRows(10); QueryResponse response = solrClient.query(query);
添加文档
添加文档到Solr索引:SolrInputDocument doc = new SolrInputDocument(); doc.setField("id", "1"); doc.setField("title", "Test Document"); doc.setField("content", "This is a test"); solrClient.add(doc); solrClient.commit(); 批量添加使用Collection<SolrInputDocument> docs = new ArrayList<>(); 循环添加后 solrClient.add(docs); solrClient.commit();
高效查询技巧
使用Facet查询提升效率:query.addFacetField("category"); query.setFacetLimit(10); 对于分页,设置query.setStart(offset).setRows(pageSize); 过滤查询:query.addFilterQuery("field:value"); 排序:query.setSort("score desc, date desc"); 这些实践能显著提高查询性能。
删除操作
删除文档:solrClient.deleteById("1"); 或 solrClient.deleteByQuery("title:test*"); solrClient.commit(); 确保commit后变化生效。关闭连接:solrClient.close(); 防止资源泄漏。
错误处理与优化
try { QueryResponse response = solrClient.query(query); List<SolrDocument> docs = response.getResults(); } catch (SolrServerException | IOException e) { e.printStackTrace(); } 优化连接池:使用Http2SolrClient或CloudSolrClient for SolrCloud。设置timeout:new HttpSolrClient.Builder(url).withConnectionTimeout(5000).withSocketTimeout(60000).build();
聚合查询示例
SolrQuery query = new SolrQuery("*:*"); query.setRows(0); query.setFacet(true); query.addFacetField("author"); query.addFacetField("category"); 这用于统计和分组,高效获取数据分布。
Q: 如何处理Solr连接超时?
A: 在HttpSolrClient.Builder中设置withConnectionTimeout和withSocketTimeout参数。
Q: SolrJ如何批量插入数据?
A: 创建Collection<SolrInputDocument>,add所有文档,然后solrClient.add(collection); commit();。
Q: 什么是高效查询的Facet?
A: Facet用于对结果进行分组统计,如按字段计数,提升分析效率。
Q: 如何在Java中关闭SolrClient?
A: 调用solrClient.close()方法释放资源。