【Lucene】什么是全文检索?解读结构化数据与非结构化数据

什么是全文检索?

全文检索是一种搜索技术,能够在大量文本内容中查找特定的词语或短语。这种技术特别适合非结构化数据,因为它通过构建倒排索引来快速定位包含指定关键字的文档,从而大大提升查询速度。

全文检索系统通常包括两个过程:

  1. 索引创建(Indexing):从原始数据中提取关键词并构建索引。
  2. 索引查询(Searching):根据用户查询词在索引中查找匹配文档,按相关性排序返回结果。

在日常搜索引擎(如Google)或本地文件系统(如Windows文件搜索)中,全文检索都极为常见。

结构化数据 vs 非结构化数据

结构化数据

结构化数据指的是具有固定格式 的数据,可以直接存储在数据库的行列中。每个字段都有明确的数据类型,例如姓名、年龄、地址等。结构化数据的特征是标准化 和一致性,常见的存储方式包括关系型数据库(如MySQL、PostgreSQL)。

特点
  • 易于存储和查询:SQL等查询语言可以直接使用。
  • 数据类型确定:如数字、字符串、日期等。
  • 性能高效:通过行列结构,可以利用索引加速查询。
示例

例如,一张存储用户信息的表:

用户ID 姓名 年龄 地址
001 张三 30 北京市朝阳区
002 李四 25 上海市黄浦区
非结构化数据

非结构化数据指无固定格式 的数据,内容较难直接使用行列结构来表示。典型的非结构化数据包括文档、电子邮件、音频、视频和网页内容。这类数据通常格式多样且内容不规则,需要借助自然语言处理和全文检索技术进行处理。

特点
  • 缺乏统一结构:数据不一定有统一的字段或格式。
  • 无法直接使用SQL查询:需要借助全文检索等工具。
  • 数据类型多样:可包含文本、图片、音频、视频等多种类型。
示例

一段非结构化文本:

复制代码
张三,30岁,来自北京市朝阳区。他喜欢读书和旅行,工作于某科技公司。

为什么非结构化数据需要全文检索?

在非结构化数据中,由于信息不具备明确的字段和格式,要查找内容往往需要"全文扫描",即从头至尾逐一查找关键字。然而,这种方法在数据量较大时会耗时较长,因此引入全文检索技术,通过倒排索引等数据结构优化查询过程。例如,通过建立"张三"、"科技公司"等词的倒排索引,可以快速找到包含这些关键词的文档,而不需要逐行扫描。

结构化与非结构化数据的综合利用

在实际应用中,结构化和非结构化数据常常是互补的。搜索系统中一般会将非结构化数据转换为部分结构化的数据,如在非结构化文本的基础上创建关键词索引,加入文档ID等信息,使得这些数据可以被结构化管理和查询。

全文检索对结构化数据的索引通常体现在非结构化字段中,例如电商数据中的商品描述、评论等内容。而对于日志、邮件、文档等完全非结构化的数据,全文检索则可以直接处理,以提升搜索效率和效果。

demo

Linux下的 grep命令查找非结构化数据

在Linux下,grep命令非常适合用于在非结构化数据(如文本文件)中快速查找关键词。下面是一些常见的grep用法示例,可以帮助你高效地搜索文件内容:

示例1:在单个文件中查找关键词
bash 复制代码
grep "关键词" 文件名.txt
  • 例子 :grep "error" log.txt 将在 log.txt 文件中查找包含"error"的行。
示例2:在目录下的所有文件中递归查找
bash 复制代码
grep -r "关键词" 目录路径/
  • 例子 :grep -r "error" /var/log/ 将在 /var/log/ 目录及其子目录中的所有文件中查找"error"。
示例3:忽略大小写查找
bash 复制代码
grep -i "关键词" 文件名.txt
  • 例子 :grep -i "error" log.txt 将忽略大小写查找"error",会匹配"Error"、"ERROR"等。
示例4:显示行号
bash 复制代码
grep -n "关键词" 文件名.txt
  • 例子 :grep -n "error" log.txt 将显示包含"error"的行号,方便定位具体位置。
示例5:仅显示文件名
bash 复制代码
grep -l "关键词" *.txt
  • 例子 :grep -l "error" *.txt 将显示当前目录中包含"error"的文件名。
示例6:在多种文件类型中查找
bash 复制代码
grep -r --include="*.log" "关键词" 目录路径/
  • 例子 :grep -r --include="*.log" "error" /var/log/ 将只在.log文件中查找"error"。
示例7:查找多个关键词
bash 复制代码
grep -E "关键词1|关键词2" 文件名.txt
  • 例子 :grep -E "error|fail" log.txt 将查找"error"或"fail"任一关键词的行。
示例8:显示前后上下文行
bash 复制代码
grep -C 3 "关键词" 文件名.txt
  • 例子 :grep -C 3 "error" log.txt 将显示包含"error"行的上下3行,适用于查看上下文信息。
示例9:输出不匹配的行
bash 复制代码
grep -v "关键词" 文件名.txt
  • 例子 :grep -v "error" log.txt 将输出不包含"error"的行。

这些grep命令示例可以帮助你灵活地在非结构化数据中查找信息,根据不同的需求组合使用选项,实现高效搜索。

相关推荐
2501_944521595 小时前
Immer 跨端三方库仓颉适配全流程
python·eclipse·django
2501_9481226313 小时前
Qs 跨端三方库仓颉适配全流程
python·react native·django·tornado
fox063315 小时前
预约类平台的责任边界建模:从一个证件办理预约平台的流程设计说起
大数据·数据库·搜索引擎·全文检索·生活
CS创新实验室17 小时前
改了模型,数据库为什么能自动跟上?——Django 迁移(migrations)的底层
数据库·django·sqlite
weixin_BYSJ19871 天前
电竞先锋网站---附源码02032
java·vue.js·spring boot·python·django·tomcat·php
Elastic 中国社区官方博客1 天前
5 分钟内将 56 页扫描文档转化为带引用的答案:面向搜索无法读取的文档的检索增强生成流水线
大数据·运维·人工智能·elasticsearch·搜索引擎·信息可视化·全文检索
2601_949847752 天前
Cookie 跨端三方库仓颉适配全流程
python·django·flask
金士镧厦门新材3 天前
抑烟剂的选择思路:从材料体系到测试验证
全文检索
ycydynq4 天前
django利用不涉及数据库form自定义表单 表单元素验证
数据库·django·sqlite
Elastic 中国社区官方博客4 天前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es