• 关于

    索引搜索是什么

    的搜索结果

问题

阿里云开放搜索如何索引对象存储oss中的数据?

学浩 2019-12-01 18:45:22 1084 浏览量 回答数 1

问题

重建索引后没有生效,搜索不到相关字段,是为什么?

保持可爱mmm 2020-03-26 22:12:40 0 浏览量 回答数 1

回答

聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因 澄清一个概念:innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值

剑曼红尘 2020-03-31 10:56:02 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

1. 关于爬行和索引关于索引问题,我想应该很多朋友都有体会,为什么我的站Google收录的很少?为什么我发的反链Google都没有收录? Google目前的索引量到底有多大,大家可以在Google里搜索a试试,从这个结果应该能看出个大概。 About 25,420,000,000 results (0.17 seconds) 然后,根据资料,截止到2007年2月,互联网上已经发现的网站数量是108m,810,358个。 我们暂且拿当今的Google索引量,除以两年前的网站数目,也就是平均下来,每个站的Google收录量不到300。那么实际情况呢? 很多时候,并不是Google没有发现你的页面或者反链,只是觉得这些页面或者反链不够重要,没什么必要加入到他们的索引数据库里以供用户查询时返回结果。 那么什么样的页面才是重要的页面?Google又是怎么判断的呢?2. 站内重复内容这里提到了尽量使用canonicalization来避免站内重复内容导致的索引问题。3. 关于aff链接通常情况下,直接用AFF链接也不会输出link credit。4. 301跳转无法传递全部PR或者链接权重 www.50633.cnGoogle官方年初就已经公开说明了301跳转时权重会有所损失

a123456678 2019-12-02 03:03:50 0 浏览量 回答数 0

回答

python 数据源 ,  主索引+增量索引 =你用在千万级数据上试过没。。, 而且搜索量非常大 是访问量的2-3倍 mongo做千万级应用准备最少上半个机柜大内存机吧 sphinx不能直接支持mongodb的。我们之前是用python来建立sphinx和mongodb之间的数据接口。sphinx索引完成之后,搜索动作时在sphinx自身的索引文件上完成的,不涉及的对数据库的搜索了。然后php再根据sphinx给出的id去读mongodb就可以了,怎么会出现断开什么的? 不过python去读mongodb的速度肯定要比sphinx自己直接读mysql要慢,有实力的话可以自己用c写个接口。 mongo做千万级应用准备最少上半个机柜大内存机吧 sphinx不能直接支持mongodb的。我们之前是用python来建立sphinx和mongodb之间的数据接口。sphinx索引完成之后,搜索动作时在sphinx自身的索引文件上完成的,不涉及的对数据库的搜索了。然后php再根据sphinx给出的id去读mongodb就可以了,怎么会出现断开什么的? 不过python去读mongodb的速度肯定要比sphinx自己直接读mysql要慢,有实力的话可以自己用c写个接口。 估计sphinx要分布式,mongodb性能影响应该会小一点。。。 sphinx做raid主要提升磁盘速度吧。 sphinx不能直接支持mongodb的。我们之前是用python来建立sphinx和mongodb之间的数据接口。sphinx索引完成之后,搜索动作时在sphinx自身的索引文件上完成的,不涉及的对数据库的搜索了。然后php再根据sphinx给出的id去读mongodb就可以了,怎么会出现断开什么的? 不过python去读mongodb的速度肯定要比sphinx自己直接读mysql要慢,有实力的话可以自己用c写个接口。 python+sphinx+mongodb以前也这样做过。。千万级!!没试过。 另外给sphinx做缓存。。还有有其它方法?? 把所有的查询结果放到memcache里面啊,如果不存在数据过期或者更新的话;还可以试试把sphinx的index文件放到/dev/shm里面,做好重启后重新索引的脚本就是了。 ######做二次缓存也可。。 应该大部分消耗在sphinx上吧。。 如果同时缓存mongodb中的文本数据的话,内存占用大了。所以只缓存sphinx的数据。######就是"你可以直接把所有的查询结果放到memcache里面" mongo做千万级应用准备最少上半个机柜大内存机吧

一枚小鲜肉帅哥 2020-06-20 19:33:10 0 浏览量 回答数 0

问题

使SQL Server索引变小

心有灵_夕 2019-12-28 22:55:51 0 浏览量 回答数 1

问题

mysql中有关全文索引加and条件问题

落地花开啦 2019-12-01 19:53:04 1069 浏览量 回答数 1

问题

opensearch不支持不指定关键词搜索

歌者和尚 2019-12-01 20:23:33 702 浏览量 回答数 2

问题

OpenSearch如何查询query子句?

轩墨 2019-12-01 20:57:10 1407 浏览量 回答数 0

回答

