72
回答
高手问答第 179 期 —— 全文检索技术分享:从 Lucene 到 Elasticsearch
开发十年,就只剩下这套Java开发体系了   

OSCHINA 本期高手问答(11 月 29 日 - 12 月 5 日)我们请来了@napoay 姚攀为大家解答关于全文检索技术的问题。

姚攀,中国科学院大学硕士,热爱撰写技术博客、翻译文档。研究生期间因选修信工所王斌老师的信息检索课程而接触了搜索技术,对搜索技术的底层原理有着深刻的理解,熟悉信息检索模型、搜索技术、Lucene、Elasticsearch、ELK 日志处理、ES—Hadoop 等搜索技术栈,实现过基于 Lucene 的文件检索项目、基于 Elasticsearch 的新闻搜索项目、ELK 日志处理项目。

这是一个大数据时代,但我们应该认识到大数据不仅仅是指海量数据,更多的是指这些数据都是非结构化的、无法用传统的方法进行处理的数据。因此,掌握大数据的分析工具显得十分有必要。

Elasticsearch 是一个分布式的全文检索引擎,也是大数据分析的热门工具。说到 Elasticsearch,就不得不提 Lucene,Lucene 是一个全文检索类库,Elasticsearch 则是一个建立在 Lucene 基础上的实时的分布式搜索引擎。要投身搜索技术领域,它们都是绕不开的。

本期问答内容:

  1. 分布式全文检索引擎 Elasitcsearch
  2. 全文检索引擎 Lucene
  3. 如何入门全文检索领域
  4. 全文检索领域的相关算法
  5. 如何选择合适的技术栈(Lucene、Apache Solr 或 Elasticsearch 等)
  6. 搭建全文检索系统

或有其他相关问题,也欢迎大家积极提问!

为了鼓励踊跃提问,@napoay 会在问答结束后从提问者中抽取 5 名幸运会员赠予《从 Lucene 到 Elasticsearch:全文检索实战》一书。

>>>点击这里进入购买地址

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就全文检索技术方面的问题向@napoay 姚攀提问,请直接回帖提问。

举报
局长
发帖于11个月前 72回/6K+阅
共有72个答案 最后回答: 2个月前

高手问答第 179 期 —— 全文检索技术分享:从 Lucene 到 Elasticsearch

@Contac @jetliu1987 @zhoujianwei @Eviltuzki @momisabuilder

恭喜以上五位用户获得《从 Lucene 到 Elasticsearch:全文检索实战》图书一本

请尽快私信@局长 告知快递信息(格式:姓名+电话+地址),感谢支持~

--- 共有 1 条评论 ---
bboss给大家推荐一个不错的Elasticsearch java 客户端框架: https://my.oschina.net/bboss/blog/1556866 10个月前 回复

@napoay 全文检索领域的相关算法这一块有什么好方案吗?还是要结合场景来?

还有 Elasticsearch 中统计中多维度(每一个维度的基数非常大,几百万甚至上千万)的term聚合统计时,这个share_size很难设置,设置小了统计不准确,大了非常的耗内存导致查询缓慢,这个有什么好的建议?

--- 共有 2 条评论 ---
jetliu1987 回复 @寻梦2012 : 关键是要有搜索功能,kylin研究过,不适合我们场景。 10个月前 回复
寻梦2012这个建议你用kylin 10个月前 回复

@napoay 老师,你好。我的问题有:1. 对于 es 创建 mapping 的时候,,需要指定 shard 数量,如何动态的调整 这个分片的数量?

 

2. 我尝试过,使用 Spark 将结果数据入库到  ES 中,由于我的并行度比较高,入库 ES的时候,直接 ES 那边造成了  java.lang.OutOfMemoryError: Direct buffer memory   ,  对于 ES 的  jvm opts ,请问有什么计算比例可以推荐的吗?

--- 共有 2 条评论 ---
Ryan-瑞恩 回复 @napoay : 只是能收缩,不能动态扩展吗??如果是收缩的话,是不是回带来大量的数据迁移工作? 10个月前 回复
napoay第一个问题:分片是为了加快查询的,分片一旦创建就无法修改。高版本的ES有_shrink API,可以对索引进行收缩。 11个月前 回复

