【问题标题】:Approach for efficient search within a result set在结果集中进行有效搜索的方法
【发布时间】:2013-07-11 14:32:27
【问题描述】:

短版

我想在我的数据库中的任意一组对象中高效地执行全文搜索。所有对象都将在搜索引擎中编入索引。

我的想法

我计划将此操作分为两部分。首先,将向搜索引擎查询与全文搜索匹配的加权/排序的 id 集。这组 id 将被过滤掉,删除任何不在用户原始集合中的 id。

有没有更好的方法来做到这一点?如果没有,您能否就如何有效地做到这一点提供任何建议?

加长版

我正处于构建 Web 应用程序的规划阶段,该应用程序将允许用户可视化高度链接的数据集并操纵这些可视化以导出有趣的顶点集以供进一步分析。用户通过 gui 执行的过滤操作将很复杂,并且很难表示为可索引的数量。

我希望允许用户对这些数据集中的结果进行全文搜索。查看what Google does for searching within a result set,他们简单地将较早的搜索查询附加到新查询以启用“搜索范围内”的方法对于我的数据可能不可行。

this question 的接受回答促进了使用数据库操作来过滤来自搜索引擎的结果的想法。

作为解决方案的一部分,我还考虑让前端切换到使用lunr,当用户想要在其中搜索的顶点集变得足够小以供前端处理时。弄清楚这个限制是多少需要一些测试,但我怀疑它会是几千个,所以仍然需要服务器端解决方案。

环境详情

我在 appengine 上运行 python 2.7。

在这个应用程序中,我希望初始结果集(将在其中搜索)包含 10 到 2000 个顶点。整个数据库中的顶点总数可能会大几个数量级。

【问题讨论】:

    标签: python performance google-app-engine search


    【解决方案1】:

    如果您尝试使用 GAE 数据存储进行分析,you are going to have a bad time

    数据存储区查询非常有限,没有对多个属性进行不等式过滤或全文搜索。

    您可能想查看具有 rich queries 并支持正则表达式过滤的 Google BigQuery。它还支持“中间表”,您可以在其中使用一个查询的结果作为另一个查询的输入数据 - 我不完全理解您的问题,但似乎这就是您所需要的。

    【讨论】:

    • 在南方公园的参考资料上哈哈。但这不是为了分析,我保证。而且看起来 BigQuery 是只读的,所以这对我不起作用。数据不会经常更改,但需要更改。不过,缓存中间值以更快地解决关键查询的想法可能是我可以使用的。
    • 现在我想起来了,虽然这不是直接的分析,但它确实有那种味道。 @stevep 的推荐答案让人想起 how gauges uses mongodb for analytics
    【解决方案2】:

    TLDNR:您能否进行一些预处理来设置客户端可以用来支持不同查询的大型哈希字典?

    您的数据有多动态和多庞大?如果您的数据相对静态,我正在研究可能类似的东西。我们的网页允许用户通过选择大约 300 个变量的任意组合来创建 AND 和 OR 选择。每个变量可以有数百个与之关联的项目。因为变量的数据集是相对静态的并且不是巨大的,所以我们将它们创建为 TextProperty 字段中的 json.dumped 文本。当被浏览器解析时,json 简单地变成了一个以变量 ids 为键的大字典。每个键的值都是与所选键关联的项目数组(在我们的例子中是图像 id)。所有的交集和组合都是通过一些小的 Javascript 函数完成的,这些函数由这些数组提供。这非常有效 - 用户补充了速度,而且这种方法大大简化了 GAE 方面。所有 json 变量都通过 crons 和任务队列以一种有点懒惰的、近乎实时的方式加载/更新。为了最终显示,结果被格式化并插入到 div 的 innerHTML 中。一旦缓存了所有图像,浏览器对格式化和显示数百个 420x280 像素图像的响应几乎是瞬时的。非常酷,并向从事浏览器工作的人们致敬——包括布局和 JS 优化。 (我应该注意,我们使用纯 JS 来确保与 JQuery 之类的东西相比开销最小。) HTH -stevep

    【讨论】:

    • Steve - 数据类似于书签程序将获得的数据。许多链接项目由个人用户存储在层次结构中并被标记。所以会有很多标签,很多文件夹,很多项目。
    • 您的方法听起来确实很有趣,我想尝试更多地理解它。我所听到的:数百张照片有大约 300 个可能的属性,并且每张匹配照片的列表都存储为链接到属性对象的字符串化 json 数组对象。
    • 这实际上可能对我有用。如果我将预先计算的标签项关联限制在每个用户范围内,则数据可能足够小以使其正常工作。我要测试一下...
    • 希望你是成功的 tutlemonvh。如果您有兴趣,这个 SO 链接非常好:使用 JS 的高性能数组交集。我正在使用 intersect_safe。链接:stackoverflow.com/questions/1885557/…
    • 谢谢,这是一个很好的资源 - 正是出于这个原因,我在几天前为该页面添加了书签。
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多