2018年7月30日
1.搜索引擎框架
百度
google
Lucene 单机操作,就是一堆jar包中的api的使用,自己干预,如何创建索引库,删除索引库,更新索引库,高亮,自己调度API
Solr 支持web应用研发,它封装好了对索引库的操作,直接做高级API编程。
ElasticSearch 默认支持集群的,调度,统一协调,任务派发,ZooKeeper (KeepAlived 简单)
Lucene简介
Lucene是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,
部分文本分析引擎。
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的
全文检索引擎。
Lucene最初是由Doug Cutting 所撰写的,是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎的主要开发者,后来在Excite担任高级
系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出Lucene的目标是为各种中小型应用程式加入全文检索功能。
OSChina使用Lucene实现全文搜索。
索引:
全文索引
SQL Server全文索引
Mysql全文索引
全文搜索是一种将文件中所有文本与搜索项匹配的文字资料检索方法:
建文本库---》建立索引---》执行搜索---》过滤结果
ElasticSearch简介
ElasticSearch是一个基于Lucene实时分布式搜索和分析引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,
安装使用方便。基于RestFul接口。
ElasticSearch就是为可用和可扩展而生的。可以通过购置性能更强的服务器来完成,称为垂直扩展或者向上扩展,或者增加
更多的服务器来完成,称为水平扩展或者向外扩展。
ES核心概念:
近实时
集群:一个或者多个节点的集合,保存应用的全部数据,并提供基于节点集成式的索引和搜索功能。
节点
分片:每个索引分成多个分片
小Tip: 默认ES每个索引分配5个分片,一个副本(5个分片),共计10个分片。
SpringBoot 整合 ElasticSearch:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>3.0.9</version>
</dependency>
配置文件配置:
spring.data.elasticsearch.cluster-nodes=123.56.20.15:9300
spring.data.elasticsearch.properties.transport.tcp.connect_timeout=1200s
------------------------------------------
ElasticsearchRepository(能力是最强的)---->ElasticsearchCrudRepository--->PagingAndSortingRepository--->CrudRepository
---------------------------------------------------------------------------------
SpringSequrity认证:
步骤一:依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--thymeleaf和springsecurity整合的依赖-->
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>
<!--thymeleaf 新的模板引擎,比jsp要出色-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
步骤二:
application.properties中需要的配置
##模板引擎的配置
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.cache = false
spring.thymeleaf.mode=HTML5
步骤三:
准备UI页面
1.1 login.html:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>登录</title>
<script type="text/javascript" th:src="@{/js/jquery-3.3.1.js}"></script>
<script type="text/javascript">
</script>
</head>
<body>
<div>
<form th:action="@{/login}" method="post">
<h2>请登录</h2>
用户名:<input name="username" type="text"/><br/>
密码:<input name="password" type="password"/><br/>
<input type="submit" value="登录"/><br/>
<div th:if="${loginError}"></div>
<div th:text="${errorMsg}"></div>
</form>
</div>
</body>
</html>
1.2 index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
<meta charset="UTF-8">
<title>博客系统</title>
<script type="text/javascript" th:src="@{/js/jquery-3.3.1.js}"></script>
<script type="text/javascript">
</script>
</head>
<body>
<div>
<!--authorize:认证,授权-->
<div sec:authorize="isAuthenticated()">
<p>登录的用户名为:<span sec:authentication="name"></span></p>
<p>登录的角色为:<span sec:authentication="principal.authorities"></span></p>
</div>
<!--匿名的。未经过认证的-->
<div sec:authorize="isAnonymous()">
<p>未登录</p>
</div>
</div>
</body>
</html>
步骤四:核心配置
在util层创建一个类SecurityConfig,继承了 WebSecurityConfigurerAdapter
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/css/**","/js/**","/fonts/**","/index").permitAll() //都可以访问
.antMatchers("/users/**").hasRole("ADMIN") //需要相应的角色才能访问
.and()
.formLogin() //基于form表单登录验证
.loginPage("/login") //自定义登录信息
.failureUrl("/login-error");
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception{
auth
.inMemoryAuthentication() //认证信息存储在内存中
.passwordEncoder(new MyPasswordEncoder()) //在此处应用自定义PasswordEncoder
.withUser("happy").password("6375196").roles("ADMIN");
}
}
步骤五:自定义密码编辑器: MyPasswordEncoder
import org.springframework.security.crypto.password.PasswordEncoder;
public class MyPasswordEncoder implements PasswordEncoder {
@Override
public String encode(CharSequence arg0) {
return arg0.toString();
}
@Override
public boolean matches(CharSequence arg0, String arg1) {
return arg1.equals(arg0.toString());
}
}
步骤六:controller中给路径做界面映射和寻址
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MainController {
@GetMapping("/index")
public String index(){
return "index";
}
@GetMapping("/login")
public String login(){
return "login";
}
@GetMapping("/login-error")
public String loginError(Model model){
model.addAttribute("loginError",true);
model.addAttribute("errorMsg","登录失败,用户名或密码错误");
return "login";
}
}