Solr

概念:

1. 搜索引擎的技术,建立在Lucene之上,可以解决跨平台,跨语言的问题.(Lucene本身是个jar包,也就是API,不能独立运行,需要程序的调用来完成全局检索,不具备跨平台,跨语言).
2. 基于Lucene的全文检索服务,是可以独立运行的(war包,运行在tomcat).

solr安装

1. 解压新的tomcat
2. 将solr进行解压
3. 找到solr.war:
* D:\develop\lucene\solr\solr-4.10.3\dist 下,自己的解压目录
* D:\develop\lucene\solr\solr-4.10.3\example\webapps 下也有
4. 将war包放在tomcat的webapps下
5. 启动tomcat,解压war包,关闭tomcat
6. 将D:\develop\lucene\solr\solr-4.10.3\example下有个solr文件夹,将该文件夹拷贝到D盘根目录(习惯)
* solrHome: 是solr运行的主目录
* solrCore: 类似于数据库,可以单独对外提供索引和搜索的服务
* 一个solrHome下包含多个solrCore
7. 在tomcat的webapps下的solr的解压文件夹下的WEB-INF下的web.xml,进行修改:
第41到45行(修改<env-entry-value>的目录为第六步复制后的那个目录):
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>D:\solr</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
8. 复制扩展包:
D:\develop\lucene\solr\solr-4.10.3\example\lib\ext目录下的所有包复制到tomcat的webapps下的solr下的WEB-INF下的lib下,然后可以启动tomcat,在网页进行访问 localhost:8080/solr

中文分析器IK Analyzer

1. 为什么要使用IK呢?
因为solr是由外国人研发,对汉语的分词是一个汉字一个汉字分的,所以引入IK,对中文有很好的分词效果,并且可以自定义扩充分词词典
2. 安装IK
1. 解压IK Analyzer 2012FF_hf1.zip
2. 将解压目录下的IKAnalyzer2012FF_u1.jar放在tomcat下的webapps下的solr下的WEB-INF下的lib下
3. 拷贝解压目录下的IKAnalyzer.cfg.xml,ext_stopword.dic,mydict.dic放在tomcat下的webapps下的solr下的WEB-INF下的classes下,classes不存在创建一个就好
4. 到前面安装solr时的那个solrhome下,修改collection1\conf\schema.xml,在1152行添加:
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
5. 选择分词的时候选择text_ik,就可以使用中文分析器了.(笔者第一次就是选择text,一直失败,谨此注意一下)

配置域:

1. 域是针对当前项目而言的
* 需要根据什么样的条件进行查询
* 查询出来的记过需要展示的数据信息
* 需要用到的字段
2. 使用solr进行索引创建,所指定的域 必须在schema.xml中存在,否则会创建失败.
3. 关于域的属性:
* name: 所指定域的名称
* type: 域的类型-----> 引用filedType中的name属性(是否分词)---->为了索引
* indexed: 是否索引----> 为了搜索
* stored: 是否存储----> 为了展示
* required: 是否必须
* multiValued: 是否多值
4. 针对本项目,修改schema.xml文件,在</schema>之前添加:
<field name="item_goodsid" type="long" indexed="true" stored="true"/>
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="double" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category" type="string" indexed="true" stored="true" />
<field name="item_seller" type="text_ik" indexed="true" stored="true" />
<field name="item_brand" type="string" indexed="true" stored="true" />
5. 复制域(多个字段进行搜索):
<field name="item_keywords" type="text_ik" indexed="true" stored="false"

multiValued="true"/>









6. 动态域(通配)



7. 主键:

主键----> 必填,唯一

SolrJ(原理: http请求和响应)

Solr官方提供的API(理解)

SpringDataSolr(对SolrJ的封装)

