社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Tom • 6 年前 • 1671 次点击  

我想用一个(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
 
1671 次点击  
文章 [ 1 ]  |  最新文章 6 年前
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检索并返回它们。

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