您绝对应该花一些时间阅读索引,有关索引的文章很多,了解发生的事情很重要。 广义地说,索引对表的行强加了顺序。 为简单起见,假设表只是一个大CSV文件。每当插入一行时,它就会插入到末尾。因此,表的“自然”顺序就是插入行的顺序。 想象一下,您已经在非常基本的电子表格应用程序中加载了CSV文件。该电子表格所做的只是显示数据,并按顺序对行编号。 现在,假设您需要在第三列中找到所有具有“ M”值的行。给定可用的资源,您只有一个选择。您扫描表,检查每一行的第三列的值。如果您有很多行,此方法(“表扫描”)可能需要很长时间! 现在想象一下,除了该表之外,您还具有索引。该特定索引是第三列中的值的索引。该索引以某种有意义的顺序(例如,按字母顺序)列出了第三列中的所有值,并为它们中的每一个提供了该值出现的行号列表。 现在,您有一个很好的策略来查找第三列的值为“ M”的所有行。例如,您可以执行二进制搜索!表扫描要求您查看N行(其中N是行数),而二进制搜索仅要求您查看log-n索引条目,在最坏的情况下。哇,这肯定容易得多! 当然,如果您有此索引,并且要向表中添加行(最后,因为这是我们的概念表的工作方式),则需要每次都更新索引。因此,您在编写新行时需要做更多的工作,但是在搜索内容时可以节省大量时间。 因此,通常,索引在读取效率和写入效率之间产生了折衷。没有索引,插入会非常快-数据库引擎只会在表中添加一行。添加索引时,引擎必须在执行插入操作时更新每个索引。 另一方面,读取变得更快。 希望这能解决您的前两个问题(正如其他人回答的那样-您需要找到合适的平衡点)。 您的第三个场景更加复杂。如果您使用的是LIKE,则索引引擎通常可以帮助您将读取速度提高到第一个“%”。换句话说,如果您正在选择WHERE列,例如'foo%bar%',则数据库将使用索引查找列以“ foo”开头的所有行,然后需要扫描该中间行集以找到子集包含“酒吧”。SELECT ... WHERE列之类的'%bar%'无法使用索引。我希望你能明白为什么。 最后,您需要开始考虑多个列上的索引。这个概念是相同的,并且行为类似于LIKE东西-本质上,如果在(a,b,c)上有索引,则引擎将尽最大可能继续使用从左到右的索引。因此,在列a上进行搜索可能会使用(a,b,c)索引,在(a,b)上也会使用索引。但是,如果您要搜索WHERE b = 5 AND c = 1),则引擎将需要进行全表扫描。 希望这可以帮助您有所了解,但是我必须重申,您最好花几个小时来深入研究能解释这些问题的好文章。阅读特定数据库服务器的文档也是一个好主意。查询计划者实现和使用索引的方式可以相差很大。 来源:stack overflow

保持可爱mmm 2020-05-13 14:09:54 0 浏览量 回答数 0

问题

mysql下mysqlcft插件做全文索引的问题

落地花开啦 2019-12-01 19:53:10 1287 浏览量 回答数 1

问题

何时创建新的SQL Server索引?

保持可爱mmm 2019-12-01 22:00:15 6 浏览量 回答数 1

回答