1. 引入依赖:
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>1.5.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
</dependencies>
2. 基本的操作:
package springdatasolr; import com.wzlove.pojo.TbItem;
import org.apache.solr.client.solrj.response.UpdateResponse;
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.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.Query;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.data.solr.core.query.result.ScoredPage;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List; /**
* @ClassName SpringDataSolrDemo
* @Author wz157
* @Date 2018/11/8 15:22
* @Description TODO
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext-solr.xml"})
public class SpringDataSolrDemo { // 注入SolrTemplate
@Autowired
private SolrTemplate solrTemplate; /**
* 测试添加索引
*/
@Test
public void testAdd(){ TbItem item = new TbItem();
item.setId(1L);
item.setBrand("华为");
item.setCategory("手机");
item.setGoodsId(1L);
item.setSeller("华为2号专卖店");
item.setTitle("华为 Mate9");
item.setPrice(new BigDecimal(2000));
solrTemplate.saveBean(item);
solrTemplate.commit(); } /**
* 根据主键进行查询,getById()
*/
@Test
public void findByUniqueKey(){
TbItem byId = solrTemplate.getById(1, TbItem.class);
System.out.println(byId);
} /**
* 根据主键进行删除,deleteById() 记得传字节码文件
*/
@Test
public void deleteByUniqueKey(){
solrTemplate.deleteById("1");
// 提交
solrTemplate.commit();
} /**
* 批量插入,saveBeans
*/
@Test
public void testAddList(){ List<TbItem> list = new ArrayList<TbItem>(100);
for (int i = 0; i < 100; i++) {
TbItem item = new TbItem();
item.setId(i + 1L);
item.setBrand("华为" + i);
item.setCategory("手机");
item.setGoodsId(1L);
item.setSeller("华为2号专卖店" + i);
item.setTitle("华为 Mate9" + i );
item.setPrice(new BigDecimal(2000 + i));
list.add(item);
}
solrTemplate.saveBeans(list);
solrTemplate.commit(); } /**
* 分页查询(总页数,总记录数)
* offset 开始索引
* rows 每页记录数
*/
@Test
public void testQueryByPage(){
// 创建查询条件,查询所有使用 *:*
Query query = new SimpleQuery("*:*");
// 设置分页条件
query.setOffset(2);
query.setRows(5);
// 执行分页查询
ScoredPage<TbItem> tbItems = solrTemplate.queryForPage(query, TbItem.class);
// 解析分页结果
for (TbItem tbItem : tbItems) {
System.out.println(tbItem.getBrand());
System.out.println(tbItem.getPrice());
}
System.out.println("总记录的数 : " + tbItems.getTotalElements());
System.out.println("总页数 : " + tbItems.getTotalPages()); } /**
* 条件查询
*/
@Test
public void testPageQueryMutil(){
// 创建查询条件,查询所有使用 *:*
Query query = new SimpleQuery("*:*");
// 设置查询条件(Criterial)
Criteria criteria = new Criteria("item_brand").contains("2");
criteria = criteria.and("item_seller").contains("2");
query.addCriteria(criteria); // 执行分页查询
ScoredPage<TbItem> tbItems = solrTemplate.queryForPage(query, TbItem.class);
// 解析分页结果
for (TbItem tbItem : tbItems) {
System.out.println(tbItem.getBrand() + " " + tbItem.getPrice() + " " + tbItem.getSeller());
}
System.out.println("总记录的数 : " + tbItems.getTotalElements());
System.out.println("总页数 : " + tbItems.getTotalPages()); } /**
* 全部删除
*/
@Test
public void testDeleteAll(){
Query query = new SimpleQuery("*:*");
solrTemplate.delete(query);
solrTemplate.commit();
}
}
3. 配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:solr="http://www.springframework.org/schema/data/solr"
xsi:schemaLocation="http://www.springframework.org/schema/data/solr
http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- solr 服务器地址,相当于配置了HttpSolrServer这个bean -->
<solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr/collection1" /> <!-- solr 模板,使用 solr 模板可对索引库进行 CRUD 的操作 -->
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrServer" />
</bean>
</beans>
4. 实体:
public class TbItem implements Serializable { @Field
private Long id; @Field("item_title")
private String title; @Field("item_price")
private BigDecimal price; @Field("item_image")
private String image; @Field("item_goodsid")
private Long goodsId; @Field("item_category")
private String category; @Field("item_brand")
private String brand; @Field("item_seller")
private String seller; get和set @Override
public String toString() {
return "TbItem{" +
"id=" + id +
", title='" + title + '\'' +
", sellPoint='" + sellPoint + '\'' +
", price=" + price +
", stockCount=" + stockCount +
", num=" + num +
", barcode='" + barcode + '\'' +
", image='" + image + '\'' +
", categoryid=" + categoryid +
", status='" + status + '\'' +
", createTime=" + createTime +
", updateTime=" + updateTime +
", itemSn='" + itemSn + '\'' +
", costPirce=" + costPirce +
", marketPrice=" + marketPrice +
", isDefault='" + isDefault + '\'' +
", goodsId=" + goodsId +
", sellerId='" + sellerId + '\'' +
", cartThumbnail='" + cartThumbnail + '\'' +
", category='" + category + '\'' +
", brand='" + brand + '\'' +
", spec='" + spec + '\'' +
", seller='" + seller + '\'' +
'}';
}
}
5. 需要注意的是在solr库的schema约束中配置域

