下载solr程序压缩包
solr常用命令:
solr start –p 端口号 启动solr服务
solr restart –p 端口号 重启solr服务
solr stop –p 端口号 关闭solr服务
进入到solr的bin目录,solr start -p 端口。指定端口启动solr
删除全部索引 <delete><query>*:*</query></delete><commit/>
访问页面如下
solr创建core
在控制台,solr create -c 名称
我这里是,solr create -c iscreamv2
进入到server目录下的solr目录下,将发现创建的iscreamv2的core,创建这个有什么用?
选择这个core可以将数据存储在这个core中,我有尝试两种办法添加数据
第一种办法:
手动添加数据
第二种办法,连接数据,将数据库内容导入在solr的core iscreamv2的容器中
如何连接数据库,将数据放进去?
进入到solr创建的core中,需要编辑的文件已经列出来了
编辑第一个文件,solrconfig配置文件,添加如下代码:
<requestHandler name=”/dataimport” class=”org.apache.solr.handler.dataimport.DataImportHandler”>
<lst name=”defaults”>
<str name=”config”>data-config.xml</str>
</lst>
</requestHandler>
比较重要的是添加了一个xml文件data-config.xml,这个文件是我们自己创建的,这个xml放什么?
这个文件来,配置数据源与数据库表的实体
如下;
<dataConfig>
<dataSource type=”JdbcDataSource” driver=”com.mysql.jdbc.Driver” url=”jdbc:mysql://localhost:3306/test?charactorEncoding=utf-8&serverTimezone=UTC” user=”root” password=”514236″ />
<!–
<document name=”test1″>
<entity name=”test” query=”select * from enginedata” pk=”eid”>
<field column=”eid” name=”eid” />
<field column=”longtime” name=”longtime” />
</entity>
</document>
–>
<document name=”test_1mil_data”>
<entity name=”test_1mil_data” query=”select * from test_1mil_data” pk=”eid”>
<field column=”oid” name=”oid” />
<field column=”otime” name=”otime” />
<field column=”ophone” name=”ophone” />
<field column=”oprice” name=”oprice” />
<field column=”otype” name=”otype” />
<field column=”ozk” name=”ozk” />
<field column=”ostatus” name=”ostatus” />
<field column=”oaddress” name=”oaddress” />
<field column=”oyys” name=”oyys” />
</entity>
</document>
</dataConfig>
上面是数据源的配置,在entity 中是配置一个个表格的实体,表的列明与取的别名,里面有个sql语句是: query=”select * from test_1mil_data”
这里是意思应该是,查询出表格所有数据,这个应该就是最终录入solr容器的数据。可以多配置几个,配置表格实体,执行sql获得数据。
找到managed-schema配置数据库的地方,再次配置一次,这个配置是给solr看的
<fields>
<field name=”oid” type=”plong” indexed=”true” stored=”true” required=”true” multiValued=”false” />
<field name=”otime” type=”string” indexed=”true” stored=”true” required=”true” multiValued=”false” />
<field name=”ophone” type=”string” indexed=”true” stored=”true” required=”true” multiValued=”false” />
<field name=”oprice” type=”plong” indexed=”true” stored=”true” required=”true” multiValued=”false” />
<field name=”otype” type=”string” indexed=”true” stored=”true” required=”true” multiValued=”false” />
<field name=”ozk” type=”string” indexed=”true” stored=”true” required=”true” multiValued=”false” />
<field name=”ostatus” type=”string” indexed=”true” stored=”true” required=”true” multiValued=”false” />
<field name=”oaddress” type=”string” indexed=”true” stored=”true” required=”true” multiValued=”false” />
<field name=”oyys” type=”string” indexed=”true” stored=”true” required=”true” multiValued=”false” />
</fields>
indexed增加索引,name名称。等等
步骤是,config指明我们的xml,我们的xml配置数据源与表实体,里面配置query语句,是数据的来源。在scheam中配置字段给solr看。一个是告诉xml,一个指定数据源,一个是配置给solr看
经过这个三个步骤后
进入solr-webapp中,录入jar包进去,一个是mysql的jar,另外两个哪里找呢?
在他的目录下是由的,不确定在哪个目录了,在solr的文件中是含有这两个jar的
到这里就ok了,下面是连接数据库,将数据录入进去,
启动solr:solr start -p 8081
连接上solr,选择到我们创建的core,选择dataimport数据引入,选择我们mxl中配置的实体,也就是表格。clert的意思是,每次导入数据时,会先清除以前老的数据,可以不选择。选择execute执行。就会连接数据库,将数据导入在solr中
里面也有刷新按钮,当数据很大时,可以导入一会,刷新看看导入的情况
下面是java代码对solr的操作:
jar引入:
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>7.5.0</version>
</dependency>
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
import java.io.IOException;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
public class SolrConnect {
public String baseUrl = "http://localhost:8081/solr/iscreamv2";
public final SolrClient server = new HttpSolrClient.Builder(baseUrl).build();
//查询,solr默认是只查固定行数据,往后就不查了,可以设置。这样就是有多少查询多少数据出来
//Query
@Test
public void QueryTest() throws IOException, SolrServerException {
SolrQuery query = new SolrQuery("ophone:123abc123");
// 设置从哪里->哪里查
// query.setStart(0);
// query.setRows(10000);
// 默认solr只查10行,设置吐出来的最多纪录
query.set("rows", Integer.MAX_VALUE);
// System.out.println("Max Result= "+Integer.MAX_VALUE);
QueryResponse resp = server.query(query);
System.out.println("solr Result Number= "+resp.getResults().size());
System.out.println("solr Result Time= " + resp.getQTime());
System.out.println("solr Result Time= " + resp.getElapsedTime());
}
//add
@Test
public void addTest() throws IOException, SolrServerException {
SolrClient solr = new HttpSolrClient.Builder(baseUrl).build();
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "123456789");
document.addField("name", "MyIScream");
document.addField("content", "solr是个一个Apache搜索引擎");
solr.add(document);
solr.commit();
}
//delete
@Test
public void deleteTest() throws SolrServerException, IOException {
SolrClient solr = new HttpSolrClient.Builder(baseUrl).build();
UpdateResponse ur = solr.deleteById("123456789"); //id 按id删除
UpdateResponse c = solr.commit();
System.out.println(c);
}
//update
@Test
public void updateSTest() throws SolrServerException, IOException {
SolrClient solrServer = new HttpSolrClient.Builder(baseUrl).build();
SolrInputDocument solrInputDocument = new SolrInputDocument();
//唯一标识 id
solrInputDocument.addField("id", "71333674-9403-439a-9af0-75b0c20149f0");
//更新字段1
Map<String, String > operation = new HashMap();
operation.put("set", "54");
//更新字段2
Map<String, String > operation1 = new HashMap();
operation1.put("set", "55");
//添加要更新的字段,添加map进行,一个map一个字段,添加进行进行改动
solrInputDocument.addField("eid",operation);
solrInputDocument.addField("longtime",operation1);
solrServer.add(solrInputDocument);
solrServer.commit();
}
update改的表,没办法一次就改完,每个字段一个map录入进去进行改变
@Test
public void getConnection() throws SQLException {
Connection root = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?charactorEncoding=utf-8&serverTimezone=UTC",
"root",
"514236");
Statement statement = root.createStatement();
long sys = System.currentTimeMillis();
ResultSet resultSet = statement.executeQuery("SELECT * FROM test_1mil_data WHERE ophone='123abc123'");
resultSet.last();
System.out.println(resultSet.getRow());
System.out.println("jdbc耗时: "+(System.currentTimeMillis()-sys));
}
}
查询但个效率比较:
jdbc1.3s
solr 300ms
返回20w个数据比较:
jdbc:3s
solr:8s
solr查询只花700ms,8s-700ms就是整个传输和读取的过程。传输比较耗时,查询比较快
此处为1千万行测试数据
里面含有,对solr的增删改查,常用的是查询,比较麻烦的是改