全文检索

一、生活中的数据总体分为:

结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。

非结构化数据:指没有固定格式或不定长的数据,如邮件,word文档等。

非结构化数据还有一种叫法:全文数据。

二、按数据的分类,搜索也分为两种:

对结构化数据的搜索:

如对数据库的搜索:SQL语句。

再如windows的搜索:文件名,类型,修改时间。

对非结构化数据的搜索:

如windows对文件内容的搜索。

Linux下得grep命令。

再如Google和百度可以搜素大量内容数据。

对于非结构化的数据搜索也叫做对全文数据的搜索。

三、对全文数据的搜索还可以分为两种

1、顺序扫描:如要找内容包含某个字符串的文件,会一个文档一个文档的从头到尾的找,如 Like查找 。

2、索引扫描:把非结构化的数据中的内容提取出来一部分重新组织,让它变的有结构化,这部分我们提取出来的数据就叫做索引.

全文检索大体分两个过程:

索引创建(Indexer)和 搜索索引(Search)。

索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。

搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程。

比如说,我们要寻找既包含字符串“Sphinx”又包含字符串“PHP”的文档,我们只需要以下几步:

1. 取出包含字符串“Sphinx”的文档链表.

2. 取出包含字符串“PHP”的文档链表.

3. 通过合并链表,找出既包含“Sphinx”又包含“PHP”的文件.

如何创建索引?

全文检索的索引创建过程一般有以下几步:

一些需要创建索引的文档(Documents)。

将原文档传给分词组件(Tokenizer) 。

将得到的词元(Token)传给语言处理组件(Linguistic Processor)。

将得到的词(Term)传给索引组件(Indexer)。

第一步:一些创建索引的文档

文档1:Students should be allowed to go out with their friends, but not allowed to drink beer.

文档2:My friend Jerry went to school to see his students but found them drunk which is not allowed.

第二步:将原文档传给分词组件

分词组件(Tokenizer)会做以下几件事情(此过程称为Tokenize):

1. 将文档分成一个一个单独的单词。

2. 去除标点符号。

3. 去除停词(Stop word)。

所谓停词(Stop word)就是一种语言中最普通的一些单词:

英语中的停词(Stop word)如:“the”,“a”,“this”等。

中文中的停词 如:‘是’‘的’‘这个’等。

对于每一种语言的分词组件(Tokenizer),都有一个停词(stop word)集合。

经过分词(Tokenizer)后得到的结果称为词元(Token)。

在我们的例子中,便得到以下词元(Token):

Students、allowed、go、their、friends、allowed、drink、beer、My、friend、Jerry、went、school、see、his、students、found、them、drunk、allowed。

第三步:将得到的词元(Token)   传给语言处理组件

语言处理组件主要是对得到的词元做一些同语言相关的处理:

对于英语,语言处理组件一般做以下几点:

变为小写(Lowercase)。

2. 将单词缩减为词根形式,如“cars”到“car”等。

这种操作称为:stemming。

3. 将单词转变为词根形式,如“drove”到“drive”等。

这种操作称为:lemmatization。

语言处理组件的结果称为词

在我们的例子中,经过语言处理,得到的词(Term)如下:

Student、allow、go、their、friend、allow、drink、beer、my、friend、jerry、go、school、see、his、student、find、them、drink、allow。

也正是因为有语言处理的步骤,才能使搜索drove,而drive也能被搜索出来。

第四步:  将得到的词(Term)传给索引组件

索引组件(Indexer)主要做以下几件事情:

利用得到的词(Term)创建一个字典。

对字典按字母顺序进行排序。

3. 合并相同的词(Term)成为文档倒排(Posting List)链表

Document Frequenc     即文档频次

表示总共有多少

文件包含此词(Term)

Frequency 即词频率

表示此文件中

包含了几个此词(Term)

如何对索引进行搜索

搜索主要分为以下几步:

第一步:用户输入查询语句.

第二步:对查询语句进行词法分析,语法分析,及语言处理

第三步:搜索索引,得到符合语法树的文档.

第四步:根据得到的文档和查询语句的相关性,对结果进行排序.

什么是Sphinx

Sphinx 是SQL Phrase Index(查询词组索引)的缩写,Sphinx是一个基于SQL的全文检索引擎

Sphinx    全文检索引擎

Coreseek  支持中文的全文检索引擎

Sphinx 优缺点

优点:

高速的建立索引(在当代CPU上,可达到10 MB/秒);

高性能的搜索(在2 – 4GB 的文本数据上,平均每次检索响应时间小于0.1秒);

可处理海量数据(目前已知可以处理超过100 GB的文本数据, 在单一CPU的系统上可处理100 M 文档);

提供了优秀的相关度算法,基于短语相似度和统计BM2的复合Ranking方法;

支持分布式搜索;

提供文档片段(摘要以及高亮)生成功能;

可作为MySQL的存储引擎提供搜索服务;