mysql的聚簇索引是指innodb引擎的特性,mysiam并没有,如果需要该索引,只要将索引指定为主键(primary key)就可以了。比如:create table blog_user( user_Name char(15) not null check(user_Name !=''), user_Password char(15) not null, user_emial varchar(20) not null unique, primary key(user_Name) )engine=innodb default charset=utf8 auto_increment=1;其中的 primary key(user_Name) 这个就是聚簇索引索引了;聚簇索引的叶节点就是数据节点,而非聚簇索引的叶节点仍然是索引节点,并保留一个链接指向对应数据块。聚簇索引主键的插入速度要比非聚簇索引主键的插入速度慢很多。相比之下,聚簇索引适合排序,非聚簇索引(也叫二级索引)不适合用在排序的场合。因为聚簇索引本身已经是按照物理顺序放置的,排序很快。非聚簇索引则没有按序存放,需要额外消耗资源来排序。当你需要取出一定范围内的数据时,用聚簇索引也比用非聚簇索引好。另外,二级索引需要两次索引查找,而不是一次才能取到数据,因为存储引擎第一次需要通过二级索引找到索引的叶子节点,从而找到数据的主键,然后在聚簇索引中用主键再次查找索引,再找到数据。innodb索引分类:聚簇索引(clustered index)    1)  有主键时,根据主键创建聚簇索引    2)  没有主键时,会用一个唯一且不为空的索引列做为主键,成为此表的聚簇索引    3) 如果以上两个都不满足那innodb自己创建一个虚拟的聚集索引辅助索引(secondary index)   非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引 myisam索引:因为myisam的索引和数据是分开存储存储的,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索                         索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因     innodb索引:innodb的数据和索引放在一起,当找到索引也就找到了数据 自适应哈希索引:innodb会监控表上的索引使用情况,如果观察到建立哈希索引可以带来速度的提升,那就建立哈希索引,自 适应哈希索引通过缓冲池的B+树构造而来,                               因此建立的速度很快,不需要将整个表都建哈希索引,InnoDB 存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引。自适应哈希索引不需要                               存储磁盘的,当停库内容会丢失,数据库起来会自己创建,慢慢维护索引。     聚簇索引:MySQL InnoDB一定会建立聚簇索引,把实际数据行和相关的键值保存在一块,这也决定了一个表只能有一个聚簇索引,即MySQL不会一次把数据行保存在二个地方。     1)  InnoDB通常根据主键值(primary key)进行聚簇     2) 如果没有创建主键,则会用一个唯一且不为空的索引列做为主键,成为此表的聚簇索引     3) 上面二个条件都不满足,InnoDB会自己创建一个虚拟的聚集索引 优点:聚簇索引的优点,就是提高数据访问性能。聚簇索引把索引和数据都保存到同一棵B+树数据结构中,并且同时将索引列与相关数据行保存在一起。这意味着,当你访问同一数据页不同行记录时,已经把页加载到了Buffer中,再次访问的时候,会在内存中完成访问,不必访问磁盘。不同于MyISAM引擎,它将索引和数据没有放在一块,放在不同的物理文件中,索引文件是缓存在key_buffer中,索引对应的是磁盘位置,不得不通过磁盘位置访问磁盘数据。  缺点:1) 维护索引很昂贵,特别是插入新行或者主键被更新导至要分页(page split)的时候。建议在大量插入新行后,选在负载较低的时间段,通过OPTIMIZE TABLE优化表,因为必须被移动的行数据可能造成碎片。使用独享表空间可以弱化碎片   2) 表因为使用UUId作为主键,使数据存储稀疏,这就会出现聚簇索引有可能有比全表扫面更慢,所以建议使用int的auto_increment作为主键 3) 如果主键比较大的话,那辅助索引将会变的更大,因为辅助索引的叶子存储的是主键值;过长的主键值,会导致非叶子节点占用占用更多的物理空间  辅助索引在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据叶,再通过数据叶中的Page Directory找到数据行。复合索引由多列创建的索引称为符合索引,在符合索引中的前导列必须出现在where条件中,索引才会被使用ALTER TABLE test.users ADD INDEX idx_users_id_name (name(10) ASC, id ASC) ; 前缀索引当索引的字符串列很大时,创建的索引也就变得很大,为了减小索引体积,提高索引的扫描速度,就用索引的前部分字串索引,这样索引占用的空间就会大大减少,并且索引的选择性也不会降低很多。而且是对BLOB和TEXT列进行索引,或者非常长的VARCHAR列,就必须使用前缀索引,因为MySQL不允许索引它们的全部长度。使用:列的前缀的长度选择很重要,又要节约索引空间,又要保证前缀索引的选择性要和索引全长度选择性接近。 唯一索引唯一索引比较好理解,就是索引值必须唯一,这样的索引选择性是最好的 主键索引主键索引就是唯一索引,不过主键索引是在创建表时就创建了,唯一索引可以随时创建。说明主键和唯一索引区别     1) 主键是主键约束+唯一索引     2) 主键一定包含一个唯一索引,但唯一索引不是主键     3) 唯一索引列允许空值,但主键列不允许空值     4) 一个表只能有一个主键,但可以有多个唯一索引 索引扫描方式:紧凑索引扫描(dense index):在最初,为了定位数据需要做权表扫描,为了提高扫描速度,把索引键值单独放在独立的数据的数据块里,并且每个键值都有个指向原数据块的指针,因为索引比较小,扫描索引的速度就比扫描全表快,这种需要扫描所有键值的方式就称为紧凑索引扫描 松散索引扫描(sparse index):为了提高紧凑索引扫描效率,通过把索引排序和查找算法(B+trre),发现只需要和每个数据块的第一行键值匹配,就可以判断下一个数据块的位置或方向,因此有效数据就是每个数据块的第一行数据,如果把每个数据块的第一行数据创建索引,这样在这个新创建的索引上折半查找,数据定位速度将更快。这种索引扫描方式就称为松散索引扫描。 覆盖索引扫描(covering index):包含所有满足查询需要的数据的索引称为覆盖索引,即利用索引返回select列表中的字段,而不必根据索引再次读取数据文件索引相关常用命令:1) 创建主键 CREATE TABLE pk_tab2 (  id int(11) NOT NULL AUTO_INCREMENT,  a1 varchar(45) DEFAULT NULL,  PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8; 2) 创建唯一索引create unique index indexname on tablename(columnname); alter table tablename add unique index indexname(columnname); 3) 创建单列一般索引create index indexname on tablename(columnname);alter table tablename add index indexname(columnname); 4) 创建单列前缀索引create index indexname on tablename(columnname(10));    //单列的前10个字符创建前缀索引alter table tablename add index indexname(columnname(10)); //单列的前10个字符创建前缀索引 5) 创建复合索引create index indexname on tablename(columnname1,columnname2);    //多列的复合索引create index indexname on tablename(columnname1,columnname2(10));    //多列的包含前缀的复合索引alter table tablename add index indexname(columnname1,columnname2); //多列的复合索引alter table tablename add index indexname(columnname1,columnname(10)); //多列的包含前缀的复合索引 6) 删除索引drop index indexname on tablename;;alter table tablename drop  index indexname; 7) 查看索引show index from tablename;show create table pk_tab2;作者:大树叶 来源:CSDN 原文:https://blog.csdn.net/bigtree_3721/article/details/51335479 版权声明:本文为博主原创文章,转载请附上博文链接!

