Solrの
1、簡単にSolrの
Solrには、JavaベースのLuceneのフルテキスト検索、エンタープライズクラスのオープンソースプラットフォームを開発している、それは使用しています転置インデックス文書を処理するためのキーワードをマップします。Solrのリソースは、オブジェクトストレージを文書化するために、各文書は一連のフィールドで構成され、各リソースの属性を表します。ドキュメントは、高性能の検索効率を提供するために、フィールドをインデックス化することができます。通常の状況下では、文書を一意に文書のidフィールドを表し含まれて??
2、Solrのの転置インデックスを教えて
転置インデックスを伝える前に、のは転置インデックスには、いくつかの用語を説明しましょう:
- 文書(ドキュメント):一般的なインターネット検索エンジンのページを処理しますが、文書の上位概念に、テキスト形式で存在することを表すオブジェクトを格納するページに比べて、そのような言葉、PDF、XMLなどの複数の形態をカバー、異なるフォーマットでHTMLや他のファイルは、ドキュメントを参照することができます。
- 文書コレクション(文書コレクション):文書のコレクションと呼ばいくつかの文書で構成されたセット。例えば、インターネットページや電子メールの洪水は、文書のコレクションの具体例が多数あります。
- 資料番号(文書ID) :内部検索エンジンは、あろう各文書は一意の内部番号、一意にこの文書を識別するための番号が割り当てられる設定文書で、内部処理やすいので、各ドキュメントの内部番号を文書番号を表現するために便利なのDocIDを使用して以下、「文書番号」と呼ばれます。
原則転置インデックス:
仮定する文書コレクションは、5つのドキュメント、列行の左端図において、各文書に対応する文書番号が示されるように、各文書の内容を含みます。私たちの仕事は、このドキュメントセット転置インデックスに構築することです。
異なる中国語と英語と他の言語は、そこに単語の間には明確な区切り文字ではありませんので、自動的に単語列に文書を削減する最初の単語を使用しています。Solrのワードブレーカは、IKアナライザ中国ワードブレーカがされています。各文書は、単語のシーケンスから成るデータ・ストリームによって変換されるように、そのようなプロセスの終了時に、単語を含む下文書を記録しながら、後続の処理システムを容易にするために、それぞれ異なるワードワードの一意の番号を与える必要があり、我々これは、インデックスを反転させることができます。
簡単な要約:逆索引レコードには単語、およびすべての文書のIDのリストの存在の言葉です。クエリ率を想像することができ、このようなインデックス構造を格納するところで。
Solrの持つ文書の内容は、インデックスキーの二分法とソート番号が一致して、その後、インデックスとして、単語分割が行われたが付属して、誠司は、対応する文書を見つけます。
3、ソートアルゴリズムと検索アルゴリズム
時間の一般的なソートアルゴリズムの複雑さと空間の複雑さ
整理 | 最悪の時間分析 | 平均時間の複雑さ | 安定 | 宇宙複雑 |
---|---|---|---|---|
バブルソート | O(N2) | O(N2) | 安定しました | O(1) |
挿入ソート | O(N2) | O(N2) | 安定しました | O(1) |
選択ソート | O(N2) | O(N2) | 安定しました | O(1) |
バイナリツリーの並べ替え | O(N2) | (nlog2n) | そうとも限りません | O(n) |
クイックソート | O(N2) | (nlog2n) | 不安定な | O(log2n)~O(n) |
ヒープソート | (nlog2n) | (nlog2n) | 不安定な | O(1) |
シェルソート | ザ・ | ザ・ | 不安定な | O(1) |
アルゴリズムの時間計算を探します
求めます | 平均時間の複雑さ | 検索条件 | アルゴリズムの説明 |
---|---|---|---|
シーケンシャル検索 | O(n) | 無秩序または秩序キュー | あなたがこれまでのキーワードを見つけるまで順番に各要素を比較します |
バイナリサーチ(バイナリサーチ) | O(LOGN) | 秩序配列 | 中間要素は、要素がちょうど探している場合、アレイ素子の中央からの検索処理は、検索処理は、要素を終了する。特定の要素は、アレイ内の中間要素は、中間要素ルックアップの半分より大きいまたは小さいより大きいまたは小さい場合そして中央の要素で同じスタートと比較し始めます。配列は、いくつかの段階で空の場合、それが見つかりません表しています。 |
バイナリ・ソートの木を探します | O(LOGN) | バイナリソートツリー | バイナリ検索ツリー内のxを探す手順bである:bは空の木である場合、検索は失敗し、ルートノードのデータフィールドのb値が、その後、検索が成功した場合、xが2である; 3、xがbより小さければ...データのルートドメインの値が、その後、左のサブツリーを検索; 4.右のサブツリーを検索します。 |
法律・ハッシュ・テーブル(ハッシュテーブル) | O(1) | まず、ハッシュテーブル(ハッシュテーブル)を作成します | (キー値)測位データ要素は、ハッシュ関数を介して方法を見つけるために、キーに基づきます。 |
ブロック検索 | O(LOGN) | 無秩序または秩序キュー | 将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,然后使用二分查找及顺序查找。 |
4、为什么要使用 Solr
当我们访问项目邮轮旅游模块的热门航线搜索时的时候,我们可以根据我们随意所想的内容输入关键字就可以查找到相关的内容。之所以能够如愿查找出来,是因为 solr 全文检索工具的实现。由于 solr 是基于 Lucene 实现的,而 Lucene 采用了次元匹配和切分词。举个例子:厦门-日本,Lucene 的切分词可以切分成:厦门、日本、厦日、日门等词,所以我们搜索的时候都是能够所搜得到的。solr 还有一种专门是切分中文的分词器叫 IKAnalyzer。
5、Solr 和 Elasticsearch 的区别?
共同点:
Solr 和 Elasticsearch 都是基于全文搜索引擎 Lucene 实现的。
不同点:
- Solr 利用 zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
- Solr 比 Elasticsearch 实现更加全面,Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多由第三方插件提供;
- Solr 查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用,ES建立索引快(即查询慢),即实时性查询快,用于facebook新浪等搜索;
- Solr 支持更多格式的数据,而 Elasticsearch 仅支持 json 文件格式;
- Solr 在传统的搜索应用中表现好于 Elasticsearch,而 Elasticsearch 在实时搜索应用方面比 solr 表现好!
实时搜索:
实时搜索是说用户对于搜索的结果是实时变化的。
传统搜索:
传统搜索是从静态数据库中筛选出符合条件的结果,这种结果往往是不可变的、静态的。
Memcached
许多 Web 应用都将数据保存到数据库中,应用服务器从中读取数据并在浏览器中显示。随着应用系统业务量的增长和用户的增加,对数据库的访问更加频繁和集中,服务器的压力越来越大、性能逐渐下降,会出现网页显示延迟甚至服务器崩溃等重大影响。这时就该是用 Memcached 了,通过减少数据库的访问次数,以提高动态 Web 应用的速度、提高可扩展性。
1、Memcached 简介
memcached 是一个高性能的分布式内存缓存服务器,用于动态 Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态 Web 的速度、提高可扩展性。memcached 基于一个存储键/值对的 HashMap。
2、Memcached 分布式算法
(1) 余数哈希
根据服务器台数的余数进行哈希,求得键的哈希值,再处理服务器台数,根据余数选择服务器。
缺点:当添加或者一处服务器时,缓存重组的代价太大。当添加服务器,要进行重哈希,会导致原来的服务器序号变了,下一次找不到访问数据,Memcached 命中率下降,那么就增加了数据库服务器的负载。
(2) 一致性哈希
一致性哈希是将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数 H 的值空间是 0~(2^32 - 1) (即哈希值是一个 32 位的无符号整型),这个哈希空间为环。然后让每台机器站一个扇形空间。
先算每台服务器(节点)的hash值,然后将这些值映射到一个0到2^32次方的圆上。
计算存储数据的key的hash值,然后将这个值同样也映射到服务器分布的圆上,然后顺时针查找,将数据保存到查找到的第一个服务器。
采用一致性Hash算法,这样在添加一个服务器节点的时候。就只会影响增加服务器的地点逆时针方向的第一台服务器受影响。
一致性Hash最大限度地抑制了键的重新分布。使用一般的hash函数的话,服务器的映射地点的分布非常不均匀。因此,使用虚拟节点的思想,为每个物理节点(服务器)在圆上分配 100~200 个点。这样就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。
采用一致性Hash算法的情况下,由N台服务器增加M台服务器后,缓存的命中率为(1-N/(N+M))*100。
举例:
余数哈希相当于一个萝卜一个坑,刚好全部装下。这时候在中间新挖一个坑,下一次去拿的时候会按照原有的逻辑拿,会导致最后一个萝卜的坑没有被拿到,丢失了。一致性哈希就是在这 100 米以内都来挖这个坑,100 米之后的去下一个坑,这时候新挖一个坑,重新调整一些空间给新的坑就行,不至于数据全部丢失。
3、Memcached 的数据清除算法
LRU。每个 slab 会维护一个队列,刚插入的数据在队头,经常 get 的数据也会移动到队头,这样较老或者访问较少的数据在队尾。该算法从队尾开始淘汰。当 slab 分配不到足够的内存是,首先会检查队尾是否有过期数据,如果有的话会直接将其覆盖为新的对象,如果没有,会开始淘汰队尾的对象。
slab 是一个内存块,它是 memcached 一次申请内存的最新单位。slab 的大小固定为 1M (1048576 Byte),一个 slab 由若干个大小相对的 chunk 组成。每个 chunk 都保存了一个 item 结构体、一堆 key 和 value。
4、Memcached 内存管理机制
Slab Allocation 的原理相当简单。它首先从操作系统申请一大块内存,并将其分割成各种尺寸的块 Chunk,并把尺寸相同的块分成组 Slab Class。其中,Chunk就是用来存储 key-value 数据的最小单位。每个 Slab Class 的大小,可以在 Memcached 启动的时候通过制定 Growth Factor 来控制。假定下图中 Growth Factor 的取值为 1.25,所以如果第一组 Chunk 的大小为 88 个字节,第二组 Chunk 的大小就为 112 个字节,依此类推。
当 Memcached 接收到客户端发送过来的数据时首先会根据收到数据的大小选择一个最合适的 Slab Class,然后通过查询 Memcached 保存着的该 Slab Class 内空闲 Chunk 的列表就可以找到一个可用于存储数据的Chunk。当一条数据库过期或者丢弃时,该记录所占用的 Chunk 就可以回收,重新添加到空闲列表中。从以上过程我们可以看出 Memcached 的内存管理制效率高,而且不会造成内存碎片,但是它最大的缺点就是会导致空间浪费。因为每个 Chunk都分配了特定长度的内存空间,所以变长数据无法充分利用这些空间。如图所示,将 100 个字节的数据缓存到 128 个字节的 Chunk 中,剩余的 28 个字节就浪费掉了。
5、描述一下 Memcached 的工作流程
- 先检查客户端的请求数据是否在 Memcached 中,如有,直接把请求数据返回,不再对数据进行任何操作;
- 如果不在 Memcached 中,就去数据库中查找,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到 Memcached 中(Memcached 客户端不负责,需要程序明确实现);
- 没次更新数据可的同时更新 Memcached 中的数据,保证一致性;
- 当分配给 Memcached 内存空间用完后,会使用 LRU(Least Recently Used,最近最少使用) 策略加上到期失效策略,失效数据会首先被替换,然后再替换掉最近未使用的数据。
Redis 和 Memcached:什么时候选择 Redis,什么时候选择 Memcached?
有持久化需求或者对数据结构和处理有高级要求的应用,选择 Redis,其他简单的 key/value 存储,选择 Memcached。对于两者的选择需要看具体的应用场景,如果需要缓存的数据只是 key-value 这样简单的结构是,则还是采用 Memcached,它也足够的稳定可靠。如果涉及到存储、排序等一系列复杂的操作时,毫无疑问是 Redis。
Redis 和 memcached 有什么区别?为什么单线程的 Redis 比多线程的 memcached 效率要高得多(为什么 Redis 是单线程的但是还可以支撑高并发)?参考链接
区别:
- Redis 不仅支持简单的 k/v 类型的数据,同时还提供 String、List、Set、zset(sorted set 一一有序集合) 和 Hash 等数据结构的存储。Memcached 支持简单的数据类型,String。
- Redis 支持数据备份,即 Master-Slave 模式的数据备份。
- Redis 支持数据持久化,可以将内存中的数据保存在磁盘中,重启时可以再次加载进行使用;而 Memcached 把数据全部存在内存中。
- Redis 的速度比 Memcached 快很多。
- Memcached 是多线程、非阻塞 IO 复用的网络模型;Redis 使用单线程的 IO 复用模型。