搜索是网站必备的功能
以前数据都存在数据库中,通过 LIKE %keyword% 进行模糊查询。
当数据量达到一定级别(百万)后,会碰到严重的性能问题,查询速度极慢。
数据库的存储结构决定了模糊查询必须和全表中每一行数据进行比较。
可以使用搜索引擎提升模糊查询效率:
搜索引擎会对存储数据中需要查询的列建立倒排索引。
通过倒排索引可以减少比较次数,极大的提高查询效率。
倒排索引:
这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。
由于不是由记录来确定属性值,而是由属性值来确定记录的位置,
因而称为倒排索引(inverted index)。
开源搜索引擎:
lucence:Doug Cutting 所撰写的一个全文检索引擎架构。
solr:在 lucence 的基础上进行二次开发,形成一个简单易用的搜索引擎。
elasticsearch:在 lucence 的基础上进行二次开发,更符合现代程序员的操作习惯 。
ElasticSearch(最流行的搜索引擎):
概念:
index | 索引 | 可理解为数据库名 |
---|---|---|
type | 类别 | 可理解为表 |
mapping | 数据结构 | 可理解为表结构(字段) |
field | 字段 | 可理解为列 |
安装和使用:
es:6.4.3 maven:3.1.11 ik:6.4.3 暂时先使用这个版本的,新的版本使用时出现的问题开发工具还没有解决。
windows 版:
0. 配置好 jdk 的环境变量
-
解压到 D:/java 目录中
-
进入解压后的 bin 目录
-
安装中文分词插件(jieba,ik)
1. 下载 https://github.com/medcl/elasticsearch-analysis-ik/releases 2.
-
双击 elasticsearch.bat 文件启动 elasticsearch
-
使用 http://localhost:9200 验证是否启动成功
-
关闭 bat 文件的黑窗口即可关闭 elasticsearch
官方推荐通过 restful api 操纵 elasticsearch
-
创建 index
PUT http://localhost:9200/index_name -
创建 mapping,默认名字为 _doc,创建三个字段
POST http://localhost:9200/index_name/_mapping
如:
{
"properties":{
"name":{
"type":"text"
},
"phone":{
"type":"text"
},
"address":{
"type":"text"
}
}
}
- 添加数据(doc/document)
POST http://localhost:9200/index_name/_create/1
{
"content":{
"name":"lisi",
"phone":"1343241443",
"address":"China"
}
}
- 根据关键字进行搜索
POST http://localhost:9200/index_name/_search
{
"query":{
"match":{
"address":"henan"
}
}
}
-
查看所有的 index
GET http://localhost:9200/_cat/indices
-
查看 index 下的所有数据
GET http://localhost:9200/index_name/_search
-
根据 id 获取数据
GET http://localhost:9200/index_name/mapping_name/id
-
删除数据
DELETE http://localhost:9200/index_name/mapping_name/id -
删除 index
DELETE http://localhost:9200/index_name
在 springboot 中操纵 ES
- 引入依赖
<!-- springboot中使用elasticsearch,允许我们像使用jpa一样操纵 -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
spring-data-elasticsearch 允许我们像使用 JPA 一样操纵 ES
- 编写配置文件
# es 集群主节点的地址
spring.data.elasticsearch.cluster-nodes=localhost:9300
# es 集群的名字