孟志昂 2019-12-02 01:45:11 0 浏览量 回答数 0

回答

我告诉你什么问题。 你建立索引的使用用了StandardAnalyzer的分词器,该分词器会把汉子句子分成单字,而你搜索时使用的TermQuery termQuery = new TermQuery(new Term("title", queryString)); queryString为“标题”,而且还没有分词,因此你搜索不到任何结果。你应该用“标”或者”题“肯定能搜到。 而你注释掉的: QueryParser queryParser = new QueryParser(Version.LUCENE_42, "title", analyzer); Query query = queryParser.parse(queryString); 逻辑是正确的。他可以用“标题”应该能搜索到,或者你直接让queryString = “title:标题”试试。 ######把词库换成IKAnalyzer试试###### 引用来自“震秦”的答案 我告诉你什么问题。 你建立索引的使用用了StandardAnalyzer的分词器,该分词器会把汉子句子分成单字,而你搜索时使用的TermQuery termQuery = new TermQuery(new Term("title", queryString)); queryString为“标题”,而且还没有分词,因此你搜索不到任何结果。你应该用“标”或者”题“肯定能搜到。 而你注释掉的: QueryParser queryParser = new QueryParser(Version.LUCENE_42, "title", analyzer); Query query = queryParser.parse(queryString); 逻辑是正确的。他可以用“标题”应该能搜索到,或者你直接让queryString = “title:标题”试试。 恩 逻辑是对的! 找到原因了, 用 StringField 的构造方法 不会默认建立索引,改成了 TextField 的构造方法,然后用 QueryParser queryParser = new QueryParser(Version.LUCENE_42, "title", analyzer); Query query = queryParser.parse(queryString); 能够得到结果 ,谢谢大神的指点 ######还有我想问下 , 分词 会不会 存到磁盘 或者是内存 , 索引是需要存到磁盘的吧?###### StringField  默认也会建立索引的呀。###### StringField会被索引但不会做分词处理,整个字符串作为一个token,见https://lucene.apache.org/core/4_7_0/core/org/apache/lucene/document/StringField.html######原来如此,难怪我测试的时候,只有textField索引后,能查到数据。。。

kun坤 2020-06-07 00:35:21 0 浏览量 回答数 0

问题

【精品问答】开放搜索

montos 2020-04-09 18:55:02 5 浏览量 回答数 1

问题

百度沙盒期好久?

圳雲 2019-12-01 20:12:11 1327 浏览量 回答数 1

问题

我在使用C++版的Lucene使用IndexSearcher类的时候遇到崩溃的问题。?报错

爱吃鱼的程序员 2020-06-09 11:21:20 0 浏览量 回答数 1

问题

从2000万条开房数据优化谈检索:报错

kun坤 2020-06-08 11:03:28 21 浏览量 回答数 1

问题

php sphinx搜索中文无结果,什么原因?

落地花开啦 2019-12-01 19:58:40 1527 浏览量 回答数 1

问题

怎么设计一个轻量的用户autocomplete系统

爵霸 2019-12-01 20:11:18 1121 浏览量 回答数 1

问题

API是什么?

轩墨 2019-12-01 20:56:53 1066 浏览量 回答数 0

回答

jre确定要64位######我装的是64位的啊。而且,安装elasticsearch-1.6.0 可以成功。5.0.2就出现这问题。这是什么情况?######jre版本############请问你这个问题解决了吗,我也遇到了这个问题,但是还没有找到解决方案,所谓的环境变量设置了并没有效果######  刚刚找到答案了,es5.0在conf下多了jvm.options文件,将里面的-Xms1g -Xmx1g都这样设置为1g即可 ###### 夜行侠老师视频教学:es问题汇总 http://www.itjoin.org/ 1、如何防止索引被删除 2、搜索的精准性 3、解决搜索中英文数字混合 4、搜索中in查询 5、安装问题 6、es源码内部是如何做到插件化扩展 7、统计时展示不全 8、搜索条件过多,内容过长报错 9、索引某一字段内容太大 10、自动补全设计 11、es的分布式如何实现RPC底层 12、es的分片机制 13、head插件的使用 14、es分片和副本级的是原理 15、如何做到只更新部分数据 16、数组在index中如何制定 17、es搜索结果窗口太大 18、group by里如何 19、es底层新增和删除索引的全过程 20、es底层检索的全过

优选2 2020-06-05 11:53:15 0 浏览量 回答数 0

回答

jre确定要64位######我装的是64位的啊。而且,安装elasticsearch-1.6.0 可以成功。5.0.2就出现这问题。这是什么情况?######jre版本############请问你这个问题解决了吗,我也遇到了这个问题,但是还没有找到解决方案,所谓的环境变量设置了并没有效果######  刚刚找到答案了,es5.0在conf下多了jvm.options文件,将里面的-Xms1g -Xmx1g都这样设置为1g即可 ###### 夜行侠老师视频教学:es问题汇总 http://www.itjoin.org/ 1、如何防止索引被删除 2、搜索的精准性 3、解决搜索中英文数字混合 4、搜索中in查询 5、安装问题 6、es源码内部是如何做到插件化扩展 7、统计时展示不全 8、搜索条件过多,内容过长报错 9、索引某一字段内容太大 10、自动补全设计 11、es的分布式如何实现RPC底层 12、es的分片机制 13、head插件的使用 14、es分片和副本级的是原理 15、如何做到只更新部分数据 16、数组在index中如何制定 17、es搜索结果窗口太大 18、group by里如何 19、es底层新增和删除索引的全过程 20、es底层检索的全过

