Solr搜索引擎第八篇-索引提交方式

通过WEB控制台提交

登陆web控制台,从这里可以提交索引数据,支持JSON、CSV、XML、上传文件、Solr Command的方式提交索引
在这里插入图片描述
具体提交的数据格式以及携带参数可以参看官方文档:
https://lucene.apache.org/solr/guide/7_5/uploading-data-with-index-handlers.html

使用POST工具提交

其实和使用web控制台提交是一样的,服务端提供了http接口,无非就是调用这个http接口罢了,至于客户端使用什么工具都是可以的。在web控制台中没有具体说明提交数据的格式,在这里会一一说明。

Java客户端使用SorlJ

Java客户端应用可以使用solrj这个工具包,提交索引并查询索引。
pom.xml文件引入solrj:

<dependency>
  <groupId>org.apache.solr</groupId>
  <artifactId>solr-solrj</artifactId>
  <version>7.3.0</version>
</dependency>

solrj底层使用httpclient连接solr服务器实例的。核心的API有SolrClient、SolrRequest、SolrResponse。
SolrClient的子类有如下,需要看情况使用对应的子类:

  • HttpSolrClient – 与指定的一个solr节点通信的客户端,适用于单机模式
  • LBHttpSolrClient –负载均衡地访问一组节点的客户端,适用于SolrCloud模式
  • CloudSolrClient – 访问solrCloud的客户端,适用于SolrCloud模式,常用
  • ConcurrentUpdateSolrClient –并发更新索引用的客户端

SolrClient提供了很多方法,包括增删改查。具体的SolrClient、SolrRequest、SolrResponse提供了哪些方法,可以直接查看代码。
如下一个简单的示例:

package com.dalomao.framework.solr;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.impl.LBHttpSolrClient;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrInputDocument;

/**
 * solr各种客户端demo
 * 要想跑通该demo,必须启动solr实例,且创建内核mycore
 * 实际开发的时候,client客户端设为单例
 */
public class SolrJClientDemo {

	// baseSolrUr 示例
	private static String baseSolrUrl = "http://localhost:8983/solr/";
	private static String baseSolrUrl2 = "http://localhost:7001/solr/";

	//指定集合/内核的URL地址
	private static String baseSolrUrlWithCollection = "http://localhost:8983/solr/mycore";

	//zk地址,适用于SolrCloud模式
	private static String zkServerUrl = "localhost:9983";

	/**
	 * HttpSolrClient:与一个solr Server 通过http进行通信
	 * 适用于独立服务器模式(单机)
	 */
	public static SolrClient getHttpSolrClient(String baseSolrUrl) {
		return new HttpSolrClient.Builder(baseSolrUrl)
				.withConnectionTimeout(1000).withSocketTimeout(6000).build();
	}
	public static SolrClient getHttpSolrClient() {
		return new HttpSolrClient.Builder(baseSolrUrl)
				.withConnectionTimeout(1000).withSocketTimeout(6000).build();
	}

	/**
	 * LBHttpSolrClient: 负载均衡的httpSolrClient <br>
	 * 负载均衡方式: 轮询给定的多个solr server url。
	 * 当某个url不通时,url地址会从活跃列表移到死亡列表中,用下一个地址再次发送请求。<br>
	 * 对于死亡列表中的url地址,会定期(默认每隔1分钟,可设置)去检测是否变活了,再加入到活跃列表中。 <br>
	 * 注意: <br>
	 * 1、不可用于主从结构master/slave的索引场景,因为主从结构必须通过主节点来更新。 <br>
	 * 2、适用于SolrCloud模式,在solrCloud中可用它来进行索引更新,solrCloud中的节点会将请求转发到对应的leader。
	 * 3、对于SolrCloud(leader/replica),使用CloudSolrClient更好。
	 */
	public static SolrClient getLBHttpSolrClient(String... solrUrls) {
		return new LBHttpSolrClient.Builder().withBaseSolrUrls(solrUrls)
				.build();
	}
	public static SolrClient getLBHttpSolrClient() {
		return new LBHttpSolrClient.Builder()
				.withBaseSolrUrls(baseSolrUrl, baseSolrUrl2).build();
	}

