猜你喜欢
相关性搜索:利用Solr与Elasticsearch创建智能应用

相关性搜索:利用Solr与Elasticsearch创建智能应用

书籍作者:DougTurnbull ISBN:9787121327216
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:5417
创建日期:2021-02-14 发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

《相关性搜索:利用Solr与Elasticsearch创建智能应用》揭开了相关性搜索的神秘面纱,告诉大家如何将 Elasticsearch与 Solr这样的搜索引擎作为可编程的相关性框架,从而表达业务排名规则。从这《相关性搜索:利用Solr与Elasticsearch创建智能应用》中你可学会如何结合各种外部数据源、分类方法以及文本分析手段对相关性进行编程,以满足用户的个性化需求,将令人满意的搜索结果呈现给用户。此外,相关性搜索也需要一定的软性技能《相关性搜索:利用Solr与Elasticsearch创建智能应用》还将告诉读者怎样与业务人员协作,为业务找到正确的相关性需求,从而在搜索产品的整个研发生命周期内,实现相关性改进的良性循环。 本书介绍了搜索引擎的基本原理,及相关性搜索的调试技术,用大量实例的方式详述了搜索引擎的诸多特性,以形成一整套针对相关性搜索的系统化方法,并倡导致力于提高搜索质量的企业文化。《相关性搜索:利用Solr与Elasticsearch创建智能应用》适用于想利用 Elasticsearch或 Solr尝试构建智能搜索应用的开发人员。

作者简介

Doug Turnbull 在OpenSource Connections 上领导着一项搜索相关性的咨询业务,在那里他经常发表观点和更新博客。Doug 利用各种搜索和自然语言处理技术(NLP)为多个领域的客户构建语义丰富的相关性搜索体验。

John Berryman 的第一份职业是航空工程师,但在航空领域工作了几年之后,他发现编写程序或解决数学难题才是他喜欢的工作。后来,John 撇下了飞机和卫星,开始全职工作于软件开发、基础架构,以及搜索技术领域。目前,John 供职于Eventbrite,帮助利用Elasticsearch 构建事件活动的发现、搜索及推荐。

译者

莫映,IBM中国软件开发实验室顾问软件开发工程师,具有超过10年的软件开发与设计经验,目前从事IBM社交商务软件的研发工作。一直关注社交网络的应用与社交技术的运用。同时也积极活跃于IBM内部以及外部的各种技术社区之中。

蔡宇飞,IBM中国软件开发实验室软件开发工程师,目前从事IBM社交商务软件的研发工作,对云技算、大数据有浓厚兴趣。

殷智勇,IBM中国软件开发实验室IBM Domino高级软件开发工程师,对社会化协作软件、大数据搜索等领域较为关注,并有较为深入的研究。

编辑推荐

关键字搜索框已经演变成查找数据和浏览大多数网站及应用的事实上的标准用户界面。“聪明”的站内搜索引擎能给用户想要的结果,帮助你留住用户。

本书所讲的“相关性”是一门交叉学科,涵盖特征工程、机器学习、本体理论、用户测试、自然语言处理,还要与业务紧密结合。作者用一个在影片库中搜索想看的电影为例,系统展现了相关的技术和知识。

前言

序言

John和我是在共同为 OpenSource Connections(OSC)做咨询工作、帮助客户解决棘手的搜索问题时认识的。我们有时一起诊断性能问题(好让系统跑得更快),有时帮助构建搜索应用。所有项目都有一系列衡量成功与否的简单指标:系统运行更快了吗?应用开发完成了吗?但是,搜索相关性并不遵循这些规则。而且从谷歌时代成长起来的用户是不会容忍“还算凑合”这样的搜索的。他们想要的是“绝顶聪明”的搜索。他们希望搜索能够优先考虑其所关心的条件标准,而不是像搜索引擎通常那样,盲目地去猜测相关性。就像飞蛾被火焰所吸引一样,我们都被这一难题深深吸引了。而且正如所谓的飞蛾那样,我们也常常发现自己是在“扑火”。经过这些惨痛的教训,我们坚持了下来并且得到了成长,在我们最初认为极其困难的任务上取得了成功。在此期间,我们在 OSC的博客上也看到了同样的心声。我们意识到有关搜索相关性的问题被记录下来的文字少之又少。于是,我们提出了诸如测试驱动相关性(test driven relevancy)这样的观点。我们记录下了自己心中的困惑、遇到的问题,以及取得的成功。我们一起试验了机器学习的各种方法,比如潜在语义分析( latent semantic analysis)。我们研究了 Lucene的内部机制并探索了通过构建自定义搜索组件来解决实际问题的相关技术。我们还开始了对信息检索的研究。随着我们所掌握的解决疑难问题的技术越来越多,我们也持续不断地将它们记录为文字。然而,博客有其自身的局限性。 John和我一直希望以书的形式更加系统地阐明我们的观点。幸运的是,我们经历了一连串有趣的事情,机会往往就会自动找上门来。我在一个本地的技术交流会上与 Andrew Montalenti一起做了一个关于 Python并发的演讲。因为 Andrew在 PyCon上做过这次演讲, Manning就给 Andrew打电话来讨论写一本关于 Python并发的书。 Andrew说他对写书不感兴趣,但或许他的联合演讲人 Doug会感兴趣。

