ReQL:从Python字符串列表中筛选文档

时间:2019-03-23 23:40:25

标签: rethinkdb rethinkdb-python reql

我想使用在多个字段上使用的(Python)字符串列表(值的数量可变)来过滤带有ReQL的表,即,在列表中包含更多字符串的逻辑中,更准确的结果。理想情况下,过滤应区分大小写。

SQL等效项可能接近:

selection = list(r.table("mytable").filter(lambda d: 
       r.expr(searchWords).contains(d["field"]) 
).run(g.rdb_conn))

我测试了很多解决方案均未成功,例如,一个描述为here的解决方案:

{{1}}

但是返回0个文档(?)。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题。对于那些可能感兴趣的人,我终于通过以下方法解决方法

  1. 迭代输入字符串的所有搜索词

  2. 使用:

  3. 搜索并获取与每个单词匹配的所有DocID
    selectionDict = list(r.table('mytable').filter( \
    ( r.row["field1"].match("(?i)"+searchWord)) \
    | (r.row["field2"]["body"].match("(?i)"+searchWord) ) )  \
    .pluck("id") \
    .run(g.rdb_conn))
  1. 为每个带有“权重”作为值的DocID(键)构建字典。在为DocID找到的每个单词上,“权重”值增加1。

  2. 在所有DocID上进行一次迭代后,与返回的单词数量相关的“权重”相同,这意味着它们匹配所有搜索单词。例如,如果字符串为3个单词,则所有DocID的“权重”(最后为3)都将变为3。

  3. 然后使用具有DocID的
  4. get_all来检索并返回它们。

请注意,搜索在多个字段上不区分大小写,并且可以按我最初的意愿使用部分单词。 可能不是最好和最简洁的方法,但至少可以在不太大的数据库上使用。