无锡阳山镇网站建设,中国遵义门户网站,云服务器有哪些,不用模板 网站全文检索介绍
全文检索的发展过程#xff1a;
数据库使用SQL语句#xff1a;select * from table where data like “%检索内容%”出现lucene全文检索工具#xff08;缺点#xff1a;暴露的接口相对复杂#xff0c;且没有效率#xff09;出现分布式检索服务框架solr
数据库使用SQL语句select * from table where data like “%检索内容%”出现lucene全文检索工具缺点暴露的接口相对复杂且没有效率出现分布式检索服务框架solr缺点建立索引期间。solr搜索能力极度下降造成实时索引效率不高出现 Elasticsearch 是以lucene为基础基于Restful接口进行发布
非结构化数据查找方法
顺序扫描法遍历所有文件找到所包含的字符全文检索将非结构化数据中的一部分信息提取重新组织使其变得具有一定结构然后对此有一定结构的数据进行检索。这部分从非结构数据中提取重新组织的信息称之为索引这种先建立索引再对索引进行搜索的过程叫做全文检索full-text search
Lucene全文检索流程 ES
ES简介
ES与Solr对比
Solr使用zookeeper进行分布式管理而ES自身带有分布式协调管理Solr支持更多格式数据而ES仅支持jsonSolr官方提供功能更多而ES本身更注重核心功能高级功能由第三方插件提供ES在处理实时搜索应用时效高于Solr
ES架构模块 Gateway存储索引的文件系统支持多种类型Local本地、Shared分片、Hadoop、AmazonDistributed Lucene Directory分布式的Lucene框架Lucene之上是ES 的模块包括索引模块、搜索模块、映射解析模块ES之上是Discovery、Scripting和第三方插件 DiscoveryES 的节点发现模块不同机器上的ES节点要组成集群需要进行消息通信集群内部master选举等支持多种发现机制如Zen、EC2Scripting用来支持查询语句插入JavaScript、python等脚本语言Scripting模块负责解析这些脚本但使用这些脚本性能较低同时ES也支持多种第三方插件 再往上Transport模块主要是ES的传输模块和JMXJava的管理框架传输模块支持多种传输协议如Thrift、Memacached、http等默认是http再往上就是ES提供的用户接口
核心概念
索引ndex就是一堆有相似结构的文档数据用于区分文档成组即分到一组的文档集合类型Type用于区分索引中的文档即在索引中对数据逻辑分区。比如将博客平台所有数据存储到一个索引中在该索引中可为用户数据、博客数据、评论数据等分别定义一个type文档Document指定了唯一 ID 的最底层或者根对象ES的最小数据单元字段Field定义Document应有的字段
ES与MySQL类比 集群cluster由多个节点组织在一起共同持有整个集群数据注意一个集群有唯一的名字标识默认是“elasticsearch”。一个节点只能通过指定某个集群的名字加入该集群 节点node集群中的一个服务器 一个节点由一个名字标识默认情况是随机的“漫威漫画角色名字” 一个节点可通过配置集群名称方式加入指定集群默认下每个节点都被安排到“elasticsearch”集群中 若启动第一个节点会默认创建并加入到叫“elasticsearch”的集群 分片shard
一个索引可存储超出某节点硬件限制的大量数据比如一个10亿文档的索引占据1T磁盘空间而任一节点都没有这么大的磁盘空间或单个节点处理请求响应太慢。为解决此类问题ES将索引划分为多份shard的能力称为分片。 创建一个索引的时候可指定分片数量每个分片本身就是一个功能完整且独立的“索引”该“索引”可被放置到集群的任何节点 分片的作用
允许水平分割/扩展容量允许在分片上进行分布式、并行的操作进而提高性能/吞吐量
对于一个分片如何分布文档是如何聚合响应搜索请求完全由ES管理对于用户是透明的
副本replica
在分布式环境下任何分片/节点都可能失效导致index无法搜索所以为了保证数据安全会将每个index分片进行复制备份这种拷贝称为副本replica 副本的作用
在分片/节点失效情况下提供高可用性注意到ES的副本分片从不与 原/master 分片置于同一节点上扩展搜索量/吞吐量因为搜索可在所有复制上并行运行
总之每个索引可被分为多个分片每个索引可被复制0-n次。一旦创建副本每个索引就有了主分片和副本分片。分片和副本的数量可在索引创建时指定创建完成后可改变副本数量但无法改变分片的数量 默认情况下ES分片配置是5、副本数配置是1如果集群至少2个节点该索引将会有5个主分片、5个副本分片完全拷贝该索引总共有10个分片
分词查询
举例说明 文本“我正在学习数据结构和算法” 对文本查询一般分为三种
模糊查询类似sql中的like查询 “学习”、“数据结构”、“算法”能搜索到结果精确搜索文本内容与搜索关键词一致 关键词一定要是“我正在学习数据结构和算法”才匹配分词搜索对搜索关键字和搜索内容都进行分词只要匹配到一个分词内容就命中相关内容 “算法之美”也能搜索到结果因为分词搜索只需关键字的分词匹配到即可用模糊查询是无法搜索出结果
在ES中使用term、match、match_phrase、keyword进行相关搜索 涉及多个关键字 text和keyword是数据类型对磁盘待查询数据是否进行分词
text分词在写入磁盘时分割成多个独立单词然后存入倒排索引。查询时也是以单词维度进行匹配keyword不分词存放整个短语
math和term是搜索方式是数据查询时要查询的短语是否进行分词
match对搜索的内容进行分词拿分词数据去倒排索引中查询term不对搜索内容进行分词是完全匹配
数据准备在索引base-product-spu-info中有一条数据
{
spuName : 【市场价2532】HUAWEI WATCH 2 Pro 4G智能手表 移动支付
}查看其分词结果
GET base-product-spu-info/_analyze
{
analyzer: standard,text: 【市场价2532】HUAWEI WATCH 2 Pro 4G智能手表 移动支付
}
// 分词结果市|场|价|2532|huawei|watch|2|pro|4g|智|能|手|表|移|动|支|付term搜索
term搜索对搜索词不分词但还是会对要搜索的字段进行分词。一旦加上keyword属性就不对数据进行分词变成精确搜索 注意默认情况下不加keyword属性使用的是text 搜索关键字“智”termtext
GET base-product-spu-info/_search
{query: {term: {spuName: {value: 智}}}
}
// 结果搜索出数据QueryBuilders.termQuery(spuName, 智);搜索关键字“智能” 结果无匹配数据分词结果中无此分词搜索关键字“Pro” 结果无匹配数据搜索关键字“pro” 结果搜索出数据搜素关键字“【市场价2532】HUAWEI WATCH 2 Pro 4G智能手表 移动支付” 结果无匹配数据因为搜索词未分词搜索关键字“【市场价2532】HUAWEI WATCH 2 Pro 4G智能手表 移动支付”【加上keyword关键字】termkeyword
GET base-product-spu-info/_search
{query: {term: {spuName.keyword: {value: 【市场价2532】HUAWEI WATCH 2 Pro 4G智能手表 移动支付}}}
}
// 结果搜索出数据match搜索
match会对搜索词进行分词再进行分词搜索同时不加keyword的情况下数据也会分词
GET base-product-spu-info/_search
{query: {match: {spuName: 手机}}
}
// 结果搜索出数据分词为“手|机”命中数据分词QueryBuilders.matchQuery(spuName, 手机);match_phrase搜索
match_phrase搜索为短语搜索要求短语中所有分词必须同时出现在文档中同时位置必须一致
GET base-product-spu-info/_search
{query: {match_phrase: {spuName: 智能手表}}
}
// 结果搜索出数据QueryBuilders.matchPhraseQuery(“spuName”,智能手表);假若搜索关键字“智能手表1”则无法匹配数据因为分词“1”并不在数据分词中所以无法命中。同样的“手表智能”也无法命中
match_phrase_prefix
与match_phrase用法类似区别在于它允许对最后一个词条进行前缀匹配
GET base-product-spu-info/_search
{query: {match_phrase_prefix: {spuName: 智能手表}}
}
// 结果搜索出数据
QueryBuilders.matchPhrasePrefixQuery(spuName,智能手表)说明此处“智能手表”进行分词其中“智|能|手”与分词进行匹配“表”可进行前缀匹配类似“表%”意味着若分词表中存在“表现、表示、表哥我出来了哦”等分词时也能命中。
总结 token分词后的单词小写start_offset在短语中的开始位置end_offset短语中的结束位置position单词在短语中的位置即第几个单词
总结比如有一个文档字段“717 Hendrickson Place”分词结果如上图
对关键字“717 Hendrickson Place”使用【termkeyword】搜索 结果有结果关键词不分词精确匹配对关键字“717 Hendrickson Place01”使用【termkeyword】搜索 结果无匹配结果改动了Place对关键字“717 Hendrickson Place”使用【matchkeyword】搜索 结果有结果数据字段不分词精确匹配对关键字“717 Hendrickson Place01”使用【matchkeyword】搜索 结果无匹配结果数据字段不分词精确匹配对关键字“717 Hendrickson Place”使用【termtext】搜索 结果无匹配结果关键词未分词字段数据分词“717 Hendrickson Place”未名中分词对关键字“717 Hendrickson Place”使用【matchtext】搜索 结果有结果关键词和字段数据都分词“717”分词命中对关键字“717 Hendrickson Place01”使用【matchtext】搜索 结果有结果这里改动了Place“717”分词命中对关键字“Hendrickson”使用【termtext】搜索 结果无匹配结果关键词未分词字段数据分词分词未命中对关键字“hendrickson”使用【termtext】搜索 结果有结果Hendrickson改为小写 hendrickson