database - 当我只有全部文档的一个子集时,如何应用 TF-IDF?

标签 database elasticsearch search tf-idf

实际应用:

我有几个数据库需要从一个搜索框中查询。其中一些我可以直接访问(它们是 SQL Server/MySQL),其他我只能通过 API 进行搜索。

在理想情况下,我会将所有这些数据注入(inject) Elasticsearch 并使用它来确定相关性。不幸的是,我在本地没有资源来高效运行。 Elastic 在空闲时占用了超过 400mb 的 RAM,而没有添加任何实际数据或运行查询。看起来大多数在生产中使用 Elasticsearch 的人都在运行 32GB - 64GB RAM 的机器。我的组织无权访问任何可用于此项目的强大功能。

所以我的下一个想法是查询所有数据库并在用户进行搜索时连接到 API。然后我需要分析结果,确定相关性,并将它们返回给用户。我认识到,就性能而言,这可能是一个糟糕的计划。我希望使用 memcached 让事情变得更容易接受。

在寻找确定相关性的算法的研究中,我遇到了 tf-idf。我希望将其应用于我从所有数据库返回的结果。

实际问题

我对 tf-idf 的理解是,在对语料库中的每个文档进行分词后,执行词频分析,然后将其与单词的逆文档频率相乘。逆文档频率的计算方法是将文档总数除以包含该词的文档总数。

问题在于,如果我从 API 中提取文档,我不知道语料库中文档的真实总数。我只提取了一个子集,根据提取这些文档的方式,它们自然会使用其中的所有术语。我仍然可以通过将这些不同来源返回的文档池视为一个语料库来将 tf-idf 应用于此吗?最好的方法是什么?

奖金问题

如果您有关于如何在不拼凑我自己的搜索解决方案或使用 Elasticsearch 的情况下完成此任务的建议,我洗耳恭听......

最佳答案

正如您所注意到的,Elasticsearch 并不是为在内存受限的环境中运行而构建的。如果您想使用 Elasticsearch,但无法设置专用机器,您可以考虑使用托管搜索解决方案(例如 AWS Elasticsearch、Elastic Cloud、Algolia 等)。不过,这些解决方案仍然需要成本!

有两个很棒的替代方案需要更多的工作(但不如编写您自己的搜索解决方案那么多)。 Lucene 是 Elasticsearch 在其之上编写的实际搜索引擎。它仍然会将相当多的底层数据结构加载到内存中,因此,根据您要索引的底层数据的大小,它仍然可能会耗尽内存。但是,与整个 Elasticsearch 实例相比,您应该能够在单个 Lucene 索引中容纳更多的数据。

另一个我不太了解的选择是 Sphinx。它也是一个搜索引擎。它还允许您指定分配多少内存供其使用。它将其余数据存储在磁盘上。

关于database - 当我只有全部文档的一个子集时,如何应用 TF-IDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50635885/

相关文章:

mySQL左外连接不选择可能的所有数据

java - 按名字或姓氏以及特定的相关 ID 搜索?

查找具有最匹配属性的记录的算法

javascript - 搜索框文本 - 显示隐藏功能

php - MySql,在重复更新时插入

database - 用于简单数据库应用程序的良好(基于 CMS?)平台

ubuntu - 无法将 Elasticsearch 作为服务启动

elasticsearch - Elasticsearch 中的集群运行状况是什么?

search - jqGrid - 使用数据类型 :local Or loadonce: true 时如何搜索

database - oracle中同义词的区别