陈公子的博客

文字可以宣泄过往,但终究写不出流年

solrcloud搭建

群里小伙伴需要一个solrcloud的解决案例。正好好久没碰过solr了。决定写个demo,顺便重新熟悉下solr。

  1. solr版本:5.0

  2. solr链接:http://archive.apache.org/dist/lucene/solr/5.0.0/

  3. jdk版本:1.70+

  4. 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

  5. 注意端口号不要冲突-z 表示zookeeper连接配置 ,zookeeper服务要先启动。
    服务全部启动好,之后校验下是否成功。

    http://localhost:8983/solr/#/~cloud?view=tree

  6. 创建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

  7. 参数说明:

  • -c : collection名称
  • -d : 配置文件的路径,可以使用上面提供的实例配置
  • -n : 配置名称可以和collection名称不同,默认这个参数不填的话,会使用collection名称作为config名称
  • -shards : 创建的shard个数,建议和集群节点数量一致。
  • -replicationFactor : 每个shard的副本数,综合考虑为了保证集群的稳定性,建议配置为 最少2个,最多集群节点数量/shard数量 * 2
    校验结果:http://localhost:8983/solr/#/~cloud
    服务端配置暂时告一段落,之后补上中文分词。
  1. 客户端配置:
    使用spring-boot-starter-solr来简化集成。核心是spring-data-solr
pom.xml
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

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</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>

  1. 剩下就是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

/**
* Project Name:chenxun-solr
* File Name:SolrConfig.java
* Package Name:com.chenxun.solr.config
* Date:2016年8月20日下午3:11:32
* Copyright (c) 2016, www midaigroup com Technology Co., Ltd. All Rights Reserved.
*
*/

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;

/**
* ClassName:SolrConfig <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2016年8月20日 下午3:11:32 <br/>
*
* @author 陈勋
* @version
* @since JDK 1.7
* @see
*/
@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();
// customConversions.registerConvertersIn(new GenericConversionService(){});
return customConversions;
}
}

  1. 实体
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

/**
* Project Name:chenxun-solr
* File Name:Product.java
* Package Name:com.chenxun.solr.model
* Date:2016年8月20日下午4:48:36
* Copyright (c) 2016, www midaigroup com Technology Co., Ltd. All Rights Reserved.
*
*/
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;

/**
* ClassName:Product <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2016年8月20日 下午4:48:36 <br/>
* @author 陈勋
* @version
* @since JDK 1.7
* @see
*/
@SolrDocument(solrCoreName="example") // Solr collection name
@Data
public class Product {

@Field("id") // Specify field name in solr
@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
    
/**
Project Name:chenxun-solr
* File Name:ProductRepository.java
* Package Name:com.chenxun.solr.repository
* Date:2016年8月20日下午4:54:24
* Copyright (c) 2016, www midaigroup com Technology Co., Ltd. All Rights Reserved.
*
*/

package com.chenxun.solr.repository;

import org.springframework.data.solr.repository.SolrCrudRepository;

import com.chenxun.solr.model.Product;

/**
* ClassName:ProductRepository <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2016年8月20日 下午4:54:24 <br/>
* @author 陈勋
* @version
* @since JDK 1.7
* @see
*/
public interface ProductRepository extends SolrCrudRepository<Product, String>{
Iterable<Product> findByName(String name);

}

spring.properties
1
2
3

spring.data.solr.zk-host=localhost:2181

test.java
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


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

solr中文分词

solr中文分词。
solr5.0 自带一个中文分词包,lucene-analyzers-smartcn-5.0.0.jar。
在安装目录下搜寻找到,并copy到solr提供的web服务目录的lib目录下。
修改collection配置里面的schema.xml。新增字段类型。

schema.xml
1
2
3
4
5
6
7
8
9
10
11
12
<fieldType name="text_cn" class="solr.TextField" positionIncrementGap="100">    
<analyzer type="index">
<!-- 此处需要配置主要的分词类 -->
<tokenizer class="solr.SmartChineseSentenceTokenizerFactory"></tokenizer>
<filter class="solr.SmartChineseWordTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<!-- 此处配置同上 -->
<tokenizer class="solr.SmartChineseSentenceTokenizerFactory"/>
<filter class="solr.SmartChineseWordTokenFilterFactory"/>
</analyzer>
</fieldType>

启动solr cloud服务,新建collection就好。

0%