精华内容
下载资源
问答
  • 全文检索

    万次阅读 2018-08-14 08:40:24
    本文我将为大家讲解全文检索技术——Lucene,现在这个技术用到的比较多,我觉得大家还是应该掌握一下,不说多精通,但是应该有所了解。在讲解之前,我们先来看一个案例,通过该案例引出全文检索技术——Lucene。 ...

    本文我将为大家讲解全文检索技术——Lucene,现在这个技术用到的比较多,我觉得大家还是应该掌握一下,不说多精通,但是应该有所了解。在讲解之前,我们先来看一个案例,通过该案例引出全文检索技术——Lucene。

    案例

    实现一个文件的搜索功能,通过关键字搜索文件,凡是文件名或文件内容包括关键字的文件都需要找出来。还可以根据中文词语进行查询,并且需要支持多个条件查询。本案例中的原始内容就是磁盘上的文件,如下图: 
    这里写图片描述

    需求分析

    数据库搜索

    数据库中的搜索很容易实现,通常都是使用sql语句进行查询,而且能很快的得到查询结果。为什么数据库搜索很容易呢?因为数据库中的数据存储是有规律的,有行有列而且数据格式、数据长度都是固定的。

    数据分类

    我们生活中的数据总体分为两种:结构化数据和非结构化数据。

    • 结构化数据:指具有固定格式或有限长度的数据,如数据库中的数据,元数据等。
    • 非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等磁盘上的文件。

    非结构化数据查询方法

    1. 顺序扫描法(Serial Scanning) 
      所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容,只是相当的慢。
    2. 全文检索(Full-text Search) 
      将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。 
      例如:字典。字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。 
      这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。 
      虽然创建索引的过程也是非常耗时的,但是索引一旦创建就可以多次使用,全文检索主要处理的是查询,所以耗时间创建索引是值得的。

    如何实现全文检索

    可以使用Lucene实现全文检索。Lucene是apache下的一个开放源代码的全文检索引擎工具包(提供了Jar包,实现全文检索的类库)。它提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便地在目标系统中实现全文检索的功能。 
    注意:Lucene只是一个引擎,只是一个工具包,如果使用Lucene开发全文检索功能,要记住Lucene是不能单独运行的

    全文检索技术的应用场景

    对于数据量大、数据结构不固定的数据可采用全文检索方式搜索。例如:

    • 使用全文检索技术可以实现搜索引擎(百度、google…),搜索引擎可以搜索互联网上所有的内容(网页、pdf电子书、视频、音乐)。 
      Lucene和搜索引擎的区别:搜索引擎是对外提供全文检索服务,是可以单独运行的。Lucene只是一个工具包不能单独运行,需要在project中加入lucene的jar包,最终project在JVM中运行。
    • 使用全文检索技术可以实现站内搜索,站内搜索只能搜索本网站的信息(网页、pdf电子书、视频、音乐、关系数据库中的信息等等),比如:电商网站搜索商品信息,论坛网站搜索网内帖子。

    Lucene实现全文检索的流程

    索引和搜索流程图

    索引和搜索流程图如下: 
    这里写图片描述
    1. 绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括:确定原始内容即要搜索的内容→采集文档→创建文档→分析文档→索引文档。 
    2. 红色表示搜索过程,从索引库中搜索内容,搜索过程包括:用户通过搜索界面→创建查询→执行搜索,从索引库搜索→渲染搜索结果。

    从上面了解到的知识点也可看出,索引和搜索流程图也可表示为: 
    这里写图片描述 
    总结:全文检索过程分为索引、搜索两个过程:

    • 索引 
      1. 从关系数据库中、互联网上、文件系统采集源数据(要搜索的目标信息),源数据的来源是很广泛的。
      2. 将源数据采集到一个统一的地方,要创建索引,将索引创建到一个索引库(文件系统)中,从源数据库中提取关键信息,从关键信息中抽取一个一个,词和源数据是有关联的。也即创建索引时,词和源数据有关联,索引库中记录了这个关联,如果找到了词就说明找到了源数据(http的网页、pdf电子书等……)。
    • 搜索 
      1. 用户执行搜索(全文检索)编写查询关键字。
      2. 从索引库中搜索索引,根据查询关键字搜索索引库中的一个一个词
      3. 展示搜索的结果。

    创建索引

    对文档索引的过程,将用户要搜索的文档内容进行索引,索引存储在索引库(index)中。 
    这里我们要搜索的文档是磁盘上的文本文件,根据案例描述:凡是文件名或文件内容包括关键字的文件都要找出来,这里要对文件名和文件内容创建索引。

    获得原始文档

    原始文档是指要索引和搜索的内容。原始内容包括互联网上的网页、数据库中的数据、磁盘上的文件等。本案例中的原始内容就是磁盘上的文件,如下图: 
    这里写图片描述
    从互联网上、数据库、文件系统中等数据源处获取需要搜索的原始信息,这个过程就是信息采集,信息采集的目的是为了对原始内容进行索引。针对不同的源数据,使用不同的技术进行采集获得原始文档:

    1. 针对互联网上的数据,使用http协议抓取html网页到本地,生成一个html文件。
    2. 针对关系数据库中的数据,连接数据库读取表中的数据。
    3. 针对文件系统中的数据,通过流读取文件系统的文件。

    以上技术中使用第一种较多,因为目前全文检索主要搜索数据的来源是互联网,在Internet上采集信息的软件通常称为爬虫或蜘蛛,也称为网络机器人,爬虫访问互联网上的每一个网页,将获取到的网页内容存储起来,所以搜索引擎使用一种爬虫程序抓取网页( 通过http抓取html网页信息)。 
    Lucene不提供信息采集的类库,需要自己编写一个爬虫程序实现信息采集,也可以通过一些开源软件实现信息采集,以下是一些爬虫项目(了解):

    • Solr(http://lucene.apache.org/solr),solr是apache的一个子项目,支持从关系数据库、xml文档中提取原始数据。
    • Nutch(http://lucene.apache.org/nutch), Nutch是apache的一个子项目,包括大规模爬虫工具,能够抓取和分辨web网站数据。
    • jsoup(http://jsoup.org/ ),jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
    • Heritrix(http://sourceforge.net/projects/archive-crawler/files/),Heritrix是一个由java开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。

    本案例我们要获取磁盘上文件的内容,可以通过文件流来读取文本文件的内容,对于pdf、doc、xls等文件可通过第三方提供的解析工具读取文件内容,比如Apache POI读取doc和xls的文件内容。

    创建文档对象

    获取原始内容的目的是为了索引,在索引前需要将原始内容创建成文档(Document),文档中包括一个一个的域(Field),域中存储内容。 
    这里我们可以将磁盘上的一个文件当成一个Document,Document中包括一些Field(file_name文件名称、file_path文件路径、file_size文件大小、file_content文件内容),如下图: 
    这里写图片描述 
    注意:每个Document可以有多个Field,不同的Document可以有不同的Field,同一个Document可以有相同的Field(域名和域值都相同)。每个文档都有一个唯一的编号,就是文档id

    分析文档

    将原始内容创建为包含域(Field)的文档(Document),需要再对域中的内容进行分析,分析的过程是经过对原始文档提取单词、将字母转为小写、去除标点符号、去除停用词(没有意义的单词)等过程生成最终的语汇单元,可以将语汇单元理解为一个一个的单词。 
    例如,原始文档内容如下:

    Lucene is a Java full-text search engine. Lucene is not a complete 
    application, but rather a code library and API that can easily be used 
    to add search capabilities to applications.

    上边的文档经过分析得出的语汇单元为:

    lucene、java、full、search、engine……

    每个单词叫做一个Term,不同的域中拆分出来的相同的单词是不同的Term(同一个域中拆分出来的相同的单词是同一个Term)。Term中包含两部分内容,一部分是文档的域名,另一部分是单词的内容。 
    例如:文件名中包含的apache和文件内容中包含的apache是不同的Term。

    创建索引

    对所有文档分析得出的语汇单元进行索引,索引的目的是为了搜索,最终要实现只搜索被索引的语汇单元从而找到Document(文档)。 
    这里写图片描述 
    注意:创建索引是对语汇单元索引,通过词语找文档,这种索引的结构叫倒排索引结构。传统方法是根据文件找到该文件的内容,在文件内容中匹配搜索关键字,这种方法是顺序扫描方法,数据量大、搜索慢。 
    倒排索引结构是根据内容(词语)找文档,如下图: 
    这里写图片描述 
    倒排索引结构也叫反向索引结构,包括索引和文档两部分,索引即词汇表,它的规模较小,而文档集合较大

    查询索引

    查询索引也是搜索的过程。搜索就是用户输入关键字,从索引(index)中进行搜索的过程。根据关键字搜索索引,根据索引找到对应的文档,从而找到要搜索的内容(这里指磁盘上的文件)。

    用户查询接口

    全文检索系统提供用户搜索的界面供用户提交搜索的关键字,搜索完成展示搜索结果。比如: 
    这里写图片描述
    Lucene不提供制作用户搜索界面的功能,需要根据自己的需求开发搜索界面。

    创建查询

    用户输入查询关键字执行搜索之前需要先构建一个查询对象,查询对象中可以指定查询要搜索的Field文档域、查询关键字等,查询对象会生成具体的查询语法。例如,语法 “fileName:lucene”表示要搜索Field域的内容为“lucene”的文档。

    执行查询

    搜索索引过程:根据查询语法在倒排索引词典表中分别找出对应搜索词的索引,从而找到索引所链接的文档链表。例如,搜索语法为“fileName:lucene”表示搜索出fileName域中包含Lucene的文档。搜索过程就是在索引上查找域为fileName,并且关键字为Lucene的Term,并根据Term找到文档id列表。 
    这里写图片描述

    这里写图片描述
    索引域:索引域是用于搜索的,搜索程序将从索引域中搜索一个一个词,根据词找到对应的文档。之所以根据词可以找到文档,是因为词是从Document中的Field内容抽取出来的。将Document中的Field的内容进行分词,将分好的词创建索引,索引=Field域名:词(表示从Document中的哪个Field抽取的词)。

    渲染结果

    以一个友好的界面将查询结果展示给用户,用户根据搜索结果找自己想要的信息,为了帮助用户很快找到自己的结果,提供了很多展示的效果,比如搜索结果中将关键字高亮显示,百度提供的快照等。 
    这里写图片描述

    展开全文
  • MySQL 之全文索引

    万次阅读 多人点赞 2018-04-14 15:47:56
    最近在复习数据库索引部分,看到了 fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录。 引入 概念 通过数值比较、范围过滤等就可以...

    最近在复习数据库索引部分,看到了 fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录。

    引入

    概念

    通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。

    你可能会说,用 like + % 就可以实现模糊匹配了,为什么还要全文索引?like + % 在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比 like + % 快 N 倍,速度不是一个数量级,但是全文索引可能存在精度问题。

    你可能没有注意过全文索引,不过至少应该对一种全文索引技术比较熟悉:各种的搜索引擎。虽然搜索引擎的索引对象是超大量的数据,并且通常其背后都不是关系型数据库,不过全文索引的基本原理是一样的。

    版本支持

    开始之前,先说一下全文索引的版本、存储引擎、数据类型的支持情况

    1. MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
    2. MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
    3. 只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

    测试或使用全文索引时,要先看一下自己的 MySQL 版本、存储引擎和数据类型是否支持全文索引。

    操作全文索引

    索引的操作随便一搜都是,这里还是再啰嗦一遍。

    创建

    1. 创建表时创建全文索引
    create table fulltext_test (
        id int(11) NOT NULL AUTO_INCREMENT,
        content text NOT NULL,
        tag varchar(255),
        PRIMARY KEY (id),
        FULLTEXT KEY content_tag_fulltext(content,tag)  // 创建联合全文索引列
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    1. 在已存在的表上创建全文索引
    create fulltext index content_tag_fulltext
        on fulltext_test(content,tag);
    1. 通过 SQL 语句 ALTER TABLE 创建全文索引
    alter table fulltext_test
        add fulltext index content_tag_fulltext(content,tag);

    修改

    修改个 O,直接删掉重建。

    删除

    1. 直接使用 DROP INDEX 删除全文索引
    drop index content_tag_fulltext
        on fulltext_test;
    1. 通过 SQL 语句 ALTER TABLE 删除全文索引
    alter table fulltext_test
        drop index content_tag_fulltext;

    使用全文索引

    和常用的模糊匹配使用 like + % 不同,全文索引有自己的语法格式,使用 match 和 against 关键字,比如

    select * from fulltext_test 
        where match(content,tag) against('xxx xxx');

    注意: match() 函数中指定的列必须和全文索引中指定的列完全相同,否则就会报错,无法使用全文索引,这是因为全文索引不会记录关键字来自哪一列。如果想要对某一列使用全文索引,请单独为该列创建全文索引。

    测试全文索引

    添加测试数据

    有了上面的知识,就可以测试一下全文索引了。

    首先创建测试表,插入测试数据

    create table test (
        id int(11) unsigned not null auto_increment,
        content text not null,
        primary key(id),
        fulltext key content_index(content)
    ) engine=MyISAM default charset=utf8;
    
    insert into test (content) values ('a'),('b'),('c');
    insert into test (content) values ('aa'),('bb'),('cc');
    insert into test (content) values ('aaa'),('bbb'),('ccc');
    insert into test (content) values ('aaaa'),('bbbb'),('cccc');

    按照全文索引的使用语法执行下面查询

    select * from test where match(content) against('a');
    select * from test where match(content) against('aa');
    select * from test where match(content) against('aaa');

    根据我们的惯性思维,应该会显示 4 条记录才对,然而结果是 1 条记录也没有,只有在执行下面的查询时

    select * from test where match(content) against('aaaa');

    才会搜到 aaaa 这 1 条记录。

    为什么?这个问题有很多原因,其中最常见的就是 最小搜索长度 导致的。另外插一句,使用全文索引时,测试表里至少要有 4 条以上的记录,否则,会出现意想不到的结果。

    MySQL 中的全文索引,有两个变量,最小搜索长度和最大搜索长度,对于长度小于最小搜索长度和大于最大搜索长度的词语,都不会被索引。通俗点就是说,想对一个词语使用全文索引搜索,那么这个词语的长度必须在以上两个变量的区间内。

    这两个的默认值可以使用以下命令查看

    show variables like '%ft%';

    可以看到这两个变量在 MyISAM 和 InnoDB 两种存储引擎下的变量名和默认值

    // MyISAM
    ft_min_word_len = 4;
    ft_max_word_len = 84;
    
    // InnoDB
    innodb_ft_min_token_size = 3;
    innodb_ft_max_token_size = 84;

    可以看到最小搜索长度 MyISAM 引擎下默认是 4,InnoDB 引擎下是 3,也即,MySQL 的全文索引只会对长度大于等于 4 或者 3 的词语建立索引,而刚刚搜索的只有 aaaa 的长度大于等于 4。

    配置最小搜索长度

    全文索引的相关参数都无法进行动态修改,必须通过修改 MySQL 的配置文件来完成。修改最小搜索长度的值为 1,首先打开 MySQL 的配置文件 /etc/my.cnf,在 [mysqld] 的下面追加以下内容

    [mysqld]
    innodb_ft_min_token_size = 1
    ft_min_word_len = 1

    然后重启 MySQL 服务器,并修复全文索引。注意,修改完参数以后,一定要修复下索引,不然参数不会生效。

    两种修复方式,可以使用下面的命令修复

    repair table test quick;

    或者直接删掉重新建立索引,再次执行上面的查询,a、aa、aaa 就都可以查出来了。

    但是,这里还有一个问题,搜索关键字 a 时,为什么 aa、aaa、aaaa 没有出现结果中,讲这个问题之前,先说说两种全文索引。

    两种全文索引

    自然语言的全文索引

    默认情况下,或者使用 in natural language mode 修饰符时,match() 函数对文本集合执行自然语言搜索,上面的例子都是自然语言的全文索引。

    自然语言搜索引擎将计算每一个文档对象和查询的相关度。这里,相关度是基于匹配的关键词的个数,以及关键词在文档中出现的次数。在整个索引中出现次数越少的词语,匹配时的相关度就越高。相反,非常常见的单词将不会被搜索,如果一个词语的在超过 50% 的记录中都出现了,那么自然语言的搜索将不会搜索这类词语。上面提到的,测试表中必须有 4 条以上的记录,就是这个原因。

    这个机制也比较好理解,比如说,一个数据表存储的是一篇篇的文章,文章中的常见词、语气词等等,出现的肯定比较多,搜索这些词语就没什么意义了,需要搜索的是那些文章中有特殊意义的词,这样才能把文章区分开。

    布尔全文索引

    在布尔搜索中,我们可以在查询中自定义某个被搜索的词语的相关性,当编写一个布尔搜索查询时,可以通过一些前缀修饰符来定制搜索。

    MySQL 内置的修饰符,上面查询最小搜索长度时,搜索结果 ft_boolean_syntax 变量的值就是内置的修饰符,下面简单解释几个,更多修饰符的作用可以查手册

    • + 必须包含该词
    • - 必须不包含该词
    • > 提高该词的相关性,查询的结果靠前
    • < 降低该词的相关性,查询的结果靠后
    • (*)星号 通配符,只能接在词后面

    对于上面提到的问题,可以使用布尔全文索引查询来解决,使用下面的命令,a、aa、aaa、aaaa 就都被查询出来了。

    select * test where match(content) against('a*' in boolean mode);

    总结

    好了,差不多写完了,又到了总结的时候。

    MySQL 的全文索引最开始仅支持英语,因为英语的词与词之间有空格,使用空格作为分词的分隔符是很方便的。亚洲文字,比如汉语、日语、汉语等,是没有空格的,这就造成了一定的限制。不过 MySQL 5.7.6 开始,引入了一个 ngram 全文分析器来解决这个问题,并且对 MyISAM 和 InnoDB 引擎都有效。

    事实上,MyISAM 存储引擎对全文索引的支持有很多的限制,例如表级别锁对性能的影响、数据文件的崩溃、崩溃后的恢复等,这使得 MyISAM 的全文索引对于很多的应用场景并不适合。所以,多数情况下的建议是使用别的解决方案,例如 Sphinx、Lucene 等等第三方的插件,亦或是使用 InnoDB 存储引擎的全文索引。

    几个注意点

    1. 使用全文索引前,搞清楚版本支持情况;
    2. 全文索引比 like + % 快 N 倍,但是可能存在精度问题;
    3. 如果需要全文索引的是大量数据,建议先添加数据,再创建索引;
    4. 对于中文,可以使用 MySQL 5.7.6 之后的版本,或者第三方插件。

    参考文章

    mysql全文索引__简介
    MySQL 官方参考手册
    高性能 MySQL(第三版)

    本文原始链接:MySQL 之全文索引

    展开全文
  • MySQL使用全文索引(fulltext index)

    万次阅读 多人点赞 2016-10-14 17:40:17
    1.创建全文索引(FullText index)  旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。   不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息要随时关注官网,  ...

    1.创建全文索引(FullText index)

           旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。 

           不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息要随时关注官网,

         1.1. 创建表的同时创建全文索引

                 CREATE TABLE article ( 
                      id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, 
                      title VARCHAR(200), 
                      body TEXT, 
                      FULLTEXT(title, body) 
                  ) TYPE=MYISAM; 
       

        1.2.通过 alter table 的方式来添加

                    ALTER TABLE `student` ADD FULLTEXT INDEX ft_stu_name  (`name`) #ft_stu_name是索引名,可以随便起

           或者:ALTER TABLE `student` ADD FULLTEXT ft_stu_name  (`name`)

     

        1.3. 直接通过create index的方式

                    CREATE FULLTEXT INDEX ft_email_name ON `student` (`name`)

               也可以在创建索引的时候指定索引的长度:

                    CREATE FULLTEXT INDEX ft_email_name ON `student` (`name`(20))

          

    2. 删除全文索引

        2.1. 直接使用 drop index(注意:没有 drop fulltext index 这种用法)

                     DROP INDEX full_idx_name ON tommy.girl ;

        2.2. 使用 alter table的方式 

                    ALTER TABLE tommy.girl DROP INDEX ft_email_abcd;

     

    3.使用全文索引

         跟普通索引稍有不同

         使用全文索引的格式:  MATCH (columnName) AGAINST ('string')

         eg:

               SELECT * FROM `student` WHERE MATCH(`name`) AGAINST('聪')

               当查询多列数据时:

                    建议在此多列数据上创建一个联合的全文索引,否则使用不了索引的

              SELECT * FROM `student` WHERE MATCH(`name`,`address`) AGAINST('聪 广东')

         3.1. 使用全文索引需要注意的是:(基本单位是)

                分词,全文索引以词为基础的,MySQL默认的分词是所有非字母和数字的特殊符号都是分词符(外国人嘛)

                这里推荐一篇文章:利用mysql的全文索引实现模糊查询 

           3.2. MySQL中与全文索引相关的几个变量:

                 使用命令:mysql> SHOW VARIABLES LIKE 'ft%'; #ft就是FullText的简写

                 ft_boolean_syntax    + -><()~*:""&|         #改变IN BOOLEAN MODE的查询字符,不用重新启动MySQL也不用重建索引
                 ft_min_word_len    4                                   #最短的索引字符串,默认值为4,(通常改为1)修改后必须重建索引文件

                                                                                   重新建立索引命令:repair table tablename quick 

                 ft_max_word_len    84                                #最长的索引字符串,默认值为84,修改后必须重建索引文件

                 ft_query_expansion_limit   20                      #查询括展时取最相关的几个值用作二次查询

                 ft_stopword_file    (built-in)                      #全文索引的过滤词文件,具体可以参考:MySQL全文检索中不进行全文索引默认过滤词         


                 特别注意:50%的门坎限制(当查询结果很多,几乎所有记录都有,或者极少的数据,都有可能会返回非所期望的结果)

                           -->可用IN BOOLEAN MODE即可以避开50%的限制。

                          此时使用全文索引的格式就变成了: SELECT * FROM `student` WHERE MATCH(`name`) AGAINST('聪' IN BOOLEAN MODE)

                            更多内容请参考:MySQL中的全文检索(1)

     

    4. ft_boolean_syntax (+ -><()~*:""&|)使用的例子:

            4.1  + : 用在词的前面,表示一定要包含该词,并且必须在开始位置。

                                eg: +Apple 匹配:Apple123,     "tommy, Apple"

            4.2  - : 不包含该词,所以不能只用「-yoursql」这样是查不到任何row的,必须搭配其他语法使用。

                                eg: MATCH (girl_name) AGAINST ('-林志玲 +张筱雨')

                                  匹配到: 所有不包含林志玲,但包含张筱雨的记录 

            4.3. 空(也就是默认情况),表示可选的,包含该词的顺序较高。 

                           例子:

                     apple banana           找至少包含上面词中的一个的记录行

                     +apple +juice               两个词均在被包含

                     +apple macintosh     包含词 “apple”,但是如果同时包含 “macintosh”,它的排列将更高一些

                     +apple -macintosh   包含 “apple” 但不包含 “macintosh”

            4.4. > :提高该字的相关性,查询的结果会排在比较靠前的位置。 

            4.5.< :降低相关性,查询的结果会排在比较靠后的位置。

                          例子:4.5.1.先不使用 >< 

                                    select * from tommy.girl where match(girl_name) against('张欣婷' in boolean mode);

                                       可以看到完全匹配的排的比较靠前

                                  4.5.2. 单独使用 >

                                    select * from tommy.girl where match(girl_name) against('张欣婷 >李秀琴' in boolean mode);

                                      使用了>的李秀琴马上就排到最前面

     

                                 4.5.3. 单独使用 <

                                    select * from tommy.girl where match(girl_name) against('张欣婷 <不是人' in boolean mode);

                                     看到没,不是人排到最前面了,这里使用的可是 < 哦,说好的降低相关性呢,往下看吧。

     

                               4.5.4.同时使用><

                                  select * from tommy.girl where match(girl_name) against('张欣婷 >李秀琴 <练习册 <不是人>是个鬼' in boolean mode);

                                   到这里终于有答案了,只要使用了 ><的都会往前排,而且>的总是排在<的前面

                            小结一下:1. 只要使用 ><的总比没用的 靠前;

                                           2. 使用  >的一定比 <的排的靠前 (这就符合相关性提高和降低)

                                           3. 使用同一类的,使用的越早,排的越前。

            4.6. ( ):可以通过括号来使用字条件。  

                           eg: +aaa +(>bbb <ccc) // 找到有aaa和bbb和ccc,aaa和bbb,或者aaa和ccc(因为bbb,ccc前面没有+,所以表示可有可无),

                                             然后 aaa&bbb > aaa&bbb&ccc > aaa&ccc

               4.7. ~ :将其相关性由正转负,表示拥有该字会降低相关性,但不像「-」将之排除,只是排在较后面。 

                               eg:   +apple ~macintosh   先匹配apple,但如果同时包含macintosh,就排名会靠后。

               4.8. * :通配符,这个只能接在字符串后面。 

                                     MATCH (girl_name) AGAINST ('+*ABC*')   #错误,不能放前面

                                     MATCH (girl_name) AGAINST ('+张筱雨*')  #正确

               4.9. " " :整体匹配,用双引号将一段句子包起来表示要完全相符,不可拆字。 

                                     eg:  "tommy huang" 可以匹配  tommy huang xxxxx   但是不能匹配  tommy is huang

    5.补充:Windows下无法修改 ft_min_word_len的情况,

              5. 1. 使用cmd打开 services.msc,

                    找到你的 MySQL服务,右键Properties,找到你的my.ini所在的路径

                    

              5.2. 停止MySQL,在my.ini中增加 ft_min_word_len = 1,重启MySQL,

                        然后使用命令 show variables like 'ft_min_word_len'; 查看是否生效了

    展开全文
  • 全文检索技术

    千次阅读 2019-09-24 21:33:49
    全文检索技术

    https://github.com/lostsquirrel/ik-analyzer


    1 课程计划

    1、什么是全文检索,如何实现全文检索
    2、Lucene实现全文检索的流程
        a)	创建索引
        b)	查询索引
    3、配置开发环境
    4、入门程序
    5、分析器的分析过程
        a)	测试分析器的分词效果
        b)	第三方中文分析器
    6、索引库维护
        a)	添加文档
        b)	删除文档
        c)	修改文档
    7、索引库查询
        a)	使用Query子类查询
        b)	使用QueryParser查询
    

    2 什么是全文检索

    2.1 数据分类

    我们生活中的数据总体分为两种:结构化数据和非结构化数据。

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

    非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等磁盘上的文件

    2.2 结构化数据搜索

    常见的结构化数据也就是数据库中的数据。在数据库中搜索很容易实现,通常都是使用sql语句进行查询,而且能很快的得到查询结果。

    为什么数据库搜索很容易?

    因为数据库中的数据存储是有规律的,有行有列而且数据格式、数据长度都是固定的。

    2.3 非结构化数据查询方法

    顺序扫描法(Serial Scanning)

    所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容,只是相当的慢。

    全文检索(Full-text Search)

    将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引

    例如:字典。字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。

    这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)

    虽然创建索引的过程也是非常耗时的,但是索引一旦创建就可以多次使用,全文检索主要处理的是查询,所以耗时间创建索引是值得的。

    2.4 如何实现全文检索

    可以使用Lucene实现全文检索。Lucene是apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能。

    2.5 全文检索的应用场景

    对于数据量大、数据结构不固定的数据可采用全文检索方式搜索,比如百度、Google等搜索引擎、论坛站内搜索、电商网站站内搜索等。

    3 Lucene实现全文检索的流程

    3.1 索引和搜索流程图

    1、绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括:确定原始内容即要搜索的内容à采集文档à创建文档à分析文档à索引文档

    2、红色表示搜索过程,从索引库中搜索内容,搜索过程包括:用户通过搜索界面à创建查询à执行搜索,从索引库搜索à渲染搜索结果

    3.2 创建索引

    对文档索引的过程,将用户要搜索的文档内容进行索引,索引存储在索引库(index)中。

    这里我们要搜索的文档是磁盘上的文本文件,根据案例描述:凡是文件名或文件内容包括关键字的文件都要找出来,这里要对文件名和文件内容创建索引。

     3.2.1 获得原始文档

    原始文档是指要索引和搜索的内容。原始内容包括互联网上的网页、数据库中的数据、磁盘上的文件等。

    本案例中的原始内容就是磁盘上的文件,如下图:

     

     

    展开全文
  • PDF全文翻译

    万次阅读 多人点赞 2019-01-30 15:38:43
    最近看论文实在是头大,花了一点时间用Python写了个小工具,实现了PDF的全文翻译(得意的笑)。试过其他的一些PDF翻译的方法,感觉不是很理想,来对比一下: (某狗的是旧版本的论文,和我本机测试的略有不同...
  • mysql全文索引

    千次阅读 2019-04-24 10:23:53
    1.创建全文索引(FullText index) 旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息要随时关注官网, 1.1. 创建表...
  • 全文检索工具Lucene入门教程

    千次阅读 多人点赞 2020-07-11 17:55:11
    Apache Lucene是完全用Java编写的高性能,功能齐全的,全文检索引擎工具包,通过lucene可以让程序员快速开发一个全文检索功能。 1.1什么是全文检索 在我们的生活中数据总体分为两种:结构化数据 和非结构化数据 。...
  • 全文检索python

    千次阅读 2018-11-11 11:27:32
    ####全文检索 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理 #####haystack 全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎,点击查看...
  • 展开阅读全文

    千次阅读 2020-06-12 08:26:33
    展开阅读全文 不知从何时起,到处都得,展开阅读全文 问了CSDN的客服,说是为了优化加载,去解决慢、卡的问题 我信了 虽然我还是觉得就是个跟风设计 谁能告诉这对用户友好在哪,我也学习学习 ...
  • 全文索引和全文检索是sql server 7.0的新增功能,它能够对数据中的字符类型列(如varchar、text等类型列)进行索 引,并通过索引实现全文搜索查询。sql server常规索引与全文检索相比,二者的区别如下: 常规索引 ...
  • 全文检索简介

    2019-06-26 13:08:23
    全文检索 从全文数据中进行检索就叫全文检索(全文搜索)。是基于文本的搜索。 文本可分为: 结构化数据: 指具有“固定格式”或“有限长度”的数据,如数据库,元数据等;可以用二维表结构来逻辑表达实现的数据 非...
  • 正文一:Full Text Search Engines vs. DBMS 发表于2009年 ...不知道大家有没有想过一个问题:数据库服务也支持全文搜索,但我们为什么要用全文搜索引擎! 如果说是全文搜索引擎更快或者性能更好,那为什么呢?我们
  • lucene全文检索案例源码

    千次下载 热门讨论 2012-05-09 10:02:45
    lucene全文检索案例源码 lucene全文检索案例源码
  • MySQL 全文检索

    2017-06-27 10:26:34
    MySQL 全文检索支持MySQL 全文检索支持 MyISAM 40以上 InnoDB564以上 全文检索语法 检索方式 简单示例 MySQL全文索引相关配置 注意事项 MyISAM (4.0以上)从MySQL 4.0以上 myisam引擎就支持了full text search 全文...
  • Mysql——全文索引

    千次阅读 2020-03-11 17:41:15
    在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。 从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支...
  • 全文本搜索

    千次阅读 2018-06-03 11:08:52
    一、理解全文本搜索 MyISAM支持全文本搜索,InnoDB不支持。 通配符与正则表达式匹配的性能较低,通常会匹配表的所有行,而且这些搜索极少使用索引,且返回的结果不智能化。在使用全文本搜索时,mysql不需要分别...
  • 全文索引介绍 ----------------------------------------------------------------------------------------------------------------------------- 1.创建全文索引(FullText index) 旧版的MySQL的全文索引只能...
  • NEO4J全文检索架构

    千次阅读 2019-04-24 20:39:02
    NEO4J全文检索架构一、有大量存量数据(亿级以上)(并长期有增量数据进入)二、无大量存量数据或者少量存量数据(或全部为增量数据)三、架构方案选择优先级 以下方案,是根据实践总结的基于NEO4J的全文检索解决...
  • 全文检索概念介绍

    千次阅读 2017-08-18 15:15:48
    1.全文检索概念介绍  今天小编给大家讲解全文搜索的概念,希望大家对全文搜索能够有一个整体的了解。 1.1我们身边的搜索 l 在BBS、BLOG、新闻等系统中提供的搜索文章的功能,如这里的贴吧的例子。搜索的范围是系统...
  • MySql全文索引

    千次阅读 2017-09-30 09:21:57
    MySql全文索引 使用索引是数据库性能优化的必备技能之一。在MySQL数据库中,有四种索引:聚集索引(主键索引)、普通索引、唯一索引以及我们这里将要介绍的全文索引(FULLTEXT INDEX)。 全文索引(也称全文检索)是...
  • 用 DocFetcher 全文搜索

    千次阅读 2018-04-08 15:11:10
    用 DocFetcher 全文搜索 (金庆的专栏 2018.4) 以前用 Notepad++ 的全文搜索,没有索引,每次搜索都须等待一会儿。 而 DocFetcher 是开源的桌面搜索应用,建好索引后,搜索会立即出结果。 先须为某个目录创建索引...
  • MySQL全文索引

    千次阅读 2019-01-16 17:20:08
    最近在复习数据库索引部分,看到了 fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录。 引入 概念 通过数值比较、范围过滤等就可以完成绝大...
  • MYSQL全文本搜索

    2019-05-19 00:59:51
    全文本搜索使用全文本搜索启用全文本搜索进行全文本搜索使用拓展查询布尔文本搜索 使用全文本搜索 为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断的重新索引。对表列进行适当的改进后,MySQL会...
  • 全文检索——Lucene

    千次阅读 2016-06-24 19:57:04
    简单介绍: 全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法。全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。 像我们平时用的百度谷歌搜索引擎,当我们在输入框输入...
  • MySQL全文索引功能

    千次阅读 2018-09-15 15:44:31
    自然语言全文索引 说明 简介 1).MySQL中的全文索引是FultLeXT类型的索引。 2).全文索引只能用于NYNDB或MyISAM表,只能为CHAR、VARCHAR或文本列创建。 3).在MySQL 5.7.6中,MySQL提供了支持中文、日文和...
  • SQL全文搜索

    千次阅读 2017-09-07 10:31:19
    全文索引 1.定义 全文索引技术是目前搜索引擎的关键技术。 中文名 全文索引 外文名 term 方 法 先定义一个词库 性 质 搜索引擎的关键技术   2.原理 原理是先定义一个词库,然后在文章中查找每个...
  • 全文搜索技术

    千次阅读 2017-09-29 18:12:31
    全文检索技术是信息检索技术的一种,主要是用户的查询请求和全文中的每一个词进行比较,不考虑查询请求和文档的语法上的匹配,在信息检索工具中,全文检索技术是最通用的和实用的。 建立索引一般使用倒排索引技术,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,205
精华内容 32,082
关键字:

全文