0

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

SQL 等价物可能接近于:

select * from mytable
where (field1 like '%AA%' and field1 like '%BB%'...)
or    (field2 like '%AA%' and field2 like '%BB%'...)
or    (field3 like '%AA%' and field3 like '%BB%'...)
...

我测试了很多解决方案都没有成功,例如这里描述的一个:

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

但返回 0 doc (?)。

4

1 回答 1

0

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

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

  2. 使用以下方法搜索并获取与每个单词匹配的所有 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. get_all然后使用 DocIDs 检索并返回它们。

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

于 2019-03-25T20:50:38.660 回答