数据检索

Lucene简介和使用

筅森魡賤 提交于 2020-01-26 02:59:15
全文检索 数据分类: 结构化数据:格式、长度、类型等固定,如数据库中的数据 非结构化数据:格式、长度、类型等不固定,如pdf、html文件 数据查询: 结构化数据:sql语句 非结构化数据:将非结构化数据转换为结构化数据,建立索引然后查询 全文检索就是先创建索引然后查询索引的过程 全文检索的应用场景 : 搜索引擎,如百度、谷歌 站内搜索,如微博、csdn文章 电商搜索,如淘宝、京东 等等 Lucene简介 Lucene是一个基于Java开发的开源全文检索引擎工具包,但它 不是一个完整的全文检索引擎,而是一个全文检索引擎的架构 ,提供了完整的查询引擎和索引引擎,部分文本分析引擎。 Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。 Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。 Lucene实现全文检索流程 上面说到 全文检索就是先创建索引然后查询索引的过程 ,Lucene实现全文检索就是需要创建索引和查询索引。 使用Lucene 创建索引 需要的jar包: commons-io-2.6.jar junit-4.10.jar lucene-analyzers-common-7.4.0.jar lucene-core-7.4.0.jar 测试用的原始文档D:\java

Solr和ES对比

我是研究僧i 提交于 2020-01-25 23:16:48
搜索引擎选择: Elasticsearch与Solr 搜索引擎选型调研文档 Elasticsearch简介 * Elasticsearch是一个 实时 的 分布式 搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。 它可以用于 全文搜索 , 结构化搜索 以及 分析 ,当然你也可以将这三者进行组合。 Elasticsearch是一个 建立在全文搜索引擎 Apache Lucene™ 基础上 的搜索引擎,可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架。 但是Lucene只是一个框架,要充分利用它的功能,需要使用JAVA,并且在程序中集成Lucene。需要很多的学习了解,才能明白它是如何运行的,Lucene确实非常复杂。 Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理。 当然Elasticsearch并不仅仅是Lucene这么简单,它不但包括了全文搜索功能,还可以进行以下工作: 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。 实时分析的分布式搜索引擎。 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。 这么多的功能被集成到一台服务器上,你可以轻松地通过客户端或者任何你喜欢的程序语言与ES的RESTful API进行交流

深入了解mysql--gap locks,Next-Key Locks

时光毁灭记忆、已成空白 提交于 2020-01-25 22:47:42
Next-Key Locks Next-Key Locks是在存储引擎innodb、事务级别在 可重复读 的情况下使用的数据库锁,官网上有介绍,Next-Key Locks是行锁和gap锁的组合。行锁是什么我们都很清楚,这篇文章主要简单分析一下mysql中的gap锁是什么。innodb默认的锁就是Next-Key locks。 GAP锁 gap锁,又称为间隙锁。存在的主要目的就是为了防止在 可重复读 的事务级别下,出现幻读问题。 在可重复读的事务级别下面,普通的select读的是快照,不存在幻读情况,但是如果加上for update的话,读取是已提交事务数据,gap锁保证for update情况下,不出现幻读。 那么gap锁到底是如何加锁的呢? 假如是for update级别操作,先看看几条总结的何时加锁的规则。 唯一索引 精确等值检索,Next-Key Locks就退化为记录锁,不会加gap锁 范围检索,会锁住where条件中相应的范围,范围中的记录以及间隙,换言之就是加上记录锁和gap 锁(至于区间是多大稍后讨论)。 不走索引检索,全表间隙加gap锁、全表记录加记录锁 非唯一索引 精确等值检索,Next-Key Locks会对间隙加gap锁(至于区间是多大稍后讨论),以及对应检索到的记录加记录锁。 范围检索,会锁住where条件中相应的范围,范围中的记录以及间隙

Sphinx + Coreseek 实现中文分词搜索

