一、创建Maven工程,导入pom文件
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.noggit</groupId>
<artifactId>noggit</artifactId>
<version>0.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>6.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.1-alpha</version>
</dependency>
</dependencies>
二、创建solr连接
package com.solr.server;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
public class SolrServer {
private static HttpSolrClient server = null;
private static String url = "http://localhost:8081/solr/test";
public static HttpSolrClient getServer() {
if (server == null) {
server = new HttpSolrClient(url);
server.setDefaultMaxConnectionsPerHost(1000);
server.setMaxTotalConnections(10000);//最大连接数
server.setConnectionTimeout(60000);//设置连接超时时间(单位毫秒) 1000
server.setSoTimeout(60000); 设置读数据超时时间(单位毫秒) 1000
server.setFollowRedirects(false);//遵循从定向
server.setAllowCompression(true);//允许压缩
}
return server;
}
public static void main(String[] args) {
System.out.println(getServer());
}
}
三、测试Solr原生增删改查
package com.solr.server;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
public class SolrTest {
/**
* 添加/修改 索引
* @author xuye
* Date: 2017年5月22日 下午3:10:53
* @throws Exception
*/
public static void addIndex() throws Exception {
HttpSolrClient server = SolrServer.getServer();
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "1003");
doc.addField("name_s", "test3");//_s String类型
doc.addField("score_i", "103");//_i 整型
server.add(doc);
server.commit();
//添加多个
Collection<SolrInputDocument> docs = new ArrayList();
for (int i = 0; i < 10; i++) {
SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField("id", i);
doc2.addField("name_s", "test3");//_s String类型
doc2.addField("score_i", i);//_i 整型
docs.add(doc2);
}
server.add(docs);
server.commit();
}
/**
* 删除索引 按id
* @author xuye
* Date: 2017年5月22日 下午3:11:18
* @throws Exception
*/
public static void deleteById() throws Exception {
HttpSolrClient server = SolrServer.getServer();
server.deleteById("1002");//按id删除
server.commit();
}
/**
* 删除索引 按list
* @author xuye
* Date: 2017年5月22日 下午3:11:40
* @throws Exception
*/
public static void deleteByList() throws Exception {
HttpSolrClient server = SolrServer.getServer();
List<String> ids = new ArrayList();
ids.add("1001");
ids.add("1002");
server.deleteById(ids);//按list删除
server.commit();
}
/**
* 查询索引
* @author xuye
* Date: 2017年5月22日 下午3:11:49
* @throws Exception
*/
public static void query() throws Exception {
HttpSolrClient server = SolrServer.getServer();
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.setStart(0);//开始记录数
query.setRows(10000);//总条数
QueryResponse queryResponse = server.query(query);
SolrDocumentList results = queryResponse.getResults();
System.out.println("总条数为:" + results.getNumFound());
for (int i = 0; i < results.size(); i++) {
System.out.println(results.get(i).getFieldNames());
System.out.println(results.get(i).getFieldValue("name_s"));
}
}
public static void main(String[] args) throws Exception {
deleteByList();
}
}
四、创建TestBean
package com.solr.server;
import java.io.Serializable;
import org.apache.solr.client.solrj.beans.Field;
public class TestBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Field
private String id;
@Field
private String name_s;
@Field
private Integer score_i;
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
public String getName_s() {
return this.name_s;
}
public void setName_s(String name_s) {
this.name_s = name_s;
}
public Integer getScore_i() {
return this.score_i;
}
public void setScore_i(Integer score_i) {
this.score_i = score_i;
}
@Override
public String toString() {
return "TestBean [id=" + this.id + ", name_s=" + this.name_s + ", score_i=" + this.score_i + "]";
}
}
五、使用SolrBean进行增删改查
package com.solr.server;
import java.util.ArrayList;
import java.util.List;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
public class SolrBean {
/**
* 按Bean 添加/修改 索引
* @author xuye
* Date: 2017年5月22日 下午3:10:53
* @throws Exception
*/
public static void addIndex() throws Exception {
HttpSolrClient server = SolrServer.getServer();
//添加多个
List<TestBean> docs = new ArrayList();
for (int i = 6; i < 10; i++) {
TestBean bean = new TestBean();
bean.setId(i + "");
bean.setName_s("test" + i);
bean.setScore_i(i);
docs.add(bean);
}
server.addBeans(docs);
server.commit();
}
/**
* 删除索引 按查询
* @author xuye
* Date: 2017年5月22日 下午3:11:18
* @throws Exception
*/
public static void deleteByQuery(String query) throws Exception {
HttpSolrClient server = SolrServer.getServer();
query = "*:*";
server.deleteByQuery(query);
server.commit();
}
//查询索引
public static void query() throws Exception {
HttpSolrClient server = SolrServer.getServer();
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.setStart(0);//开始记录数
query.setRows(10000);//总条数
QueryResponse queryResponse = server.query(query);
List<TestBean> results = queryResponse.getBeans(TestBean.class);
System.out.println("总条数为:" + results.size());
for (TestBean testBean : results) {
System.out.println(testBean.toString());
}
}
public static void main(String[] args) throws Exception {
deleteByQuery(null);
addIndex();
}
}
六、Solr 查询语法简单解析
package com.solr.server;
import java.util.List;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
public class SolrQueryDemo {
//查询索引
public static void query() throws Exception {
HttpSolrClient server = SolrServer.getServer();
SolrQuery query = new SolrQuery();
//query.setQuery("*:*");
//query.set("q", "*:*");
//query.set("q", "name_s:test1?");//?通配单个字符
//query.set("q", "name_s:tes*");//*通配多个字符
//query.set("q", "name_s:test~0.5");// ~ 模糊查询 可以直接用test~ test~0.5表示相似0.5以上的
//如检索相隔10个单词的“apache”和”“akarta”,“jakarta apache”~10
query.set("q", "name_s:test15 or name_s:test16");
/*布尔操作符AND、||
布尔操作符OR、&&
布尔操作符NOT、!、-(排除操作符不能单独与项使用构成查询)
“+” 存在操作符,要求符号“+”后的项必须在文档相应的域中存在
( ) 用于构成子查询
[ ] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710]
{ }不包含范围检索,如检索某时间段记录,不包含头尾
date:{200707 TO 200710}
" 转义操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : " */
/*查询某个字段非空的记录 比如:fq=FieldName:[‘’ TO *] 查询FieldName非空的数据。
查询某个字段为空的记录 比如:查询公司名称为空的记录可以采用如下语法实现(似乎目前为止只有此方法可行):
-company:[* TO *]
取反实例:fq=!fstate:1*/
//“^”控制相关度检索,如检索jakarta apache,同时希望去让“jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache
query.set("fl", "score_i,name_s");//fl 查询字段
query.set("sort", "score_i desc");//sort 排序方式,正序用asc
//wt 输出格式:json xml等
query.set("fq", "score_i:[15 TO *]");//分数>=15 fq 过滤条件:在q查询符合结果中同时是fq查询符合的
query.setStart(0);//开始记录数
query.setRows(10000);//总条数
QueryResponse queryResponse = server.query(query);
List<TestBean> results = queryResponse.getBeans(TestBean.class);
System.out.println("总条数为:" + results.size());
for (TestBean testBean : results) {
System.out.println(testBean.toString());
}
}
public static void main(String[] args) throws Exception {
query();
}
}
七、Solr 多核/Core 关联查询
package com.solr.server;
import java.util.List;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
public class SolrMulticore {
public static void query(String queryStr) throws Exception {
HttpSolrClient server = SolrServer.getServer();
SolrQuery query = new SolrQuery();
query.setQuery(queryStr);
//query.setStart(0);//开始记录数
//query.setRows(30);//总条数
query.set("start", 0);
query.set("rows", 20);
query.set("shards", "localhost:8081/solr/test"
+ ",localhost:8081/solr/core1"
+ ",localhost:8081/solr/core2");
//shards可以关联多个core,用逗号分隔. id 是唯一主键,多个核的id要不一样
QueryResponse queryResponse = server.query(query);
List<TestBean> results = queryResponse.getBeans(TestBean.class);
System.out.println("总条数为:" + results.size());
for (TestBean testBean : results) {
System.out.println(testBean.toString());
}
}
public static void main(String[] args) throws Exception {
query("*:*");
}
}