爱吃鱼的程序员 2020-05-29 19:23:11 0 浏览量 回答数 0

回答

jre确定要64位######我装的是64位的啊。而且,安装elasticsearch-1.6.0 可以成功。5.0.2就出现这问题。这是什么情况?######jre版本############请问你这个问题解决了吗,我也遇到了这个问题,但是还没有找到解决方案,所谓的环境变量设置了并没有效果######  刚刚找到答案了,es5.0在conf下多了jvm.options文件,将里面的-Xms1g -Xmx1g都这样设置为1g即可 ###### 夜行侠老师视频教学:es问题汇总 http://www.itjoin.org/ 1、如何防止索引被删除 2、搜索的精准性 3、解决搜索中英文数字混合 4、搜索中in查询 5、安装问题 6、es源码内部是如何做到插件化扩展 7、统计时展示不全 8、搜索条件过多,内容过长报错 9、索引某一字段内容太大 10、自动补全设计 11、es的分布式如何实现RPC底层 12、es的分片机制 13、head插件的使用 14、es分片和副本级的是原理 15、如何做到只更新部分数据 16、数组在index中如何制定 17、es搜索结果窗口太大 18、group by里如何 19、es底层新增和删除索引的全过程 20、es底层检索的全过

爱吃鱼的程序员 2020-06-02 13:29:04 0 浏览量 回答数 0

问题

如何设计一个轻量的用户autocomplete系统

落地花开啦 2019-12-01 20:02:02 1398 浏览量 回答数 1

问题

上线发布需要知道什么?

轩墨 2019-12-01 21:04:02 941 浏览量 回答数 0

问题

有关搜索引擎sphinx的问题? 400 报错

爱吃鱼的程序员 2020-06-04 13:22:08 0 浏览量 回答数 1

回答