solr的基本使用的更多相关文章

  1. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  2. Solr 排除查询

    前言 solr排除查询也就是我们在数据库和程序中经常处理的不等于,solr的语法是在定语前加[-].. StringBuilder sbHtml=new StringBuilder(); shBhtm ...

  3. Solr高级查询Facet

    一.什么是facet solr种以导航为目的的查询结果成为facet,在用户查询的结果上根据分类增加了count信息,然后用户根据count信息做进一步搜索. facet主要用于导航实现渐进式精确搜索 ...

  4. [Solr] (源) Solr与MongoDB集成,实时增量索引

    一. 概述 大量的数据存储在MongoDB上,需要快速搜索出目标内容,于是搭建Solr服务. 另外一点,用Solr索引数据后,可以把数据用在不同的项目当中,直接向Solr服务发送请求,返回xml.js ...

  5. sorl6.0+jetty+mysql搭建solr服务

    1.下载solr 官网:http://lucene.apache.org/solr/ 2.目录结构如下 3.启动solr(默认使用jetty部署) 在path路径下将 bin文件夹对应的目录加入,然后 ...

  6. Solr Facet 默认值

    前言 今天在用Solr Facet遇到了默认值的问题,我用Facet.field查询发现数据总共100条,刚开始没有注意,发现少个别数据,但是用这几个个别的id查询又能查出来数据.才发现是Facet默 ...

  7. solr添加多个core

    在D:\solr\solr_web\solrhome文件夹下: 1)创建core0文件夹 2)复制D:\solr\solr_web\solrhome\configsets\basic_configs/ ...

  8. solr定时更新索引遇到的问题(SolrDataImportProperties Error loading DataImportScheduler properties java.lang.NullPointerException)

    问题描述 报如下错误,很显然,问题原因:空指针异常: ERROR (localhost-startStop-1) [   ] o.a.s.h.d.s.SolrDataImportProperties ...

  9. Solr实战:使用Hue+Solr实现标签查询

    公司最近在研究多条件组合查询方案,Google的一位技术专家Sam和我们讨论了几个备选方案. Sam的信: 我做了进一步研究,目前有这么几种做法: 1) 最直接粗暴,只做一个主index,比如按行业+ ...

  10. solr.net的使用

    引子 最近在做一个日志系统,用普通关系型数据库做数据查询遇到了查询的瓶颈,想到了用成熟的搜索应用服务,我所知道的比较成熟的搜索应用服务有solr和es(elasticsearch),由于时间比较仓促, ...

随机推荐

  1. 课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现

    个人贡献 熟悉试验箱各元件功能以及连接组装试验箱 一.实验内容 研究实验箱串口.USB线的调通连接 二.实践步骤 1.打开实验箱,首先了解各元件功能 这个是LTE模块,也叫4G模块,具体的作用是硬件将 ...

  2. WPF编程,通过Double Animation动态旋转控件的一种方法。

    原文:WPF编程,通过Double Animation动态旋转控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/art ...

  3. WPF绑定文本时使用指定格式文本

    原文:WPF绑定文本时使用指定格式文本 Text="{Binding PlayletModel.characters,StringFormat=Cast : {0}}" Strin ...

  4. [python]记录Windows下安装matplot的经历

    最近学习在看<机器学习实战>一书,第二章的时候要用到Natplotlib画图,于是便开始安装Matplotlib.本文所用到的所有安装包都可以在文末的链接中找到. 首先从Matplotli ...

  5. mfc 进程的优先级

    知识点:  进程优先级  获取当前进程句柄  优先级设置  优先级变动  优先级获取 一.进程优先级(优先级等级) 简单的说就是进程(线程)的优先级越高,那么就可以分占相对多的CPU时间片. ...

  6. Walle 2.0 发布系统

    目录 walle 2.0 1.walle原理 1.1.walle原理图 1.2.权限设计模型 2.部署walle 2.1.依赖检查安装 2.2.walle部署 3.Walle使用 3.1.用户配置 3 ...

  7. JVM技术周报第2期

    JVM技术周报第2期 JVM技术周报分享JVM技术交流群的讨论内容,由群内成员整理归纳而成.如果你有兴趣入群讨论,请关注「Java技术精选」公众号,通过右下角菜单「入群交流」加我好友,获取入群详情. ...

  8. docker之容器管理

    一.docker常用的创建命令 [root@node03 ~]# docker create --help [root@node03 ~]# docker run --help OPTIONS说明: ...

  9. 从浏览器输入URL到显示页面到底发生了什么?

    首先说明一下,当系统本地缓存了你所请求的资源时,会直接把缓存内容解析并显示,而不会进行以下的一系列行为. 一.DNS域名解析 至今的计算机数量可谓是数不胜数,而它们的唯一识别身份就是ip地址.我们常说 ...

  10. Ajax实例OR技术原理 转自 (http://blog.csdn.net/evankaka )

    摘要:AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.AJAX 是一种用于创建快速动态网页的 ...