首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对分页集执行过滤的高效数据体查询

对分页集执行过滤的高效数据体查询
EN

Stack Overflow用户
提问于 2014-09-26 16:55:21
回答 1查看 1K关注 0票数 4

考虑到数据体不支持分页,我想知道如何有效地支持查询,如:

:history/body上的前30个实体为例,查找其:history/body与某些正则表达式匹配的实体。

下面是我如何单独进行regex匹配:

代码语言:javascript
运行
复制
{:find [?e]
 :where [[?e :history/body ?body]
         [(re-find #"foo.*bar$" ?body)]]}

意见:

  1. 然后,我可以从这些(take ...),但这与匹配前30个实体不一样。
  2. 我可以得到所有的实体,take 30然后用re-find手动过滤,但是如果我有3000万个实体,那么将它们全部转移到take 30似乎效率很低。另外:如果我想从我的3000万个实体中取出2000万并通过re-find过滤它们,该怎么办?

Datomic讨论了查询是如何在本地执行的,但是我尝试过对一组52913个实体(当然,它们完全是touch编辑的)进行内存中的转换,这需要花费大约5秒。想象一下,在数百万或一千万人中,情况会有多糟。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-07 21:23:42

(这里只是集思广益)

首先,如果您曾经使用regexp,您可能需要考虑对:history/body的全文索引,以便您可以这样做:

代码语言:javascript
运行
复制
[(fulltext $ :history/body "foo*bar") [[?e]]]

(注意:不能更改现有实体模式上的:db/fulltext true/false )

排序是在查询之外必须做的事情。但是,根据您的数据,您可以将查询限制为单个“页面”,然后将谓词应用于这些实体。

例如,如果我们只是通过一个自动递增的:history:history/id实体进行分页,那么我们就会事先知道“Page3”是:history/id 61到90。

代码语言:javascript
运行
复制
[:find ?e
 :in $ ?min-id ?max-id
 :where
 [?e :history/id ?id]
 (<= ?min-id ?id ?max-id)
 (fulltext $ :history/body "foo*bar") [[?e]]]

也许是这样的:

代码语言:javascript
运行
复制
(defn get-filtered-history-page [page-n match]
  (let [per-page 30
        min-id (inc (* (dec page-n) per-page))
        max-id (+ min-id per-page)]
    (d/q '[:find ?e
           :in $ ?min-id ?max-id ?match
           :where
           [?e :history/id ?id]
           [(<= ?min-id ?id ?max-id)]
           [(fulltext $ :history/body ?match) [[?e]]]]
      (get-db) min-id max-id match)))

但是,当然,问题是约束分页集通常是基于事先不知道的排序,所以这并不是很有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26064582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档