|
1.Solr的概述:
Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
主要特点:全文搜索、高亮、分面搜索、实时索引、动态类聚、数据库集成、NoSQL特性和丰富的文档处理。 <hr/>2.Solr+ikanalyzer的配置和安装
基于docker-compose + Dockerfile的配置和安装:
需要准备一下文件
docker-compose.yml
ikanalyzer #文件夹
ext.dic
IKAnalyzer.cfg.xml
ik-analyzer-solr5-5.x.jar
managed-schema //注册字段的配置文件
solr-analyzer-ik-5.1.0.jar //中文分词工具包
stopword.dic
Dockerfile //自定义镜像docker-compose.yml
version: &#39;3.1&#39;
services:
solr:
build: ikanalyzer #构建的文件夹
restart: always
container_name: solr #容器名
ports:
- 8983:8983
volumes:
- ./solrdata:/opt/solrdata #数据卷绑定Dockerfile
#自定义镜像
FROM solr:7.1.0
# 创建 Core
WORKDIR /opt/solr/server/solr
RUN mkdir ik_core
WORKDIR /opt/solr/server/solr/ik_core
RUN echo &#39;name=ik_core&#39; > core.properties
RUN mkdir data
RUN cp -r ../configsets/sample_techproducts_configs/conf/ .
# 安装中文分词
WORKDIR /opt/solr/server/solr-webapp/webapp/WEB-INF/lib
#上传并解压
ADD ik-analyzer-solr5-5.x.jar .
ADD solr-analyzer-ik-5.1.0.jar .
#创建目录
WORKDIR /opt/solr/server/solr-webapp/webapp/WEB-INF
ADD ext.dic .
ADD stopword.dic .
ADD IKAnalyzer.cfg.xml .
# 增加分词配置
COPY managed-schema /opt/solr/server/solr/ik_core/conf
WORKDIR /opt/solr<hr/>3.Solr插入数据
3.1 注册字段
插入数据前先设计好数据模型,然后在存到Solr中 注意:在solr中添加数据,必须先在managed-schema文件中注册(shift+g 快速定位到文件底部),被注册过的字段就可以进行分词,这样数据就可以被查询 # 字段域(text_ik:支持中文分词 type=&#34;pfloat&#34;:字段类型 indexed=&#34;true&#34;:支持索引)
<field name=&#34;product_name&#34; type=&#34;text_ik&#34; indexed=&#34;true&#34; stored=&#34;true&#34;/>
<field name=&#34;product_price&#34; type=&#34;pfloat&#34; indexed=&#34;true&#34; stored=&#34;true&#34;/>
<field name=&#34;product_pimage&#34; type=&#34;text_general&#34; indexed=&#34;true&#34; stored=&#34;true&#34;/>
<field name=&#34;product_pdesc&#34; type=&#34;text_ik&#34; indexed=&#34;true&#34; stored=&#34;true&#34;/>
# 复制域(Solr 的搜索优化功能,将多个字段域复制到一个域里,提高查询效率)
<field name=&#34;product_name_pdesc&#34; type=&#34;text_ik&#34; indexed=&#34;true&#34; stored=&#34;false&#34; multiValued=&#34;true&#34;/>
<copyField source=&#34;product_name&#34; dest=&#34;product_name_pdesc&#34;/>
<copyField source=&#34;product_pdesc&#34; dest=&#34;product_name_pdesc&#34;/>注册完字段必须要将配置文件复制到容器,不是实时更新,或者选择删除镜像重新构建
# 复制到容器
docker cp managed-schema solr:/opt/solr/server/solr/ik_core/conf
# 重启容器
docker-compose restart3.2 web中添加数据
# 下面的字段必须在solr 中注册过才可以使用
{
id: &#34;1&#34;,
product_name: &#34;小米9 Pro&#34;,
product_price: 3999,
product_pdesc: &#34;小米9 Pro 不仅是一部超快的 5G 手机,更是一部全面成熟的性能旗舰&#34;
}

添加数据
3.3 web中查询数据

查询数据
3.4 web中删除数据