简介 ES是一个基于RESTful web接口并且构建在Apache Lucene之上的开源分布式搜索引擎。 同时ES还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,能够横向扩展至数以百计的服务器存储以及处理PB级的数据。 可以在极短的时间内存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。 ES就是为高可用和可扩展而生的。一方面可以通过升级硬件来完成系统扩展,称为垂直或向上扩展(Vertical Scale/Scaling Up)。 另一方面,增加更多的服务器来完成系统扩展,称为水平扩展或者向外扩展(Horizontal Scale/Scaling Out)。尽管ES能够利用更强劲的硬件,但是垂直扩展毕竟还是有它的极限。真正的可扩展性来自于水平扩展,通过向集群中添加更多的节点来分担负载,增加可靠性。ES天生就是分布式的,它知道如何管理多个节点来完成扩展和实现高可用性。意味应用不需要做任何的改动。 Gateway,代表ES索引的持久化存储方式。在Gateway中,ES默认先把索引存储在内存中,然后当内存满的时候,再持久化到Gateway里。当ES集群关闭或重启的时候,它就会从Gateway里去读取索引数据。比如LocalFileSystem和HDFS、AS3等。 DistributedLucene Directory,它是Lucene里的一些列索引文件组成的目录。它负责管理这些索引文件。包括数据的读取、写入,以及索引的添加和合并等。 River,代表是数据源。是以插件的形式存在于ES中。  Mapping,映射的意思,非常类似于静态语言中的数据类型。比如我们声明一个int类型的变量,那以后这个变量只能存储int类型的数据。比如我们声明一个double类型的mapping字段,则只能存储double类型的数据。 Mapping不仅是告诉ES,哪个字段是哪种类型。还能告诉ES如何来索引数据,以及数据是否被索引到等。 Search Moudle,搜索模块,支持搜索的一些常用操作 Index Moudle,索引模块,支持索引的一些常用操作 Disvcovery,主要是负责集群的master节点发现。比如某个节点突然离开或进来的情况,进行一个分片重新分片等。这里有个发现机制。 发现机制默认的实现方式是单播和多播的形式,即Zen,同时也支持点对点的实现。另外一种是以插件的形式,即EC2。 Scripting,即脚本语言。包括很多,这里不多赘述。如mvel、js、python等。    Transport,代表ES内部节点,代表跟集群的客户端交互。包括 Thrift、Memcached、Http等协议 RESTful Style API,通过RESTful方式来实现API编程。 3rd plugins,代表第三方插件。 Java(Netty),是开发框架。 JMX,是监控。 使用案例 1、将ES作为网站的主要后端系统 比如现在搭建一个博客系统,对于博客帖子的数据可以直接在ES上存储,并且使用ES来进行检索,统计。ES提供了持久化的存储、统计和很多其他数据存储的特性。 注意:但是像其他的NOSQL数据存储一样,ES是不支持事务的,如果要事务机制,还是考虑使用其他的数据库做真实库。 2、将ES添加到现有系统 有些时候不需要ES提供所有数据的存储功能,只是想在一个数据存储的基础之上使用ES。比如已经有一个复杂的系统在运行,但是现在想加一个搜索的功能,就可以使用该方案。 3、将ES作为现有解决方案的后端部分 因为ES是开源的系统,提供了直接的HTTP接口,并且现在有一个大型的生态系统在支持他。比如现在我们想部署大规模的日志框架、用于存储、搜索和分析海量的事件,考虑到现有的工具可以写入和读取ES,可以不需要进行任何开发,配置这些工具就可以去运作。 设计结构 1、逻辑设计 文档 文档是可以被索引的信息的基本单位,它包含几个重要的属性: 是自我包含的。一篇文档同时包含字段和他们的取值。 是层次型的。文档中还可以包含新的文档,一个字段的取值可以是简单的,例如location字段的取值可以是字符串,还可以包含其他字段和取值,比如可以同时包含城市和街道地址。 拥有灵活的结构。文档不依赖于预先定义的模式。也就是说并非所有的文档都需要拥有相同的字段,并不受限于同一个模式 {   "name":"meeting",   "location":"office",   "organizer":"yanping" } {   "name":"meeting",   "location":{     "name":"sheshouzuo",        "date":"2019-6-28"   },   "memebers":["leio","shiyi"] } 类型 类型是文档的逻辑容器,类似于表格是行的容器。在不同的类型中,最好放入不同的结构的文档。 字段 ES中,每个文档,其实是以json形式存储的。而一个文档可以被视为多个字段的集合。 映射 每个类型中字段的定义称为映射。例如,name字段映射为String。 索引 索引是映射类型的容器一个ES的索引非常像关系型世界中的数据库,是独立的大量文档集合。   关系型数据库与ES的结构上的对比 2、物理设计 节点 一个节点是一个ES的实例,在服务器上启动ES之后,就拥有了一个节点,如果在另一个服务器上启动ES,这就是另一个节点。甚至可以在一台服务器上启动多个ES进程,在一台服务器上拥有多个节点。多个节点可以加入同一个集群。 当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。这个过程如下图所示: 节点主要有3种类型,第一种类型是client_node,主要是起到请求分发的作用,类似路由。第二种类型是master_node,是主的节点,所有的新增,删除,数据分片都是由主节点操作(elasticsearch底层是没有更新数据操作的,上层对外提供的更新实际上是删除了再新增),当然也能承担搜索操作。第三种类型是date_node,该类型的节点只能做搜索操作,具体会分配到哪个date_node,就是由client_node决定,而data_node的数据都是从master_node同步过来的 分片 一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。   为了解决这个问题,ES提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。 分片之所以重要,主要有两方面的原因:   1、允许你水平分割/扩展你的内容容量 允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量 至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由ES管理的,对于作为用户的你来说,这些都是透明的。   2、在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了。这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,ES允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。 复制之所以重要,主要有两方面的原因: (1)在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。 (2)扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行 总之,每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制数量,但是不能改变分片的数量。   默认情况下,ES中的每个索引被分片5个主分片和1个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。一个索引的多个分片可以存放在集群中的一台主机上,也可以存放在多台主机上,这取决于你的集群机器数量。主分片和复制分片的具体位置是由ES内在的策略所决定的。 3、插件HEAD elasticsearch-head是一个界面化的集群操作和管理工具 ● node:即一个 Elasticsearch 的运行实例,使用多播或单播方式发现 cluster 并加入。 ● cluster:包含一个或多个拥有相同集群名称的 node,其中包含一个master node。 ● index:类比关系型数据库里的DB,是一个逻辑命名空间。 ● alias:可以给 index 添加零个或多个alias,通过 alias 使用index 和根据index name 访问index一样,但是,alias给我们提供了一种切换index的能力,比如重建了index,取名● customer_online_v2,这时,有了alias,我要访问新 index,只需要把 alias 添加到新 index 即可,并把alias从旧的 index 删除。不用修改代码。 ● type:类比关系数据库里的Table。其中,一个index可以定义多个type,但一般使用习惯仅配一个type。 ● mapping:类比关系型数据库中的 schema 概念,mapping 定义了 index 中的 type。mapping 可以显示的定义,也可以在 document 被索引时自动生成,如果有新的 field,Elasticsearch 会自动推测出 field 的type并加到mapping中。 ● document:类比关系数据库里的一行记录(record),document 是 Elasticsearch 里的一个 JSON 对象,包括零个或多个field。 ● field:类比关系数据库里的field,每个field 都有自己的字段类型。 ● shard:是一个Lucene 实例。Elasticsearch 基于 Lucene,shard 是一个 Lucene 实例,被 Elasticsearch 自动管理。之前提到,index 是一个逻辑命名空间,shard 是具体的物理概念,建索引、查询等都是具体的shard在工作。shard 包括primary shard 和 replica shard,写数据时,先写到primary shard,然后,同步到replica shard,查询时,primary 和 replica 充当相同的作用。replica shard 可以有多份,也可以没有,replica shard的存在有两个作用,一是容灾,如果primary shard 挂了,数据也不会丢失,集群仍然能正常工作;二是提高性能,因为replica 和 primary shard 都能处理查询。另外,如上图右侧红框所示,shard数和replica数都可以设置,但是,shard 数只能在建立index 时设置,后期不能更改,但是,replica 数可以随时更改。但是,由于 Elasticsearch 很友好的封装了这部分,在使用Elasticsearch 的过程中,我们一般仅需要关注 index 即可,不需关注shard。   shard、node、cluster 在物理上构成了 Elasticsearch 集群,field、type、index 在逻辑上构成一个index的基本概念,在使用 Elasticsearch 过程中,我们一般关注到逻辑概念就好,就像我们在使用MySQL 时,我们一般就关注DB Name、Table和schema即可,而不会关注DBA维护了几个MySQL实例、master 和 slave 等怎么部署的一样。 ES中的索引原理 (1)传统的关系型数据库 二叉树查找效率是logN,同时插入新的节点不必移动全部节点,所以用树型结构存储索引,能同时兼顾插入和查询的性能。因此在这个基础上,再结合磁盘的读取特性(顺序读/随机读),传统关系型数据库采用了B-Tree/B+Tree这样的数据结构做索引 (2)ES 采用倒排索引 那么,倒排索引是个什么样子呢? 首先,来搞清楚几个概念,为此,举个例子: 假设有个user索引,它有四个字段:分别是name,gender,age,address。画出来的话,大概是下面这个样子,跟关系型数据库一样 Term(单词):一段文本经过分析器分析以后就会输出一串单词,这一个一个的就叫做Term Term Dictionary(单词字典):顾名思义,它里面维护的是Term,可以理解为Term的集合 Term Index(单词索引):为了更快的找到某个单词,我们为单词建立索引 Posting List(倒排列表):倒排列表记录了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。(PS:实际的倒排列表中并不只是存了文档ID这么简单,还有一些其它的信息,比如:词频(Term出现的次数)、偏移量(offset)等,可以想象成是Python中的元组,或者Java中的对象) (PS:如果类比现代汉语词典的话,那么Term就相当于词语,Term Dictionary相当于汉语词典本身,Term Index相当于词典的目录索引) 我们知道,每个文档都有一个ID,如果插入的时候没有指定的话,Elasticsearch会自动生成一个,因此ID字段就不多说了 上面的例子,Elasticsearch建立的索引大致如下: name字段: age字段: gender字段: address字段: Elasticsearch分别为每个字段都建立了一个倒排索引。比如,在上面“张三”、“北京市”、22 这些都是Term,而[1,3]就是Posting List。Posting list就是一个数组,存储了所有符合某个Term的文档ID。 只要知道文档ID,就能快速找到文档。可是,要怎样通过我们给定的关键词快速找到这个Term呢? 当然是建索引了,为Terms建立索引,最好的就是B-Tree索引(MySQL就是B树索引最好的例子)。 我们查找Term的过程跟在MyISAM中记录ID的过程大致是一样的 MyISAM中,索引和数据是分开,通过索引可以找到记录的地址,进而可以找到这条记录 在倒排索引中,通过Term索引可以找到Term在Term Dictionary中的位置,进而找到Posting List,有了倒排列表就可以根据ID找到文档了 (PS:可以这样理解,类比MyISAM的话,Term Index相当于索引文件,Term Dictionary相当于数据文件) (PS:其实,前面我们分了三步,我们可以把Term Index和Term Dictionary看成一步,就是找Term。因此,可以这样理解倒排索引:通过单词找到对应的倒排列表,根据倒排列表中的倒排项进而可以找到文档记录) 为了更进一步理解,用两张图来具现化这一过程: (至于里面涉及的更加高深的数据压缩技巧,以及多个field联合查询利用跳表的数据结构快速做运算来查询,这些大家有兴趣可以自己去了解)