可惜我对写一本关于 Python并发的书也不感兴趣,但我的确有写另一本书的想法。带着这个想法我找到了 John,经过几番谈话之后,我们共同提出了一个非常激动人心的出书提议—接下来的事大家都知道了!

大约在两年前,我们与 Manning通了那次意义重大的电话。就像是在坐过山车一样,光阴荏苒,伴随着本书的写作,我们的生活也经历了一系列重大的变迁。我们两个人的家庭都增添了小宝宝。我开启了一项相关性的咨询业务。 John换了工作,成为 Eventbrite的常驻搜索专家。但我们还是无法拒绝继续为这个让人着迷的话题撰写文章。

你会发现本书不同于其他技术类的书籍,它不是某项技术的功能罗列。它更像是一张地图,指引着我们走出多年的痛苦,去解决那些没有现成答案的难题。换句话说,我们已经走出了搜索相关性的沙漠,发现了许多绿洲,并且学会了如何躲避沙人和帝国突击队。

我们向大家展示这张穿越沙漠的地图,这样大家就不会像我们那样迷失方向。现在,请原谅,我们要找一处最近的海滩来小憩一会儿了……

Doug Turnbull

致谢

在开始撰写本书的几周前,我们两家都迎来了小宝宝。我们要把最诚挚的感谢和爱意送给我们的爱人, Khara Turnbull和 Kumiko Berryman。我们把连续数个周末的时间都用来写书,而她们也都坚持了下来 —在此期间, Khara完成了她自己的一本书,Kumiko成功地经历了一次长途越野和房屋出售。现在是时候放个长假了!

本书的成功付梓也离不开 OpenSource Connections的创始人 Eric Pugh。作为我们的“老板”,是他把我们推到了写作、演讲和解惑的聚光灯下。作为一位领导者, Eric能够让你的热情成为他的热情。如果不是 Eric摘掉“辅轮”(有时甚至坚持“独轮”),我们就不会意识到,自己竟然能胜任写作或解惑的工作。 Eric告诉我们,每个人都可以成为思想领袖,包括我们自己。

