全文检索技术
- 是一种技术手段,实现该技术的框架 Lucene (全文检索工具包, 基于 Java语言编写的) 、
- 通常在 企业中 会 使用 全文检索服务器 代替 Lucene, 常见的 全文检索服务器 有 solr , elasticsearch (es)
- Solr 是一个企业级全文检索服务器,支持 集群的搭建 , 适用于 中小型平台,常用于 电商平台
- elasticsearch 是一个分布式全文检索服务器。
全文检索的实现方式
倒排索引算法 !
常见的检索方式有哪些?
- 顺序查找 : 特点 从上到下依次查找,效率低, 准确率非常高。
- 二分法查找 : 特点 要求 查询的数据是经过排序后的, 查找效率高。
- 结构化查询 : 主要针对的是 关系型数据库中的数据进行查找的方法, 性能却决于数据库的 引擎、索引类型、索引方式、查找方式。
- 索引查询 : 效率是最高的, 主要适用于 线性表 (数组、List列表)
- Hash索引查询 : 会产生 Hash 碰撞、需要解决 hash冲突的问题,
- 全文检索 : 采用倒排索引 对需要检索的内容 进行 搜索 ,效率是很高的,准确率很低
数据的分类
- 结构化数据 : 适用于 结构化查询, 常见用于 关系型数据库
- 半结构化数据 : JSON , HTML, XML 均属于 半结构化 数据。
- 非结构化数据:
什么是 倒排索引
倒排索引 最核心的 操作 是
分词
技术 。
(Data)
奇酷网络有限公司 : ------> 1
独角兽责任有限公司: -------> 2
(Index)
奇酷 ---------- 1
网络 ---------- 1
有限 ---------- 1, 2
公司 ---------- 1, 2
网络有限公司 ---------- 1
有限公司 ---------- 1, 2
独角兽 ----------- 2
责任 ----------- 2
网络公司 : ----------- 请问会检索到啥 ???
网络 ------------> 1
公司 ------------> 1, 2 对检索后的结果 ID 值 进行 统计 ,按照统计的结果 (权重) 进行降序排列
通常查找数据采用主键找数据、 反过来 通过关键词 找 主键 的检索方式 就可以理解为 倒排索引 !
Solr 常见的 分词器
- 标准分词器 (英文按照 空格 、标点符号进行分号, 中文 是按照 字符分割), 中文分词非常不理想
- 中日韩分词器 (两个字符追个分词)
- 庖丁解牛 分词器 (停更)
- Ik 分词器 (相对来说比较智能、能够满足日常中文分词、支持扩展字典、动态字典、停用词等配置)
Solr 的核心 - Solr Core
- Solr Home : 用户进行存放 所有 的 Solr Core 的目录,等价于 MySQL 数据库数据仓库
- Solr Core : 可以理解为 MySQL数据库的 database , 每一个 Solr Core 之间是 相互独立的。
- conf : 配置 ,数据的定义信息
- data : 数据
- index : 索引
Solr 是 如何 进行数据存储的
Solr 存储的一条数据 代表一个 document , 一个 document 中 包含 多个 域 (field)
Solr 定义域的方式
- 普通域 : field
<field name="id" type="string" indexed="true" stored="true" required="true"/>
- 动态域 : 域名不是确定的,支持通配符
*
动态匹配<dynamicField name="*_dt" type="pdate" indexed="true" stored="true"/>
- 复制域 : 将多个域中的数据 合并到 一个域 , 就是一个 复制域
<copyField source="summary" dest="text"/>
- 主键域:
<uniqueKey>id</uniqueKey>
Solr field / dynamicField 域 常见的属性
- name : 设置域名 , 如果是 dynamicField, 支持 通配符 。
- type : 设置 域的类型, 支持的类型 由 配置文件中 fieldType 决定, 不同类型的域 分词手段不一样。
- string : 不支持 分词
- pint : 用来存储整数、 不支持 分词
- pfloat : 用来存储 小数, 不支持分词
- pdate : 用来存储日期, 不支持 分词
- text_ik : IK 分词器 , 支持中文分词
- text_en_splitting : 支持英文分词
- indexed : 设置 域 是否 进行索引 , 衡量一个域 要不要 添加索引, 取决于 要不要根据 该域 进行查询 。
- stored : 设置 域 对应的 值 是否 进行存储 、域对应的值如果需要直接使用, 建议存储。土豪随意~~~~。
- required : 设置 对应的值 是否允许为空, 该 属性 通常 用在 主键域 上。
- multiValued : 该域对应的值 是否是 多值 , 该属性 一般 作用在 复制域 对应的 域中
数据导入配置
<dataConfig>
<dataSource driver="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/rss2"
user="root" password="123456" />
<document>
<entity name="resource" query="select id, resource_name, keywords, score, size, ext,
date_format(create_time, '%Y-%m-%dT%H:%i:%sZ') create_time from tb_resource"
deltaQuery="select id from tb_resource where last_modified > '${dataimporter.last_index_time}'">
<field column="id" name="id" />
<field column="resource_name" name="resourceName" />
<field column="keywords" name="keywords" />
<field column="score" name="vscore" />
<field column="size" name="size" />
<field column="ext" name="ext" />
<field column="create_time" name="create_time" />
</entity>
</document>
</dataConfig>
pdate 日期类型,支持的 日期格式为 yyyy-MM-ddTHH:mm:ssZ , 所以需要使用 date_format 格式化 日期,以满足数据格式。
- dataSource 配置数据源
- driver : 设置数据库驱动
- url : 设置数据库连接信息
- user : 设置数据库账号
- password : 设置数据库密码
- document 描述一条信息的配置
- entity : 用来定义一个 实体类、和数据库中的表 对应
- name : 实体类名、可任意
- query : 全表数据导入 SQL语句
- deltaQuery : 增量导入 SQL语句
- field : 定义 域 和 字段的映射关系
- column : 字段名
- name : 域名
- entity : 用来定义一个 实体类、和数据库中的表 对应