支持布尔、短语、词语相似度等多种检索模式;

文档支持多个全文检索字段(最大不超过32个);

缺点:

必须要有主键

主键必须为整型

不负责数据存储

配置相当不灵活

Sphinx全文检索的更多相关文章

  1. Coreseek/sphinx全文检索的了解

    Coreseek/sphinx全文检索的了解 概述: 全文检索是一种将文件里全部文本与检索项匹配的文字资料检索方法,全文检索是将存储于数据库中整本书.整篇文章中的随意内容信息查找出来的检索.它能够依据 ...

  2. Sphinx全文检索引擎测试

    数据表 1.documents CREATE TABLE `documents` ( `id` int(13) NOT NULL auto_increment, `group_id` int(11) ...

  3. sphinx全文检索 安装配置和使用

    公司项目刚刚导入大量产品数据,然后发现网站的产品搜索很卡,原本是原生sql的like来做模糊搜索,数据量20W的时候还可以接受,但是上百万就很卡了,所以需要做优化. 经过考虑,打算采用全文检索 sph ...

  4. sphinx全文检索功能 | windows下测试 (一)

    前一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统.网上的资料大多是在linux环境下的安装使用,当然,作为生产环境很有必要部署在* ...

  5. Sphinx 全文检索

    什么是全文检索: 全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术.检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容. 简介: Sphinx是由俄罗斯人And ...

  6. sphinx全文检索之PHP使用(转)

    基础 数据结构: CREATE TABLE email ( emailid mediumint(8) unsigned NOT NULL auto_increment COMMENT '邮件id', ...

  7. sphinx全文检索引擎

    今天刚刚学习了一下,就直接分享上去,有些还没有接触,如果有问题请指正,谢谢 sphinx是什么? Sphinx是一个全文检索引擎.主要为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能. S ...

  8. centos7下搭建sphinx全文检索引擎

    Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用 程序更容易实现专业化的全文检索.Sphinx特别为一些 ...

  9. discuz sphinx全文检索搜索引擎方案

    基于discuz的索引配置文件,这个配置文件比较灵活,可以根据不同的需求来配置 # # linuxTone full index search configure file # source lt_p ...

随机推荐

  1. Spring cloud config-client 爬坑

    配置文件 找不到属性 Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'from' in st ...

  2. Git--时光穿梭机之删除文件06

    在Git中,删除也是一个修改操作,我们实际操作一下吧,先添加一个文件test.txt到Git并且提交 $ git add test.txt $ git commit -m "add test ...

  3. 【转】跨DLLnew delete问题

    转两篇文章来说这个问题的 链接1:https://blog.csdn.net/notebook2001a/article/details/6647850 链接2:https://blog.csdn.n ...

  4. Docker构建redis cluster集群

    准备工作 安装gcc ruby 解压编译redis Redis 是 c 语言开发的.安装 redis 需要 c 语言的编译环境.如果没有 gcc 需要在线安装. yum install gcc-c++ ...

  5. Cocoa Touch(二):数据存储CoreData, NSKeyArchiver, NSOutputStream, NSUserDefaults

    应用程序离不开数据的永久存储,有两种方式实现存储:数据库和文本文件. 作为存储管理器,最基本的功能就是增删改查了. CoreData 1.插入 AppDelegate *app = [[UIAppli ...

  6. 对于一个web工程,如果我们复制一个已有的工程粘贴到同一个workspace下,我们除了需要更改工程的名字还需要更改这个新工程的content root,否则会报错。

    对于一个web工程,如果我们复制一个已有的工程粘贴到同一个workspace下,我们除了需要更改工程的名字还需要更改这个新工程的content root,否则会报错.步骤如下: 右键新的工程---&g ...

  7. Python爬虫进阶四之PySpider的用法

    审时度势 PySpider 是一个我个人认为非常方便并且功能强大的爬虫框架,支持多线程爬取.JS动态解析,提供了可操作界面.出错重试.定时爬取等等的功能,使用非常人性化. 本篇内容通过跟我做一个好玩的 ...

  8. 分布式java应用基础与实践

      始读于2014年4月30日,完成于2014年6月6日15:43:39. 阿里巴巴高级研究员林昊早年的书了,这些理论放到今天估计工作一两年的人都耳熟能详了,我个人很早以前就知道此书一直没有找到资源, ...

  9. 关于Safari浏览器使用的几点总结

    声明:下载的是Safari英文版本,在Windows操作系统下使用. 一.Safari浏览器中的开发者调试工具隐藏得比较深,找了好久才找到的,方法:按一下键盘上的alt键,浏览器上方就会弹出一个开发者 ...

  10. nodename nor servname provided, or not known

    mac来使用redis然后产生上述错误,据说是用户名的问题 解决: 打开终端: cat /private/etc/hosts sudo vi /private/etc/hosts 将错误的那个名字加入 ...