@napoay 从HDFS到Elasticsearch,我们现在在玩 solr  on yarn 模式,索引写在了 hdfs 上,但我们发现,索引 写 hdfs 会有超多小文件的问题,,不知道你们是如何解决的? 索引要是有文件丢失,好像是全部找不回来了,你们如何规避这个风险?

--- 共有 2 条评论 ---
Ryan-瑞恩 回复 @napoay : 对于 ES 的内存配置,现在大多都用的 G1 吗?你们对 JVM 是如何最优化利用的? 10个月前 回复
napoay不好意思,我主要熟悉底层原理、Lucene、和基于Lucene的ES。Solr也是基于Lucene的,只是我没用过,不太熟。 11个月前 回复

@napoay  Elasticsearch有自然语言处理模块,在中文方面效果如何?该如何下手?需要注意些什么?感谢!

--- 共有 1 条评论 ---
渐入佳境CoderIKAnalyzer分词效果基本还是可以的,可以定制自己的词典和停用词 11个月前 回复

@napoay 我之前看了一遍elasticsearch2.3的官方文档,但是没实践 看起来比较空,有没有什么关于这方面的开源框架可以实践的?

--- 共有 1 条评论 ---
napoayElasticsearch已经是基于Lucene的分布式的搜索引擎了,基于RESTFul API,建议您多了解底层。 11个月前 回复

@napoay

@napoay

ES2.4在3000W+文档中进行morelikethis查询,速度普遍在10秒上下,机器配置已经比较高了(3台8核64G DATA 节点,3台32G 8 核Master节点 ,2台Client 64G 8核 )暂时无条件上SSD,这个情况下,如何能提高morelikethis查询的速度?已经进行了segments合并,refresh已经禁用(因为导入数据之后暂时不会index新的数据),求解有效方法提升性能。

--- 共有 2 条评论 ---
Eviltuzki 回复 @光脚满地跑 : 公司层面现在应该是不可能上SSD,数据扫描范围你说的应该是通过Route吧?可是我现在始终无法找到一个合适的route方法,因为通过已知的每个字段进行route都是数据分布不平均,可能一个几千,一个几百万,route这条路线感觉走不通 10个月前 回复
光脚满地跑1.尝试评估一下硬件瓶颈,如果是磁盘IO的话,可以在测试环境上使用SSD验证下,有奇效,3000w数据应该可以搭的起来。 2.需求角度,尝试缩减数据扫描范围? 数据结构和ES配置方向,没做深入研究 10个月前 回复

@napoay 你好。首先恭喜你新书出版。借此机会向请教您2个一直困惑我的问题,如果可以,望指教。

 

1、比如有一个总数据量大小为1TB的数据,ES的集群节点数多少比较合适?每一个节点物理如何配置(CPU\内存)性价比比较高?数据节点、主节点和路由(客户)节点数量上如何分配?数据分片个数如何分配?上述分配以您的经验有何计算方式了?

 

2、相对数据中存在多语系的描述,比如通一个索引中的字段存在中、英、俄、越、韩、日等语系,如何配置相关分词,或者说其他解决方案。

谢谢

引用来自“Contac”的评论

@napoay 你好。首先恭喜你新书出版。借此机会向请教您2个一直困惑我的问题,如果可以,望指教。

 

1、比如有一个总数据量大小为1TB的数据,ES的集群节点数多少比较合适?每一个节点物理如何配置(CPU\内存)性价比比较高?数据节点、主节点和路由(客户)节点数量上如何分配?数据分片个数如何分配?上述分配以您的经验有何计算方式了?

 

2、相对数据中存在多语系的描述,比如通一个索引中的字段存在中、英、俄、越、韩、日等语系,如何配置相关分词,或者说其他解决方案。

谢谢

首先,第一个问题,1TB的数据用多少个节点,首先取决于您的硬件的CPU、内存、磁盘大小。单节点内存不要超过31G。Master 节点为了避免脑裂可以设为N/2+1(N)为总节点数。分片数呢,根据单索引的数据大小/10G。 同样是1万条文档,复杂度、内容不一样,存储空间肯定也是不一样的。可以拿出来一部分数据做测试,然后放大去估计。另外,数据不是一层不变的,ES支持动态扩展,自动平衡数据,可以根据业务动态加节点。

 

第二个需求没有遇到过,我理解您的需求:"content":"中、英、俄、越、韩、日",想对content字段做搜索。IK可以解决中英,其它语种找不同的索引做多个字段拷贝吧。这个确实没有实践过。

顶部