感谢 TMDB提供的数据和支持。我们曾经花费大把的时间试图找到理想的数据集。TMDB(http://themoviedb.org)不仅提供了丰富的搜索数据集,而且在我们遇到程序错误和问题的时候(通常是我们自己的代码里的错误),TMDB也能为我们以及我们的早期读者提供支持。特别要感谢的是 Travis Bell,他总是及时回复我们的问题和邮件。

写书是一项团队活动,我们要感谢 Manning出版社本书制作团队中的每一位成员: Marina Michaels,我们的开发编辑; Aaron Colcord,技术开发编辑; Valentin Crettaz,技术校对; Frank Pohlmann和 Mike Stephens,策划编辑;还有负责营销的 Candace Gillhoolley。

我们也要感谢很多参与审稿的朋友,他们阅读了本书最初的书稿,并提出了许多有益的建议,包括 John Guthrie,Martin Beer,Arthur Zubarev,Elman Krinker, Amit Lamba,Marc-Oliver Scheele,Ian Stirk,Joseph Wang,Stuart Woodward, Ursin Stauss,Russ Cam,Michael Fink,Gregor Zurowski,Dimitrios Kouzis-Loukas,Jeremy Gailor和 Keith Webster。

另外要感谢 Andrew Montalenti,他为我们与 Manning建立了联系。还要感谢 Shay Banon的帮助,他是 Elasticsearch的创始人,坦率地说,他是一个很和蔼的人。感谢我们的同事, Trey Grainger,Matt Overstreet,Rena Morse,David Smiley, Grant Ingersoll,Yonik Seeley,Rene Kriegler,Peter Dixon-Moses,Charlie Hull和 Drew Farris,感谢这些年来与我们在搜索和相关性方面的这么多精彩讨论。还要特别感谢 Trey,他为我们这本书写了推荐序。

感谢每一位家人对我们的支持。尤其是我们的孩子们: Megume Berryman,Ian Turnbull和 Murray Turnbull。感谢我们在 OpenSource Connections和 Eventbrite上的“工作大家庭”,让我们能够把大量精力投入到本书的写作上。

关于本书

本书将告诉大家,在响应用户的搜索时要给出用户满意和认可的内容。我们将学习如何根据搜索条件,而不是对搜索引擎的神秘猜测,来严格控制对搜索结果的排名。我们会简要介绍深入定制 Solr或 Elasticsearch相关性排名的方法,以及如何采取措施帮助大家发掘相关性对应用而言的意义。

谁应该阅读本书

本书的目标读者是那些渴望了解为什么搜索引擎无法“领会”用户搜索意图的 Solr或 Elasticsearch开发人员。对搜索引擎至少有基本了解的读者,可以通过本书将他们的技能提升到更高的层次。虽然这是一本技术方面的书籍,但从组织机构和产品战略的角度来看,它的大部分内容都是围绕相关性展开的,因此也适合于产品经理、内容战略的制订者、市场营销人员,或专注搜索的领域专家阅读。

本书是如何组织的

本书首先介绍了相关技术的基础知识,然后逐步上升到定义和解决搜索相关性问题时我们所要面对的产品策略和文化议题,最后介绍了如何实施个性化搜索、语义搜索以及推荐。

第 1章从讨论相关性问题开始。问题涉及的领域包括网络搜索、电子商务,以及专家搜索等。本章讨论了学术界对于我们在相关性领域所做的尝试都提供了什么样的支持。最后,我们简要介绍了本书在解决相关性问题时所采取的技术策略。

第 2章对 Lucene的核心数据结构及其算法做了快速回顾,因为它们与相关性是紧密关联的。我们将会看到,为了寻找相关性内容,基于 Lucene的搜索为我们提供了一个如此令人难以置信的框架。

第 3章告诉大家如何对相关性进行调试。在第 2章介绍的数据结构和算法不起作用的时候,我们就需要拿出自己的“工具箱”,弄清楚搜索在哪里出了问题。

第 4章展示了如何利用搜索引擎的分析流程将内容和搜索分解成可描述的特征。这一基本技巧可以让我们学会如何利用分析手段让所有内容都能被找到。

第 5章开始讨论针对多个字段的查询策略。在本章中,我们会告诉大家如何构造查询语句,有针对性地去度量那些在搜索阶段对用户而言至关重要的排名因素。

第 6章继续我们有关查询策略的讨论。在这一章我们重点关注的是以词为中心(term-centric)的技术,以及相应的搜索策略,以支持用户对相关性的朴素理解。

第 7章为大家展示了评价调整( score-shaping)技术,比如放大( boosting)和过滤( .ltering)。我们时常需要突出近期产生的内容、高利润率的产品,或者距离较近的位置,以此来对搜索加以控制。

第 8章为大家展示了一系列可以帮助用户找到相关性内容的替代方法。有时,当相关性排名效果不佳的时候,一些 UI组件,比如可供浏览的切面( browsable facets)、自动补全( autocomplete),以及高亮显示( highlighting),也许用这些方法将用户引入正途更为简单。

第 9章我们构建了一个完整的以相关性为目标的搜索应用,本章将会为大家奉上具有专业眼光的 Yowling。既然已经掌握了相关性技术工程师所具备的一系列技能,本章我们将从头至尾见证一次完整的产品开发流程。

第 10章从产品战略的角度上升到了一个更高的层面,其目的在于关注文化和组织机构方面的一些因素。一个关注搜索的组织是如何确定何谓相关的呢?我们会看到,一个组织必须实现快速而准确的反馈回路,才能正确引导相关性技术工程师的研发工作。

第 11章将我们的视野拓展到了搜索引擎以外的地方。本章会向大家介绍机器学习、个性化搜索,以及语义搜索是如何协同工作,一起来提高搜索引擎的相关性排名的。

附录 A带领大家按照我们曾经走过的流程,利用 The Movie Database(TMDB) API一步步将本书所用的数据载入 Elasticsearch中。

附录 B通过对照 Elasticsearch和 Solr之间的相关性功能,指导 Solr读者阅读本书。

关于代码

本书包含了许多源代码的例子,形式包括带编号的清单,以及普通的文本行。对于这两种情况,源代码都以等宽字体进行了格式化,从而将其与普通文本进行区分。有时代码也会以粗体显示,目的是为了突出相对于本章前面步骤的变化,比如当一个新功能被加入已有的代码行时。

在许多情况下,最初的源代码都已经被重新进行了格式化处理;我们加入了换行并修改了缩进,目的是为了能够适应本书的可用版面。另外,当我们在文中对代码做了解释之后,源代码中的注释通常会被从清单中移除。许多代码清单都会伴有一定的注解,旨在突出显示某些重要的概念。

这些例子都已在 Elasticsearch 2.0和 Python 2.7下测试通过。

大家可以在 Manning的网站( www.manning.com/books/relevant-search)上以及本书的 GitHub库(http://github.com/o19s/relevant-search-book)中找到第 3章至第 9章的代码。为了便于试验,这些例子都是用 iPython Notebook/Jupyter编写的。 README文件详细说明了运行代码所需的准备工作。

作者在线

购买本书的读者可以免费访问一个由 Manning出版社运作的私有论坛,在那里你可以对本书发表评论、询问技术问题,并得到作者和其他用户的帮助。要访问和订阅该论坛,请在浏览器中打开 www.manning.com/books/relevant-search。该网页提供的信息包括:如何在成功注册之后加入论坛,你可以得到什么样的帮助,以及论坛内的行为规范。

Manning出版社承诺为读者提供这样一个场所,在那里不同读者之间,以及读者和作者之间可以建立起有意义的对话。本书作者并不承诺任何具体程度的参与,他们对本书论坛的贡献是自愿的(无偿的)。我们建议大家试着问一些具有挑战性的问题,以激起他们的兴趣!

本书一经出版,就可以通过出版社的网站访问作者在线论坛和以往讨论的存档。

其他在线资源

如果你想了解更多信息,我们推荐以下质量不错的资源。

. OpenSource Connection的博客(http://opensourceconnections.com/blog)。

. John Berryman的个人博客(http://thoughtbox.solutions)。

. Elastic的博客(www.elastic.co/blog)。

. Lucidwork的博客(https://lucidworks.com/blog)。

. Salmon Run,Sujit Pal的 Solr博客(http://sujitpal.blogspot.com/)。

. Solr Start的简讯(www.solr-start.com)。

有关搜索和信息检索方面更为一般性的讨论,我们建议参考下面这部宝典:

. 由 Christopher Manning等人编写的 Introduction to Information Retrieval,(剑桥大学出版社,2008),http://nlp.stanford.edu/IR-book/。

有关 Solr/Elasticsearch的具体问题,我们建议访问各自的技术论坛:

. http://discuss.elastic.co。

. http://lucene.apache.org/solr/resources.html。

目录

第1章 搜索的相关性问题

1.1 我们的目标:掌握相关性技术研发的技能

1.2 为什么搜索的相关性如此之难

1.2.1 什么是具备“相关性”的搜索结果

1.2.2 搜索:没有银弹

1.3 来自相关性研究的启示

1.3.1 信息检索

1.3.2 能否利用信息检索解决相关性问题

1.4 如何解决相关性

1.5 不只是技术:管理、协作与反馈

1.6 本章小结

第2章 搜索—幕后揭秘

2.1 搜索101

2.1.1 什么是搜索文档

2.1.2 对内容进行搜索

2.1.3 通过搜索来探索内容

2.1.4 获取进入搜索引擎的内容

2.2 搜索引擎的数据结构

2.2.1 倒排索引

2.2.2 倒排索引的其他内容

2.3 对内容进行索引:提取、充实、分析和索引

2.3.1 将内容提取为文档

2.3.2 充实文档以清理、强化与合并数据

2.3.3 执行分析

2.3.4 索引

2.4 文档的搜索和获取

2.4.1 布尔搜索: AND/OR/NOT

2.4.2 基于 Lucene搜索的布尔查询(MUST/MUST_NOT/SHOULD)

2.4.3 位置和短语匹配

2.4.4 助力用户浏览:过滤、切面和聚合

2.4.5 排序、结果排名,以及相关性

2.5 本章小结

第3章 调试我们的第一个相关性问题

3.1 Solr和Elasticsearch的应用:基于Elasticsearch的例子

3.2 最了不起的数据集:TMDB

3.3 用Python语言编写的例子

3.4 第一个搜索应用

3.4.1 针对 TMDB Elasticsearch索引的第一次搜索

3.5 调试查询匹配

3.5.1 检查底层查询策略

3.5.2 剖析查询解析

3.5.3 调试分析,解决匹配问题

3.5.4 比较查询条件和倒排索引

3.5.5 通过修改分析器来修正我们的匹配

3.6 调试排名

3.6.1 利用 Lucene的解释功能来剖析相关性评价

3.6.2 向量空间模型、相关性解释信息和我们

3.6.3 向量空间模型在实践中的注意事项

3.6.4 通过对匹配的评价来度量相关性

3.6.5 用 TF×IDF计算权重

3.6.6 谎言、该死的谎言和相似度

3.6.7 决定搜索词重要性的因素

3.6.8 解决 Space Jam和 alien的排名问题

3.7 问题解决了?工作永远做不完!

3.8 本章小结

第4章 驾驭token

4.1 将token作为文档特征

4.1.1 匹配的流程

4.1.2 token,不只是单词

4.2 控制查准率和查全率

4.2.1 查准率和查全率的例子

4.2.2 查准率或查全率的分析

4.2.3 一味提高查全率

4.3 查准率和查全率—让鱼和熊掌兼得

4.3.1 评价单一字段中特征的强度

4.3.2 超越 TF × IDF的评价:多搜索词与多字段

4.4 分析策略

4.4.1 处理分隔符

4.4.2 捕获同义词的语义

4.4.3 在搜索中为专指性建模

4.4.4 利用同义词为专指性建模

4.4.5 利用路径为专指性建模

4.4.6 对整个世界分词

4.4.7 对整数分词

4.4.8 对地理数据分词

4.4.9 对歌曲分词

4.5 本章小结

第5章 多字段搜索基础

5.1 信号及信号建模

5.1.1 什么是信号

5.1.2 从源数据模型开始

5.1.3 实现信号

5.1.4 信号建模:为数据的相关性建模

5.2 TMDB—搜索,人类最后的边疆

5.2.1 违反基本法则

5.2.2 让嵌套文档扁平化

5.3 在以字段为中心的搜索中给信号建模

5.3.1 从 best_.elds开始

5.3.2 控制搜索结果中的字段偏好

5.3.3 可以使用信号更精准的 best_.elds吗

5.3.4 让失败者分享荣耀:为 best_.elds校准

5.3.5 利用 most_.elds统计多个信号

5.3.6 在 most_.elds中缩放信号

5.3.7 什么时候其他匹配才无关紧要

5.3.8 有关 most_.elds的结论是什么

5.4 本章小结

第6章 以词为中心的搜索

6.1 什么是以词为中心的搜索

6.2 我们为什么需要以词为中心的搜索

6.2.1 猎寻“白化象”

6.2.2 在“星际迷航”的例子中寻找白化象问题

6.2.3 避免信号冲突

6.2.4 理解信号冲突的机理

6.3 完成第一个以词为中心的搜索

6.3.1 使用以词为中心的排名函数

6.3.2 运行以词为中心的查询解析器(深入底层)

6.3.3 理解字段同步

6.3.4 字段同步和信号建模

6.3.5 查询解析器和信号冲突

6.3.6 对以词为中心的搜索进行调优

6.4 在以词为中心的搜索中解决信号冲突

6.4.1 将字段合并成自定义全字段

6.4.2 利用 cross_.elds解决信号冲突

6.5 结合以字段为中心和以词为中心的策略:鱼与熊掌兼得

6.5.1 将“相似字段”分到一组

6.5.2 理解相似字段的局限

6.5.3 将贪婪的简单搜索和保守的放大器结合起来

6.5.4 以词为中心与以字段为中心,查准率与查全率

6.5.5 考虑过滤、放大,以及重新排名

6.6 本章小结

第7章 调整相关性函数

7.1 何谓评价调整

7.2 放大:通过突出结果来实现调整

7.2.1 放大:最后的边疆

7.2.2 放大时—选择加法运算还是乘法运算,布尔查询还是函数查询?

7.2.3 选择第一扇门:利用布尔查询进行加法放大

7.2.4 选择第二扇门:利用数学运算进行排名的函数查询

7.2.5 函数查询实践:简单的乘法放大

7.2.6 放大处理的基础:信号,处处是信号

7.3 过滤:通过排除的方法对结果进行调整

7.4 满足业务需求的评价调整策略

7.4.1 搜索所有影片

7.4.2 对放大信号进行建模

7.4.3 构造排名函数:增加具有较高价值的层级

7.4.4 利用函数查询对具有较高价值的层级进行评价

7.4.5 忽略 TF × IDF

7.4.6 捕捉综合质量指标

7.4.7 达成用户的时效性目标

7.4.8 结合函数查询

7.4.9 把一切联系起来

7.5 本章小结

第8章 提供相关性反馈

8.1 搜索框中的相关性反馈

8.1.1 利用“即输即搜”提供即时结果

8.1.2 利用“搜索补全”帮助用户找到最佳查询

8.1.3 利用搜索建议来修正输入和拼写错误

8.2 浏览期间的相关性反馈

8.2.1 构建基于切面的浏览

8.2.2 提供面包线导航

8.2.3 选择其他的结果排序方式

8.3 搜索结果清单中的相关性反馈

8.3.1 什么信息应该出现在搜索结果中

8.3.2 通过文本片段与高亮提供相关性反馈

8.3.3 对相似文档分组

8.3.4 在用户搜不到结果时给予帮助

8.4 本章小结

第9章 设计以相关性为核心的搜索应用

9.1 Yowl!一个绝佳的新起点

9.2 信息和需求的收集

9.2.1 理解用户及其信息需求

9.2.2 理解业务需求

9.2.3 找出必要及可用的信息

9.3 搜索应用的设计

9.3.1 将用户体验可视化

9.3.2 定义字段和模型的信号

9.3.3 信号的组合与平衡

9.4 部署、监控和改进

9.4.1 监控

9.4.2 找出问题并解决它们

9.5 知道什么是恰到好处

9.6 本章小结

第10章 以相关性为核心的企业

10.1 反馈:以相关性为核心的企业所依赖的基石

10.2 为什么以用户为中心的文化比数据驱动的文化更重要

10.3 无视相关性的天马行空

10.4 相关性反馈的觉醒:领域专家和专业用户

10.5 相关性反馈的成长:内容管理

10.5.1 内容管理员的角色

10.5.2 与内容管理员缺乏交流的风险

10.6 让相关性更加流畅:工程师/内容管理员的结对

10.7 让相关性加速:测试驱动的相关性

10.7.1 理解测试驱动的相关性

10.7.2 使用带用户行为数据的测试驱动相关性

10.8 超越测试驱动的相关性:学习排序

10.9 本章小结

第11章 语义和个性化搜索

11.1 基于用户概况的个性化搜索

11.1.1 收集用户的概况信息

11.1.2 将概要信息与文档索引紧密关联

11.2 基于用户行为的个性化搜索

11.2.1 引入协同过滤

11.2.2 使用共现计数的基本协同过滤算法

11.2.3 将用户行为信息与文档索引紧密关联

11.3 构建概念性搜索的基本方法

11.3.1 构建概念性信号

11.3.2 利用同义词对内容进行扩充

11.4 利用机器学习来构建概念性搜索

11.4.1 概念性搜索中短语的重要性

11.5 连接个性化搜索与概念性搜索

11.6 推荐是一种广义的搜索

11.6.1 用推荐代替搜索

11.7 祝愿大家有一个美好的相关性搜索之旅

11.8 本章小结

附录A 直接根据TMDB建立索引

附录B Solr读者指南

标签
搜索引擎,搜索