	/**
	 * 访问SolrCloud集群用CloudSolrClient<br>
	 * CloudSolrClient 实例通过访问zookeeper得到集群中集合的节点列表,<br>
	 * 然后通过LBHttpSolrClient来负载均衡地发送请求。<br>
	 * 注意:这个类默认文档的唯一键字段为“id”,如果不是的,通过 setIdField(String)方法指定。
	 */
	public static SolrClient getCloudSolrClient(List<String> zkHosts,
			Optional<String> zkChroot) {
		return new CloudSolrClient.Builder(zkHosts, zkChroot).build();
	}
	public static SolrClient getCloudSolrClient() {
		//zk地址,可以多个(zk集群情况下)
		List<String> zkHosts = new ArrayList<String>();
		zkHosts.add(zkServerUrl);

		//zk的根目录若有变更,则需要设置,否则直接放空(一般zk主目录不会变更)
		Optional<String> zkChroot = Optional.empty();

		return new CloudSolrClient.Builder(zkHosts, zkChroot).build();
	}

	public static void main(String[] args) throws Exception {

		// HttpSolrClient 示例:
		SolrClient client = SolrJClientDemo.getHttpSolrClient();

		SolrInputDocument doc = new SolrInputDocument();
		doc.addField("id", UUID.randomUUID().toString());
		doc.addField("name", "HttpSolrClient");

		UpdateResponse updateResponse = client.add("mycore", doc);
		// 记得要提交
		client.commit("mycore");

		System.out.println("------------ HttpSolrClient ------------");
		System.out.println("add doc:" + doc);
		System.out.println("response: " + updateResponse.getResponse());

		client.close();

		// LBHttpSolrClient 示例
		client = SolrJClientDemo.getLBHttpSolrClient();
		doc.clear();
		doc.addField("id", UUID.randomUUID().toString());
		doc.addField("name", "LBHttpSolrClient");

		updateResponse = client.add("mycore", doc);
		// 记得要提交
		client.commit("mycore");
		System.out.println("------------ LBHttpSolrClient ------------");
		System.out.println("add doc:" + doc);
		System.out.println("response: " + updateResponse.getResponse());

		client.close();

		// CloudSolrClient 示例
		client = SolrJClientDemo.getCloudSolrClient();
		doc.clear();
		doc.addField("id", UUID.randomUUID().toString());
		doc.addField("name", "CloudSolrClient");

		updateResponse = client.add("mycore", doc);
		// 记得要提交
		client.commit("mycore");
		System.out.println("------------ CloudSolrClient ------------");
		System.out.println("add doc:" + doc);
		System.out.println("response: " + updateResponse.getResponse());

		client.close();
	}

}

Solr还提供了java bean和对象映射的功能,类似mybatis中的ORM。
定义一个java bean:

package com.dalomao.framework.solr.entity;

import org.apache.solr.client.solrj.beans.Field;

public class SolrProductEntity {
    @Field
    private String id;

    @Field
    private  String name;

    @Field
    private String type;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

定义一个测试类:

package com.dalomao.framework.solr;

import com.dalomao.framework.solr.entity.SolrProductEntity;
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.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;

import java.io.IOException;
import java.util.List;
import java.util.Random;

/**
 * 通过java bean的方式索引和查询
 * 实际开发的时候,client客户端设为单例
 */
public class SolrClientByJavaBeanDemo {

    public static void main(String[] args) throws IOException, SolrServerException {
        //先索引数据
        SolrClient client = SolrJClientDemo.getHttpSolrClient("http://localhost:7001/solr");
        SolrProductEntity entity = new SolrProductEntity();
        entity.setId(new Random().toString());
        entity.setName("笔记本电脑");
        entity.setType("计算机");

        UpdateResponse response = client.addBean("mycore", entity);
        System.out.println(response.toString());
        client.commit("mycore");

        //查询
        SolrQuery query = new SolrQuery("*:*");
        query.addField("id");
        query.addField("name");
        query.setSort("id", SolrQuery.ORDER.asc);

        QueryResponse queryResponse = client.query("mycore", query);
        final List<SolrProductEntity> products = queryResponse.getBeans(SolrProductEntity.class);
        System.out.println(products.toString());
    }
}

结构化数据导入DIH

Solr支持结构化的数据导入,通过使用DIH。支持全量、增量数据导入。
Solr支持从关系数据库、基于http的数据源(如RSS和ATOM提要)、电子邮件存储库和结构化XML 中索引内容。
这一部分内容将会通过实际例子进行说明,请跳转Solr搜索引擎第九篇-DataImportHadler导入MySQL数据超详细

猜你喜欢

转载自blog.csdn.net/supermao1013/article/details/83718924