1. 搜索引擎框架
百度
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:
- org.springframework.boot
- spring-boot-starter-data-elasticsearch
- com.sun.jna
- jna
- 3.0.9
配置文件配置:
- spring.data.elasticsearch.cluster-nodes=123.56.20.15:9300
- spring.data.elasticsearch.properties.transport.tcp.connect_timeout=1200s
- ------------------------------------------
- ElasticsearchRepository(能力是最强的)---->ElasticsearchCrudRepository--->PagingAndSortingRepository--->CrudRepository
- ---------------------------------------------------------------------------------
SpringSequrity 认证:
步骤一: 依赖
- org.springframework.boot
- spring-boot-starter-security
- org.thymeleaf.extras
- thymeleaf-extras-springsecurity4
- org.springframework.boot
- spring-boot-starter-thymeleaf
步骤二:
application.properties 中需要的配置
- ## 模板引擎的配置
- spring.thymeleaf.prefix=classpath:/templates/
- spring.thymeleaf.cache = false
- spring.thymeleaf.mode=html5
步骤三:
准备 UI 页面
- 1.1 login.html:
- xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
- charset="UTF-8">
> 登录
- type="text/javascript" th:src="@{/js/jquery-3.3.1.js}">
- type="text/javascript">
- th:action="@{/login}" method="post">
> 请登录
用户名: name="username" type="text"/>
密码: name="password" type="password"/>
- type="submit" value="登录"/>
- th:if="${loginError}">
- th:text="${errorMsg}">
- 1.2 index.html
- xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
- xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
- charset="UTF-8">
> 博客系统
- type="text/javascript" th:src="@{/js/jquery-3.3.1.js}">
- type="text/javascript">
- sec:authorize="isAuthenticated()">
> 登录的用户名为: sec:authentication="name">
> 登录的角色为: sec:authentication="principal.authorities">
sec:authorize="isAnonymous()">
> 未登录
步骤四: 核心配置
在 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";
- }
- }
来源: http://www.bubuko.com/infodetail-2762964.html