solrcloud搭建
群里小伙伴需要一个solrcloud的解决案例。正好好久没碰过solr了。决定写个demo,顺便重新熟悉下solr。
solr版本:5.0
solr链接:http://archive.apache.org/dist/lucene/solr/5.0.0/
jdk版本:1.70+
windows环境安装:
cd D:\app\solr-5.0.0\bin
solr.cmd -c -z localhost:2181 -p 8983
cd D:\app\solr-5.0.0-01\bin
solr.cmd -c -z localhost:2181 -p 8984
cd D:\app\solr-5.0.0-02\bin
solr.cmd -c -z localhost:2181 -p 8985
注意端口号不要冲突-z 表示zookeeper连接配置 ,zookeeper服务要先启动。
服务全部启动好,之后校验下是否成功。
http://localhost:8983/solr/#/~cloud?view=tree
创建conlection
cd D:\app\solr-5.0.0\bin
solr.cmd create_collection -c example -d ../example/example-DIH/solr/solr/conf/ -shards 3 -replicationFactor 2
参数说明:
- -c : collection名称
- -d : 配置文件的路径,可以使用上面提供的实例配置
- -n : 配置名称可以和collection名称不同,默认这个参数不填的话,会使用collection名称作为config名称
- -shards : 创建的shard个数,建议和集群节点数量一致。
- -replicationFactor : 每个shard的副本数,综合考虑为了保证集群的稳定性,建议配置为 最少2个,最多集群节点数量/shard数量 * 2
校验结果:http://localhost:8983/solr/#/~cloud
服务端配置暂时告一段落,之后补上中文分词。
- 客户端配置:
使用spring-boot-starter-solr来简化集成。核心是spring-data-solr
pom.xml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> <relativePath/> </parent>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.7</java.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-solr</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
|
- 剩下就是javaconfig了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
package com.chenxun.solr.config;
import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.impl.CloudSolrClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.solr.core.SolrTemplate; import org.springframework.data.solr.core.convert.CustomConversions; import org.springframework.data.solr.core.convert.MappingSolrConverter; import org.springframework.data.solr.core.convert.SolrConverter; import org.springframework.data.solr.core.mapping.SimpleSolrMappingContext; import org.springframework.data.solr.repository.config.EnableSolrRepositories;
@Configuration @EnableSolrRepositories(basePackages = { "com.chenxun.solr" }, multicoreSupport = true) public class SolrConfig {
@Value("${spring.data.solr.zk-host}") private String zkHost;
@Bean public SolrClient solrClient() { return new CloudSolrClient(zkHost); }
@Bean public SolrTemplate solrTemplate(SolrClient solrClient,SolrConverter solrConverter) throws Exception { SolrTemplate solrTemplate = new SolrTemplate(solrClient); solrTemplate.setSolrConverter(solrConverter); return solrTemplate; }
@Bean public SolrConverter solrConverter(SimpleSolrMappingContext simpleSolrMappingContext,CustomConversions customConversions){ MappingSolrConverter solrConverter=new MappingSolrConverter(simpleSolrMappingContext); solrConverter.setCustomConversions(customConversions); return solrConverter;
}
@Bean public SimpleSolrMappingContext simpleSolrMappingContext(){ SimpleSolrMappingContext simpleSolrMappingContext=new SimpleSolrMappingContext(); return simpleSolrMappingContext; }
@Bean public CustomConversions customConversions(){ CustomConversions customConversions=new CustomConversions();
return customConversions; } }
|
- 实体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
package com.chenxun.solr.model;
import java.util.HashMap; import java.util.List; import java.util.Map;
import lombok.Data;
import org.apache.solr.client.solrj.beans.Field; import org.springframework.data.annotation.Id; import org.springframework.data.solr.core.mapping.Dynamic; import org.springframework.data.solr.core.mapping.Indexed; import org.springframework.data.solr.core.mapping.SolrDocument; import org.springframework.stereotype.Component;
@SolrDocument(solrCoreName="example") @Data public class Product {
@Field("id") @Id private String id;
@Field private float price;
@Field private String name;
@Field("*_s") @Dynamic private Map<String,String> map =new HashMap<String, String>(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
package com.chenxun.solr.repository;
import org.springframework.data.solr.repository.SolrCrudRepository;
import com.chenxun.solr.model.Product;
public interface ProductRepository extends SolrCrudRepository<Product, String>{ Iterable<Product> findByName(String name);
}
|
spring.properties1 2 3
| spring.data.solr.zk-host=localhost:2181
|
test.java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
package com.chenxun;
import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map;
import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;
import com.chenxun.solr.model.Product; import com.chenxun.solr.repository.ProductRepository;
@RunWith(SpringRunner.class) @SpringBootTest public class ChenxunSolrApplicationTests {
@Autowired private ProductRepository productRepository; @Test public void contextLoads() { productRepository.deleteAll(); long count=productRepository.count(); Assert.assertTrue("empty count", count==0); Product product=new Product(); product.setId("product-001"); product.setName("xxx"); Map<String,String> map=new HashMap<>(); map.put("key01", "abc"); map.put("key02", "123"); product.setMap(map); productRepository.save(product); Product product1=new Product(); product1.setId("product-002"); product1.setName("yyy"); Map<String,String> map1=new HashMap<>(); map1.put("key01", "abc1"); map1.put("key02", "1234"); product1.setMap(map1); productRepository.save(product1); count=productRepository.count(); Assert.assertTrue(count==2); Iterator<Product> it=productRepository.findByName("yyy").iterator(); while(it.hasNext()){ Assert.assertTrue( it.next().getId().equals("product-002")); } }
}
|
到此大功告成,下一篇补上中文分词就OK了。
代码地址: https://github.com/ChenXun1989/chenxun-solr