1.全文检索
全文检索是通过文本内容进行全面搜索的技术。通过全文检索可以快速地在大量文本数据中查找包含特定关键词或者短语的文档,并且返回相关的搜索结果。
检索和查询的区别
- 检索没有搜索条件边界,检索的结果取决于相关性,相关性计算无明确边界性条件,比如同义词、谐音、别名等等都可以作为相关性的判断依据。
- 查询有搜索条件边界,举个例子:现在有张 t 表,我要查询 t 表中的所有字段且查询条件是 id = 1,age = 18
,那么我写出来的sql语句就是这样的
select * from t1 where id = 1 and age = 18;
这个时候age = 18,id = 1都是搜索的条件边界。
总结:检索和查询的区别就在于有没有搜索条件边界。
2.倒排索引
在讲倒排索引之前先讲一下什么是正排索引。
正排索引是将文档按照顺序排列并且进行编号的索引结构,在正排索引中可以根据编号快速的寻找到对应的文档资料。
倒排索引以单词或者短语建立的索引结构。
倒排索引的建立**是先对文档进行分词处理,然后记录每个单词在哪些文档中出现,以及出现的位置信息。**通过倒排索引,可以根据关键词或者短语快速的找到包含这些词语的文档。
3.ElasticSearch的介绍
ElasticSearch是开源的分布式搜索和数据分析引擎,它专门用于处理大规模的文本数据和实现高性能的全文检索,如果有要实现搜索的场景,那么ElasticSearch是一个很好的选择。
核心概念
索引
索引可以类比为关系型数据库的库 ,也就是database
类型
类型对应于索引来说是内部的逻辑分区,一个索引内部可以对应一个或者多个类型。可以类比为数据库中的表
文档
文档实际上就是真正存储数据的东西,这里面存储了我们真正的内容,一般是json格式的数据。
每个文档都有一个类型和id,一个文档里面多个字段。
mapping
"mapping" 是用于定义索引中数据的结构和字段类型的过程。它类似于数据库中的表结构定义。可以理解为关系型数据库中表的结构定义
dart
PUT /user1
{
"mappings": {
"dynamic": "true",
"properties": {
"name": {
"type": "text"
},
"address": {
"type": "object",
}
}
}
}
PUT /user2
{
"mappings": {
"dynamic": "false",
"properties": {
"name": {
"type": "text"
},
"address": {
"type": "object",
}
}
}
}
PUT /user3
{
"mappings": {
"dynamic": "strict",
"properties": {
"name": {
"type": "text"
},
"address": {
"type": "object",
}
}
}
}
这里我设置了两个字段一个name,一个address,将他们的类型设置为text类型
如果我将某个文档的"dynamic"设置为strict或者false,那么就当有新字段的文档插入到这个索引里面来就会报错(类似于关系型数据库,如果往一个不存在的字段插入值那么肯定是会报错的),但是如果设置为true的话,Elasticsearch 将自动检测到新的字段,并为它们创建映射。
flied
flied也就是字段了,一个文档包含多个字段,每个字段都有自己的名称和类型。
dsl
实际上对应到关系型数据库就是sql