【问题标题】:Fast search algorithm快速搜索算法
【发布时间】:2021-01-24 21:23:15
【问题描述】:
  1. 让我们有大量的帖子。
  2. 作为用户,我想查找所有包含“hello”和“world”的帖子。
  3. 假设有一个帖子包含这样的文字“Hello world,这个地方很漂亮”。

现在:

  • a) 如果用户搜索“hello”,则查找文本,
  • b) 查找文本 如果用户搜索“hello”、“world”、
  • c) 如果用户搜索“hello”、“world”、“funny”,则不会找到文本。

为了减少可能的候选人数量,我正在考虑这样做:

for each post (
if number_of_search_words == number_of_post_words -> proceed with search logic
if number_of_search_words < number_of_post_words -> proceed with search logic
if number_of_search_words > number_of_post_words -> don't proceed with search logic
)

但这也需要一个包含每个帖子字数的数字,这会导致更复杂。

有没有优雅的方法来解决这个问题?

【问题讨论】:

  • 通常,您会为大量帖子中的所有单词创建一个索引。然后,对于多词搜索,您计算每个词的帖子列表的 intersectionunion。例如,假设“hello”的索引列表是 ​​{1,2,5},“world”的索引列表是 ​​{2,4,5}。搜索包含“hello”和“world”的帖子将返回帖子 2 和 5。但搜索包含“hello”或“world”的帖子将返回帖子 1、2、4 和 5。

标签: algorithm search full-text-search


【解决方案1】:

您必须使用位容器,例如,BitMagic

  • 最初,您为每个帖子分配一些有序的整数 ID,即 postID。
  • 此后,创建 N 个位容器(N = 搜索字数),每个大小为最大 postID。
  • 此后,构建索引:解析每个帖子,并为帖子中的每个术语,在术语关联的容器中设置 bit1,以 postID 作为索引。

搜索:

  • 为您的单词“hello”、“word”获取位容器。
  • 还有那些位容器。
  • 结果容器将包含用于 PostID 的位 1,包含两个搜索词。

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 2011-02-09
    • 2011-12-28
    • 2016-02-21
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多