自古美人都是妖i 提交于 2020-01-25 16:51:25
Sphinx + Coreseek 实现中文分词搜索 Sphinx Coreseek 实现中文分词搜索 全文检索 1 全文检索 vs 数据库 2 中文检索 vs 汉化检索 3 自建全文搜索与使用Google等第三方站点提供的站内全文搜索的差别 Sphinx Coreseek介绍 Coreseek安装使用 1. 全文检索 1.1 全文检索 vs. 数据库 全文检索是数据库的有力补充,全文检索并不能替代数据库在应用系统中的作用。当应用系统的数据以大量的文本信息为主时,採用全文检索技术能够极大的提升应用系统的价值。 数据库搜索。假设搜索范围包含所有正文数据。往往性能非常低。用户响应时间长(分钟级。常常超时);而全文检索能够在0.x秒(毫秒级)的时间内将结果反馈给用户; 数据库搜索。一个用户在搜索。往往影响其它用户的相应用系统进行操作。全文检索能够同一时候支持多个用户并发搜索,其它相应用系统进行操作的用户不受影响。 数据库搜索非常难实现多个关键字的复合搜索。而全文检索能够实现多个关键词的复合搜索。包含 “和(AND)”、“或(OR)”、“否(NOT)” 等; 数据库搜索难于对结果进行相关度排序,当检索结果多时。用户往往难于找到最恰当的文档。而全文检索通过统计的研究成果。能够将文档进行相关度排序后。再返回给用户,提高用户的效率; 全文检索还能够对检索结果的数据进行聚类分析(Group,

Java Lucene定时更新索引

坚强是说给别人听的谎言 提交于 2020-01-25 00:57:47
需求:每晚2点开始对所有数据建立索引,其它时间,每隔一定的时间更新索引。 经过测试,5000条数据建立索引只需600ms,20000条数据约1000ms...几十万的数据也只需要几秒。 若根据初步方案,白天更新数据索引只更新新添加或者改动的数据,需要将数据库查出的数据于IndexReader中的数据进行检索剔除,此操作耗时较多。初步测试结果:5000条数据需要50s;20000条数据需要220s... 若有20w条数据,则光剔除数据的时间就需要4h,明显行不通。 故还不如直接每次都重建所有索引。 不多说,贴初步方案的代码888: java package net.lucene.buildindex; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document

Lucene 原理与代码分析完整版

孤街浪徒 提交于 2020-01-24 11:06:29
Lucene 原理与代码分析系列文章已经基本告一段落,可能问题篇还会有新的更新。 完整版pdf可由以下链接下载。 Lucene 原理与代码分析完整版 目录如下: 目录 目录 第一篇:原理篇 第一章:全文检索的基本原理 一、总论 二、索引里面究竟存些什么 三、如何创建索引 第一步:一些要索引的原文档 (Document) 。 第二步:将原文档传给分次组件 (Tokenizer) 。 第三步:将得到的词元 (Token) 传给语言处理组件 (Linguistic Processor) 。 第四步:将得到的词 (Term) 传给索引组件 (Indexer) 。 1. 利用得到的词 (Term) 创建一个字典。 2. 对字典按字母顺序进行排序。 3. 合并相同的词 (Term) 成为文档倒排 (Posting List) 链表。 四、如何对索 引进行搜索? 第一步:用户输入查询语句。 第二步:对查询语句进行词法分析,语法分析,及语言处理。 1. 词法分 析主要用来识别单词和关键字。 2. 语法分析主要是根据查询语句的语法规则来形成一棵语法树。 3. 语言处理同索引过程中的语言处理几乎相同。 第三步:搜索索引,得到符合语法树的文档。 第四步:根据得到的文档和查询语句的相关性,对结果进行排序。 1. 计算权重 (Term weight) 的过程。 2. 判断 Term

数据导入导出 、 管理表记录 、 匹配条件 、 MySQL管理工具

白昼怎懂夜的黑 提交于 2020-01-22 07:38:28
案例1:数据导入导出 1.1 问题 修改检索目录为/myload 将/etc/passwd文件导入db3库的user表里,并添加行号字段。 将db3库user表所有记录导出, 存到/myload/user.txt 文件里。 步骤一:修改检索目录为/myload 修改配置文件,重启服务 ] # mkdir /myload ] # chown mysql /myload ] # vim /etc/my.cnf [mysqld] secure_file_priv=" / myload” / / 添加 ] # systemctl restart mysqld mysql> show variables like “secure_file_priv” ; / / 查看 + - -- - -- - -- - -- - -- - - + -- - -- - -- - -- - -- - -- - -- - -- + | Variable_name | Value | + - -- - -- - -- - -- - -- - -- + -- - -- - -- - -- - -- - -- - -- - -- + | secure_file_priv | / myload / | + - -- - -- - -- - -- - -- - -- + -- - -- - -- - -- - -- -

