Py学习  »  Python

reql:从字符串的python列表过滤文档

Tom • 5 年前 • 1650 次点击  

我想用一个(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%'...)
...

我测试了很多没有成功的解决方案,以保持所描述的解决方案 here :

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

但返回0个文档(?).

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38995
 
1650 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Tom
Reply   •   1 楼
Tom    6 年前

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

  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(key)构建一个dict,值为“weight”。在为docid找到的每个单词上,“weight”值增加1。

  2. 一旦迭代结束,所有的docid将得到与返回的单词数相同的“权重”,这意味着它们匹配所有的搜索单词。例如,对于3个单词的字符串,所有docid都得到3作为“权重”(在末尾),这意味着已经为它们找到了所有单词。

  3. get_all 然后使用WITH DOCID检索并返回它们。

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