问问小秘 2020-04-29 15:40:48 0 浏览量 回答数 0

问题

【Java问答学堂】9期 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?

剑曼红尘 2020-04-27 14:35:38 0 浏览量 回答数 1

回答

如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。 那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE INDEX创建FULLTEXT索引,要比先为一张表建立FULLTEXT然后再将数据写入的速度快很多。 全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。在没有全文索引之前,这样一个查询语句是要进行遍历数据表操作的,可见,在数据量较大时是极其的耗时的,如果没有异步IO处理,进程将被挟持,很浪费时间,当然这里不对异步IO作进一步讲解,想了解的童鞋,自行谷哥。 全文索引的使用方法并不复杂: 创建ALTER TABLE table ADD INDEX FULLINDEX USING FULLTEXT(cname1[,cname2…]); 使用SELECT * FROM table WHERE MATCH(cname1[,cname2…]) AGAINST ('word' MODE ); 其中, MODE为搜寻方式(IN BOOLEAN MODE ,IN NATURAL LANGUAGE MODE ,IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION)。 关于这三种搜寻方式,愚安在这里也不多做交代,简单地说,就是,布尔模式,允许word里含一些特殊字符用于标记一些具体的要求,如+表示一定要有,-表示一定没有,*表示通用匹配符,是不是想起了正则,类似吧;自然语言模式,就是简单的单词匹配;含表达式的自然语言模式,就是先用自然语言模式处理,对返回的结果,再进行表达式匹配。 对搜索引擎稍微有点了解的同学,肯定知道分词这个概念,FULLTEXT索引也是按照分词原理建立索引的。西文中,大部分为字母文字,分词可以很方便的按照空格进行分割。但很明显,中文不能按照这种方式进行分词。那又怎么办呢?这个向大家介绍一个Mysql的中文分词插件Mysqlcft,有了它,就可以对中文进行分词,想了解的同学请移步Mysqlcft,当然还有其他的分词插件可以使用。 HASH Hash这个词,可以说,自打我们开始码的那一天起,就开始不停地见到和使用到了。其实,hash就是一种(key=>value)形式的键值对,如数学中的函数映射,允许多个key对应相同的value,但不允许一个key对应多个value。正是由于这个特性,hash很适合做索引,为某一列或几列建立hash索引,就会利用这一列或几列的值通过一定的算法计算出一个hash值,对应一行或几行数据(这里在概念上和函数映射有区别,不要混淆)。在java语言中,每个类都有自己的hashcode()方法,没有显示定义的都继承自object类,该方法使得每一个对象都是唯一的,在进行对象间equal比较,和序列化传输中起到了很重要的作用。hash的生成方法有很多种,足可以保证hash码的唯一性,例如在MongoDB中,每一个document都有系统为其生成的唯一的objectID(包含时间戳,主机散列值,进程PID,和自增ID)也是一种hash的表现。额,我好像扯远了-_-! 由于hash索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。那为什么还需要其他的树形索引呢? 在这里愚安就不自己总结了。引用下园子里其他大神的文章:来自 14的路 的MySQL的btree索引和hash索引的区别 (1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。 由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。 (2)Hash 索引无法被用来避免数据的排序操作。 由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算; (3)Hash 索引不能利用部分索引键查询。 对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。 (4)Hash 索引在任何时候都不能避免表扫描。 前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。 (5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。 对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。 愚安我稍作补充,讲一下HASH索引的过程,顺便解释下上面的第4,5条: 当我们为某一列或某几列建立hash索引时(目前就只有MEMORY引擎显式地支持这种索引),会在硬盘上生成类似如下的文件: hash值 存储地址 1db54bc745a1 77#45b5 4bca452157d4 76#4556,77#45cc… … hash值即为通过特定算法由指定列数据计算出来,磁盘地址即为所在数据行存储在硬盘上的地址(也有可能是其他存储地址,其实MEMORY会将hash表导入内存)。 这样,当我们进行WHERE age = 18 时,会将18通过相同的算法计算出一个hash值==>在hash表中找到对应的储存地址==>根据存储地址取得数据。 所以,每次查询时都要遍历hash表,直到找到对应的hash值,如(4),数据量大了之后,hash表也会变得庞大起来,性能下降,遍历耗时增加,如(5)。 BTREE BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中,相信学过数据结构的童鞋都对当初学习二叉树这种数据结构的经历记忆犹新,反正愚安我当时为了软考可是被这玩意儿好好地折腾了一番,不过那次考试好像没怎么考这个。如二叉树一样,每次查询都是从树的入口root开始,依次遍历node,获取leaf。 BTREE在MyISAM里的形式和Innodb稍有不同 在 Innodb里,有两种形态:一是primary key形态,其leaf node里存放的是数据,而且不仅存放了索引键的数据,还存放了其他字段的数据。二是secondary index,其leaf node和普通的BTREE差不多,只是还存放了指向主键的信息. 而在MyISAM里,主键和其他的并没有太大区别。不过和Innodb不太一样的地方是在MyISAM里,leaf node里存放的不是主键的信息,而是指向数据文件里的对应数据行的信息. RTREE RTREE在mysql很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。 相对于BTREE,RTREE的优势在于范围查找. 各种索引的使用情况 (1)对于BTREE这种Mysql默认的索引类型,具有普遍的适用性 (2)由于FULLTEXT对中文支持不是很好,在没有插件的情况下,最好不要使用。其实,一些小的博客应用,只需要在数据采集时,为其建立关键字列表,通过关键字索引,也是一个不错的方法,至少愚安我是经常这么做的。 (3)对于一些搜索引擎级别的应用来说,FULLTEXT同样不是一个好的处理方法,Mysql的全文索引建立的文件还是比较大的,而且效率不是很高,即便是使用了中文分词插件,对中文分词支持也只是一般。真要碰到这种问题,Apache的Lucene或许是你的选择。 (4)正是因为hash表在处理较小数据量时具有无可比拟的素的优势,所以hash索引很适合做缓存(内存数据库)。如mysql数据库的内存版本Memsql,使用量很广泛的缓存工具Mencached,NoSql数据库redis等,都使用了hash索引这种形式。当然,不想学习这些东西的话Mysql的MEMORY引擎也是可以满足这种需求的。 (5)至于RTREE,愚安我至今还没有使用过,它具体怎么样,我就不知道了。有RTREE使用经历的同学,到时可以交流下! 答案来源于网络

养狐狸的猫 2019-12-02 02:18:32 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站