mysql必知必会--排序检索数据

烈酒焚心 提交于 2020-01-21 16:16:39
排序数据 其实,检索出的数据并不是以纯粹的随机顺序显示的。如果不排 序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初 添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺 序将会受到MySQL重用回收存储空间的影响。因此,如果不明确控 制的话,不能(也不应该)依赖该排序顺序。关系数据库设计理论认 为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有 意义。 子句(clause) SQL语句由子句构成,有些子句是必需的,而 有的是可选的。一个子句通常由一个关键字和所提供的数据组 成。子句的例子有 SELECT 语句的 FROM 子句 为了明确地排序用 SELECT 语句检索出的数据,可使用 ORDER BY 子句。 ORDER BY 子句取一个或多个列的名字,据此对输出进行排序 通过非选择列进行排序 通常, ORDER BY 子句中使用的列将 是为显示所选择的列。但是,实际上并不一定要这样,用非 检索的列排序数据是完全合法的 按多个列排序 经常需要按不止一个列进行数据排序。例如,如果要显示雇员清单, 可能希望按姓和名排序(首先按姓排序,然后在每个姓中再按名排序)。 如果多个雇员具有相同的姓,这样做很有用。 为了按多个列排序,只要指定列名,列名之间用逗号分开即可(就 像选择多个列时所做的那样)。 重要的是理解在按多个列排序时,排序完全按所规定的顺序进行。

JAVA课程笔记系列: 基于SpringBoot的Data Solr搜索引擎开发

佐手、 提交于 2020-01-14 12:22:21
基于SpringBoot的Data Solr搜索引擎开发 关于Apache Solr的简介 Solr它是一种开放源码的、基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中。Solr 提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等格式)。它易于安装和配置,而且附带了一个基于HTTP 的管理界面。可以使用 Solr 的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。Solr的特性包括: 高级的全文搜索功能 专为高通量的网络流量进行的优化 基于开放接口(XML和HTTP)的标准 综合的HTML管理界面 可伸缩性-能够有效地复制到另外一个Solr搜索服务器 使用XML配置达到灵活性和适配性 可扩展的插件体系 支持像英语,德语,中国,日本,法国和许多主要语言 Apache Solr和Lucene的关系 Solr 与Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene ,因为Solr 底层的核心技术是使用Apache Lucene 来实现的,简单的说Solr 是Lucene 的服务器化。需要注意的是Solr 并不是简单的对Lucene 进行封装,它所提供的大部分功能都区别于Lucene。 Apache Solr 相关目录说明 Solr程序包的结构说明 bin :solr相关运行脚本

MySQL 索引详解

有些话、适合烂在心里 提交于 2020-01-14 03:15:42
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。 注: [1] 索引不是万能的 ! 索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。为了在某种程序上弥补这一缺陷,许多SQL命令都有一个DELAY_KEY_WRITE项。这个选项的作用是暂时制止MySQL在该命令每插入一条新记录和每修改一条现有之后立刻对索引进行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行。在需要把许多新记录插入某个数据表的场合,DELAY_KEY_WRITE选项的作用将非常明显。 [2]另外, 索引还会在硬盘上占用相当大的空间 。 因此应该只为最经常查询和最经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。 从理论上讲,完全可以为数据表里的每个字段分别建一个索引,但MySQL把同一个数据表里的索引总数限制为16个。 1. InnoDB数据表的索引 与MyISAM数据表相比,索引对InnoDB数据的重要性要大得多。在InnoDB数据表上,索引对InnoDB数据表的重要性要在得多。在 InnoDB数据表上,索引不仅会在搜索数据记录时发挥作用,还是数据行级锁定机制的苊、基础。”数据行级锁定”的意思是指在事务操作的执行过程中锁定正在被处理的个别记录