创建 Solr 搜索实现项目
项目名称
gaming-server-service-search
POM
增加 Solr 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
完整 POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ooqiu.gaming</groupId>
<artifactId>gaming-server-service-search</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>gaming-server-service-search</name>
<description></description>
<parent>
<groupId>com.ooqiu.gaming</groupId>
<artifactId>gaming-server-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!-- Spring Boot Begin -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Boot End -->
<!-- Database Begin -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Database End -->
<!-- Alibaba Begin -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!-- Alibaba End -->
<!-- Zookeeper Begin -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<!-- Zookeeper End -->
<!-- Project Begin -->
<dependency>
<groupId>com.ooqiu.gaming</groupId>
<artifactId>gaming-server-service-search-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.ooqiu.gaming</groupId>
<artifactId>gaming-server-commons</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- Project End -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.ooqiu.gaming.service.</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
Application
package com.ooqiu.gaming.service.search;
import com.alibaba.dubbo.container.Main;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan(basePackages = "com.ooqiu.gaming.service.search.mapper")
public class GamingServerServiceSearchApplication {
public static void main(String[] args) {
SpringApplication.run(GamingServerServiceSearchApplication.class, args);
Main.main(args);
}
}
application.yml
spring:
application:
name: gaming-server-service-search
data:
solr:
host: http://192.168.75.135:8983/solr
datasource:
druid:
url: jdbc:mysql://192.168.75.132:3306/toutiao?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
initial-size: 1
min-idle: 1
max-active: 20
test-on-borrow: true
driver-class-name: com.mysql.jdbc.Driver
dubbo:
scan:
base-packages: com.ooqiu.gaming.service.search.api
application:
id: gaming-server-service-search
name: gaming-server-service-search
protocol:
id: dubbo
name: dubbo
registry:
id: zookeeper
address: zookeeper://192.168.75.132:2181?backup=192.168.75.132:2182,192.168.75.132:2183
application.properties
dubbo.protocol.port=20884
Solr 测试类
主要用于初始化索引库
package com.ooqiu.gaming.service.search.test;
import com.ooqiu.gaming.server.domain.Article;
import com.ooqiu.gaming.service.search.mapper.ArticleMapper;
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.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
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 java.io.IOException;
import java.util.List;
import java.util.Map;
@SpringBootTest
@RunWith(SpringRunner.class)
public class SolrTest {
@Autowired
private SolrClient solrClient;
@Autowired
private ArticleMapper articleMapper;
/**
* 添加索引库
*/
@Test
public void addDocument() throws IOException, SolrServerException {
// 创建文档对象
SolrInputDocument document = new SolrInputDocument();
// 向文档中添加域
document.addField("id", 152034783404107L);
document.addField("article_title", "腾讯游戏安全中心:《绝地求生》《H1Z1》外挂举报已收到 静待国服上线");
// 将文档添加到索引库
solrClient.add(document);
// 提交
solrClient.commit("ik_core");
}
/**
* 删除索引库
*/
@Test
public void delDocument() throws IOException, SolrServerException {
solrClient.deleteByQuery("*:*");
solrClient.commit("ik_core");
}
/**
* 初始化索引库
*/
@Test
public void initDocument() throws IOException, SolrServerException {
List<Article> articles = articleMapper.selectAll();
for (Article article : articles) {
SolrInputDocument document = new SolrInputDocument();
document.addField("id", article.getId());
document.addField("article_title", article.getTitle());
document.addField("article_source", article.getSource());
document.addField("article_introduction", article.getIntroduction());
document.addField("article_url", article.getUrl());
document.addField("article_cover", article.getCover());
solrClient.add(document);
solrClient.commit("ik_core");
}
}
/**
* 查询索引库
*/
@Test
public void queryDocument() throws IOException, SolrServerException {
// 创建查询对象
SolrQuery query = new SolrQuery();
// 设置查询条件
query.setQuery("演示");
// 设置分页
query.setStart(0);
query.setRows(10);
// 设置默认搜索域
query.set("df", "article_keywords");
// 设置高亮显示
query.setHighlight(true);
query.addHighlightField("article_title");
query.setHighlightSimplePre("<span style='color:red;'>");
query.setHighlightSimplePost("</span>");
// 执行查询操作
QueryResponse queryResponse = solrClient.query("ik_core", query);
// 查询结果集
SolrDocumentList results = queryResponse.getResults();
// 获取高亮显示
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
// 遍历结果集
for (SolrDocument result : results) {
String articleTitle = "";
// 获取高亮显示
List<String> list = highlighting.get(result.get("id")).get("article_title");
if (list != null && list.size() > 0) {
articleTitle = list.get(0);
}
else {
articleTitle = (String) result.get("article_title");
}
System.out.println(articleTitle);
}
}
}
实现接口
package com.ooqiu.gaming.service.search.api.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.google.common.collect.Lists;
import com.ooqiu.gaming.service.search.api.SearchService;
import com.ooqiu.gaming.service.search.domain.SearchResult;
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.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@Service(version = DubboVersionConstant.DUBBO_VERSION_GAMING_SERVER_SERVICE_SEARCH)
public class SearchServiceImpl implements SearchService {
@Autowired
private SolrClient solrClient;
@Override
public List<SearchResult> search(String queryString, int page, int rows) {
List<SearchResult> searchResults = Lists.newArrayList();
// 创建查询对象
SolrQuery query = new SolrQuery();
// 设置查询条件
query.setQuery(queryString);
// 设置分页条件
query.setStart((page - 1) * rows);
query.setRows(rows);
// 设置默认搜索域
query.set("df", "article_keywords");
// 设置高亮显示
query.setHighlight(true);
query.addHighlightField("article_title");
query.setHighlightSimplePre("<span style='color:red'>");
query.setHighlightSimplePost("</span>");
try {
// 执行查询操作
QueryResponse queryResponse = solrClient.query("ik_core", query);
SolrDocumentList solrDocuments = queryResponse.getResults();
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
for (SolrDocument solrDocument : solrDocuments) {
SearchResult result = new SearchResult();
result.setId((String) solrDocument.get("id"));
result.setArticle_cover((String) solrDocument.get("article_cover"));
result.setArticle_introduction((String) solrDocument.get("article_introduction"));
result.setArticle_source((String) solrDocument.get("article_source"));
result.setArticle_url((String) solrDocument.get("article_url"));
String articleTile = "";
List<String> list = highlighting.get(solrDocument.get("id")).get("article_title");
if (list != null && list.size() > 0) {
articleTile = list.get(0);
} else {
articleTile = (String) solrDocument.get("article_title");
}
result.setArticle_title(articleTile);
searchResults.add(result);
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return searchResults;
}
}