ReQL: фильтрация документов из списка строк Python - PullRequest
0 голосов
/ 24 марта 2019

Я хотел бы отфильтровать таблицу с помощью ReQL, используя (Python) список строк (переменное число значений), примененных к нескольким полям, т.е. в логике большего количества строк в списке более точный результат.В идеале фильтрация должна быть регистрозависимой.

Эквивалент 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 документов (?).

1 Ответ

0 голосов
/ 25 марта 2019

Отвечая на мой собственный вопрос.Для тех, кому это может быть интересно, я наконец-то обошёл задачу по:

  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))

Построение dict для каждого DocID (ключа) со значением "weight" в качестве значения.Для каждого слова, найденного для DocID, значение «веса» увеличивается на 1.

После завершения итерации все DocID получают тот же «вес», что и количество слов.возвращено, что означает, что они соответствуют всем поисковым словам.Например, со строкой из 3 слов все DocID, получающие 3 как «вес» (в конце), означают, что для них были найдены все слова.

get_all с DocIDsиспользуется для их извлечения и возврата.

Обратите внимание, что поиск нечувствителен к регистру, в нескольких полях и может использовать частичные слова, как я хотел изначально.Вероятно, не самый лучший и чистый способ, но работает, по крайней мере, на не слишком большой базе данных.

...