Talk is Cheap, Show me the Code! <<网站首页文章列表

  • 择其善而从之——我为什么开始学习ElasticSearch

    人生天地之间,若白驹之过隙,忽然而已。 感慨刚毕业与同学合租打网游的场景仿佛还在眼前,现在参加工作都已经九年了,这时间流逝的速度一点不亚于“过隙白驹”啊!九年时间,我工作过三家公司,包括现在这家,三家公司的工作时间分别是一年、四年、4年。像我这个跳槽频率,应该可以算低了,特别是我们这一行。而且,其中有八年时间我都专注于Java领域的搜索引擎开发;往细节说,就是专注于垂直领域的基于Solr的搜索引擎开发。所以,在“Solr应用于垂直搜索”这个领域,我应该可以算得上专家了,至少时间上差不多够到专家门槛了。来现在这家公司之前,面试过几个公司,对我的技术和业务能力还算认可,不过他们都要求我转ElasticSearch。关于这个ES,我也是听说过,只是没用过。所以我问他们,为什么选这个框架而不是Solr(之所以这么问,有一部原因是我一直使用的Solr居然被人看不起)?是基于数据量考量还是基于功能考量。大部分人都没有颇具说服力的理由,主要的原因有以下几条:1. ElasticSearch 是一个分布式搜索引擎框架,分布式又是互联网热门词汇2. ElasticSearch 实时性比较好3. ElasticSearch 支持的数据量更大4. ElasticSearch 查询性能更高,尤其是大数据量的时候但是一问具体有测试报告或者自己做过测试没有,都说没有。问号脸???没有调查就么有发言权。当时针对这几个理由,我也无力反驳,谁叫我不懂ElasticSearch呢。----- 理性分析不过话说回来,为什么我遇到的公司的技术负责人选技术这么随意呢?ElasticSearch 能搭上分布式的船就选它?分布式自带大数据属性,所以就是一个互联网公司了?而且部署了支持大数据的分布式搜索引擎的互联网公司?暂且不纠结是不是面试官不屑于跟我说明具体

    ElasticSearch   ES   Solr   搜索引擎   2019-10-12 浏览(187) 阅读原文>>
  • 搜索引擎入门——启动第一个Solr应用

    零、关于Solr摘自维基百科: Solr(读作“solar”)是[Apache Lucene](https://zh.wikipedia.org/wiki/Lucene)项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr是最流行的企业级搜索引擎,Solr 4还增加了NoSQL支持。 Solr是用Java编写、运行在Servlet容器(如[Apache Tomcat](https://zh.wikipedia.org/wiki/ApacheTomcat)或Jetty)的一个独立的全文搜索服务器。 Solr采用了[Lucene](https://zh.wikipedia.org/wiki/Lucene) Java搜索库为核心的全文索引和搜索,并具有类似REST的HTTP/XML和JSON的API。 Solr强大的外部配置功能使得无需进行Java编码,便可对其进行调整以适应多种类型的应用程序。Solr有一个插件架构,以支持更多的高级定制。 因为2010年Apache Lucene和Apache Solr项目合并,两个项目是由同一个[Apache软件基金会](https://zh.wikipedia.org/wiki/Apache%E8%BD%AF%E4%BB%B6%E5%9F%BA%E9%87%91%E4%BC%9A)开发团队制作实现的。提到技术或产品时,Lucene/Solr或Solr/Lucene是一样的。 Solr的历史2004年,Solr作为CNET Networks为公司网站添加搜索功能的一个内部项目,由Yonik Seeley创建。 后来Yonik Seeley随Grant Ingersoll和Erik Hatcher创建了LucidWorks(原名Lucid Imagination),公司提供商业支持、咨询和Apache Solr搜索技术的培训。2006年1月,CNET Networks决定捐赠其到Apache软件基金会顶级项目Lucene,公开发布其源代码。像在Apache软件基金会的任何新项目一样,其进入了一个潜伏期,以助于解决组织、法律和金融问题。2007年1月,Solr结束

    Solr   Java   搜索引擎   2019-07-24 浏览(287) 阅读原文>>
  • Docker学习——创建一个JDK+Tomcat的Solr服务镜像

    前言这里没有前言,我发现网上关于Docker的介绍文章一大堆,我写的肯定没他们好。本想去官网翻一下相关重点内容,看了文档,发现自己4.5级的英文实在难以准确翻译,大伙还是直接去[Docker官网](https://www.docker.com/)吧。 Docker安装以下是Mac版本Docker安装,完全按照[官网](https://www.docker.com/get-started)指示行事。 创建Docker账号![图片](https://oomabc.com/staticsrc/img/201905/06/1557146057796cb47a1da2da6449e8eac420fa04ad2bb.jpg)它会让你创建一个Docker账号,如果有就点击“Sign In”直接登录。![图片](https://oomabc.com/staticsrc/img/201905/06/155714614472691abe3c0ffa44bfea656932230b61072.jpg) 下载Docker.dmg登录之后点击"Get started with Docker Desktop"去下载dmg文件即可安装。![图片](https://oomabc.com/staticsrc/img/201905/06/1557146634809daaf31bd3c6942b38eeb522b02d07fc6.jpg)![图片](https://oomabc.com/staticsrc/img/201905/06/1557146681391b33ae0b1104d4c1782e4657da4bc27e4.jpg)下载页面已经告诉你后续步骤了:1. 下载并安装Docker2. 克隆一个样例git3. build自己第一个镜像4. 运行这个镜像5. 推送镜像到远程仓库---- 样例测试安装好Docker之后,我们从第2个步骤开始 克隆doodle.gitbash% git clone https://github.com/docker/doodle.git正克隆到 'doodle'...remote: Enumerating objects: 36, done.remote: Counting objects: 100% (36/36), done.remote: Compressing objects: 100% (27/27), done.remote: Total 36 (delta 13), reused 27 (delta 7), pack-reused 0展开对象中: 100% (36/36), 完成.20:49 wjyuian@wjyuianMacBookPro /Users/wjyuia

    Docker   Solr   Dubbo   2019-05-10 浏览(571) 阅读原文>>
  • 搜索引擎进阶——关键字预处理模块

    前言在搜索引擎的两个阶段会用到分词功能,分别是索引和查询。先说一下个人在垂直搜索引擎常用的索引分词设置(针对IK分词器)。无论采用何种分词设置,都会有一定的局限性或者说缺陷。因此在合适的阶段选择适合业务场景的分词方式才是最重要的。 索引阶段IK分词器提供了两种分词模式,通过布尔变量useSmart来设置。我在索引阶段设置useSmartfalse,其含义就是采用最小粒度分词,即会分出最多的可能的词汇(包括分词歧义词汇)。比如短语“中华人民共和国”的分词结果就是:中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、共和、国。可以看出来,这个模式下分词器会将词库中有的词全部分出来。其中“华人”这个词在短语中属于歧义词,在这个语境中是不合适的。之所以选择这个模式,是因为在索引的时候尽可能的建立更多分词的倒排索引关系链,这与全文检索的“一次索引,多次查询”的特点有关。对于这个短语来说,除了“华人”之外的其它分词能搜索到这个短语,都是合理的场景。 查询阶段我在查询阶段(也就是用户输入关键字查询结果中的分词阶段),设置了useSmarttrue。其含义是IK分词器会用其智能分词功能给你最合适的分词结果,一般来说是词语最少的结果,但是它能最大程度保留原短语的语境含义。比如短语“中华人民共和国”的分词结果就是:中华、人民共和国。这两个词就最大程度保留了语境含义,而且其输入能完美映射到索引阶段。对于,索引中出现“中华”和“人民共和国”两个词语相距很远的情况,可以通过设置查询跨度来过滤。"中华人民共和国"~2,这里的2是指两个双引号之间的短语,各个分词的起始位置之间的最大允许间隔。 在Solr的schema.xml的配置xml

    Solr   Java   分词   字典树   搜索引擎   2019-07-24 浏览(248) 阅读原文>>
  • 搜索引擎入门——solr筛选器facet的应用

    前言 搜索引擎的出现,整合了众多网站信息,恰恰起到了信息导航的作用。通用搜索引擎就如同互联网第一次出现的门户网站一样,大量的信息整合导航,极快的查询,将所有网站上的信息整理在一个平台上供网民使用,于是信息的价值第一次普遍的被众多商家认可,迅速成为互联网中最有价值的领域。互联网的低谷由此演变为第二次高峰。大家熟知的搜索引擎Google、百度、雅虎等是通用搜索引擎现如今的杰出代表,他们为互联网的发展做出了重要的贡献。然而,搜索引擎行业也不是一家公司就可以独撑天下的,从百度的上市、yahoo中国的并购一系列动作表明,如今的搜索引擎大战如同门户网站初期的竞争一样激烈。相信,通用搜索引擎在经历过一段时间的角逐后,也将会继续维持几大服务商各自分控一部分市场的局面。通用搜索引擎的性质,决定了其不能满足特殊领域、特殊人群的精准化信息需求服务。市场需求多元化决定了搜索引擎的服务模式必将出现细分,针对不同行业提供更加精确的行业服务模式。可以说通用搜索引擎的发展为垂直搜索引擎的出现提供了良好的市场空间,势必将出现垂直搜索引擎在互联网中占据部分市场的趋势,也是搜索引擎行业细分化的必然趋势。 垂直搜索引擎是针对某一个行业的专业搜索引擎,是搜索引擎的细分和延伸,是对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行处理后再以某种形式返回给用户。垂直搜索是相对通用搜索引擎的信息量大、查询不准确、深度不够等提出来的新的搜索引擎服务模式,通过针对某一特定领域、某一特定人群或某一特定需求提供的有一定价值的信息和相关服务。其特点就是“专、精、深”,且具有行业色彩,相比较通用搜索引擎的海量信息无序化,垂直搜索引

    Solr   Facet   Java   搜索引擎   2019-05-06 浏览(325) 阅读原文>>
  • 搜索引擎进阶——solr自定义function

    本章要介绍的内容是solr中的自定义排序规则,或者说自定义得分函数。看懂本章内容,最好了解过以下知识点:1. solr的基本查询功能2. solr的edismax高级复合查询3. edismax中bf的作用关于solr内置function的用法可以参考官方文档《[Function Queries][solrLink]》,后续如果有机会,我会另出一篇文章加以阐述。---- 需求背景本来搜索服务提供的是一个职位搜索功能,面向的用户是猎头。所以,有一个需求就是按照猎头对每个职位的一个偏好预测值(记为V)进行职位综合排序。每个猎头对于不同的职位都有一个偏好预测值,记为H1V1。这个值由AI团队根据猎头所有行为记录进行统计计算,然后搜索团队要在猎头某一次搜索的结果内进行偏好预测值排序。几万猎头和几万职位的预测值是一个非常庞大的数据集。功能实现方式:1. 在职位索引增加一个动态字段,然后在建索引的时候猎头ID命名动态字段,对应的值就是这个猎头对当前职位的偏好预测值。dmdouble10002100,表示猎头10002对当前职位的偏好预测值为100。然后在搜索的时候,通过猎头id指定字段进行sort即可。2. 自定义一个function,通过solr提供的功能,在搜索时进行实时预测值查询,然后内置排序。方法1确实是一个最简单的方式,非常好理解,就是增加一个动态排序字段,然后sort即可。但是问题是数据量会非常大,而且意义不大。如果有10000个职位,30000个猎头,那么笛卡尔积就是3亿的偏好预测值,平均每个职位上要大约增加30000个动态字段,一个document会变得非常臃肿。当然,可以进行无效数据的预处理等方式进行优化,但是最后的数据依旧会庞大无比,关键是大部分都是无效数据。所以,我采用的是方法2。![图片](https://oomabc.com/staticsrc/img/201812/18/15

    ValueSource   排序   Solr   Java   搜索引擎   2019-07-23 浏览(1294) 阅读原文>>
  • 搜索引擎进阶——IK扩展之动态加载与同义词

    前言 IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。他最初是由林良益老师团队开发并维护的。 IK对应Lucene版本为4.7.2,其实IK针对不同版本的Lucene可以进行定制化的修改以达到适用的目的。 词库动态加载的关键类是org.apache.lucene.analysis.Tokenizer和org.apache.lucene.analysis.util.TokenizerFactory。 同义词扩展的关键类是org.apache.lucene.analysis.synonym.SynonymFilter和org.apache.lucene.analysis.util.TokenFilterFactory。---![图片](https://www.oomabc.com/staticsrc/img/201809/14/1536859583364974be33e584945cf80c52e29ab816a99.jpg) -------- 必要信息解释Term是一个最小搜索单元,Lucene中有个Term和对应的TermQuery;Token应该是分词过程中记录一些分词信息的对象。 然后我特意下载lucene-core-4.7.1进行查看,看到Token这类上面是这么写的:![图片](https://www.oomabc.com/staticsrc/img/201809/14/1536859689260271527901b7f487e83cd4bed7aa909bf.jpg) 我用非常蹩脚的英语水平,大致翻译一下主要内容就是:Token是一种在对文本进行分词时产生的对象,包含分词对象(Term)的词语内容,词语在文本中的开始、结束位置,和一个词语类型(关键字、停用词)字符串。开始、结束位置这两个参数,可以在做文本高亮或者摘要高亮的时候使用。从Lucene的2.9版本开始,Token这个类就不再建议使用了,推荐用Attuibutes这个接口对应的实现类代替。新版本取得分词信息方式如下:javaAnalyzer analyzer new StandardAnalyzer(Version.LUCENE47);String text "利用 Lucene 进行搜索就像建立索引一样也是非常方便的。";TokenStream tokenStream analyzer.tokenStre

    搜索引擎   IK   分词器扩展   Solr   Java   2019-07-24 浏览(3575) 阅读原文>>
  • 1 
    blogTest
    分享文章
     
    使用APP的"扫一扫"功能,扫描左边的二维码,即可将网页分享给别人。
    你也可以扫描右边本博客的小程序二维码,实时关注最新文章。