删除数据
<hr/>4.Java操作Solr
添加依赖 spring:
data:
solr:
host: http://192.168.88.88:8983/solr/ik_core编写配置文件 <!--solr核心依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>4.1 查询数据
/**
* 简单查询
* 1.先设置查询参数==>封装一个SolrQuery对象
* 2.提交给solrClient执行查询并得到结果集
* 3. 解析结果集
*/
@Autowired
SolrClient solrClient;
@Test
void testSimpleQuery() throws IOException, SolrServerException {
SolrQuery query = new SolrQuery();
String keyword = &#34;手机&#34;;
query.setQuery(keyword);
query.set(&#34;df&#34;,&#34;product_name_pdesc&#34;);
query.setStart(0);
query.setRows(10);
QueryResponse response = solrClient.query(query);
SolrDocumentList results = response.getResults();
List<Product> products = new ArrayList<>();
for (SolrDocument result : results) {
Long id = Long.valueOf((String)result.getFieldValue(&#34;id&#34;));
String product_name = (String) result.getFieldValue(&#34;product_name&#34;);
Float product_price = (Float)result.getFieldValue(&#34;product_price&#34;);
String product_pdesc = (String) result.getFieldValue(&#34;product_pdesc&#34;);
Product product = new Product();
//将从solr中查询到的数据封装到JavaBean中
product.setId(id);
product.setProduct_name(product_name);
product.setProduct_pdesc(product_pdesc);
product.setProduct_price(new BigDecimal(product_price));
products.add(product);
}
System.out.println(products);
}4.2 添加数据
/***
* 从数据库中检索出数据,将数据插入到solr库中
*/
@Autowired
SolrClient solrClient;
@Test
void TestInsertDataToSolr(){
List<Product> products = productSearchMapper.selectAll();
System.out.println(products);
//遍历products集合,江北一个product对象封装成一个SolrInputDocument对象
//再把对象添加到集合中
//将该集合添加到solr库中
List<SolrInputDocument> docs= new ArrayList<>();
for (Product product : products) {
SolrInputDocument doc = new SolrInputDocument();
doc.setField(&#34;id&#34;,product.getId());
doc.setField(&#34;product_name&#34;,product.getProduct_name());
doc.setField(&#34;product_price&#34;,product.getProduct_price().floatValue());
doc.setField(&#34;product_pdesc&#34;,product.getProduct_pdesc());
docs.add(doc);
}
try {
solrClient.add(docs);
solrClient.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}4.3 高亮查询
@Autowired
SolrClient solrClient;
@Test
void testHightLight() throws IOException, SolrServerException {
SolrQuery query = new SolrQuery();
//设置查询参数
String keyword = &#34;小米&#34;;
query.setQuery(keyword);
query.set(&#34;df&#34;,&#34;product_name_pdesc&#34;);
query.setStart(0);
query.setRows(10);
//高亮
query.setHighlight(true);
query.addHighlightField(&#34;product_name&#34;);
query.setHighlightSimplePre(&#34;<span style=&#39;color:green&#39;>&#34;);
query.setHighlightSimplePost(&#34;</span>&#34;);
//执行查询,得到结果集
QueryResponse response = solrClient.query(query);
List<Product> products = new ArrayList<>();
SolrDocumentList results = response.getResults();
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
for (SolrDocument result : results) {
Product product = new Product();
String id_str = (String) result.getFieldValue(&#34;id&#34;);
Long id = Long.valueOf(id_str);
product.setId(id);
//高亮的商品名称的封装
Map<String, List<String>> stringListMap = highlighting.get(id_str);
List<String> product_names = stringListMap.get(&#34;product_name&#34;);
System.out.println(product_names);
String product_nameHl = product_names.get(0);
product.setProduct_name(product_nameHl);
//高亮end
Float product_price = (Float)result.getFieldValue(&#34;product_price&#34;);
product.setProduct_price(new BigDecimal(product_price));
String product_pdesc = (String)result.getFieldValue(&#34;product_pdesc&#34;);
product.setProduct_pdesc(product_pdesc);
products.add(product);
}
System.out.println(products);
}
<hr/>2020年2月26日02:01:39 |
|