zoukankan      html  css  js  c++  java
  • Sphinx全文检索

    全文检索

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

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

    非结构化数据:指没有固定格式或不定长的数据,如邮件,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个);

    缺点:

    必须要有主键

    主键必须为整型

    不负责数据存储

    配置相当不灵活

  • 相关阅读:
    LVM 扩容硬盘笔记
    jupyter notebook 远程访问
    samba 配置文件详解
    linux 网络挂载 windows 共享文件夹
    cmder 与 win10 wsl ( 当前目录打开wsl)
    vscode for latex
    Python 使用代理
    Python Signal(信号) 异步系统事件
    centos7 install magento
    lua笔记
  • 原文地址:https://www.cnblogs.com/zhenghongxin/p/4875614.html
Copyright © 2011-2022 走看看