Создание динамического запроса OR с помощью Sunburnt+Solr

Я пробую интерфейс Python Solr Sunburnt, и я столкнулся с небольшой проблемой, которую не могу понять. Из моего поля поиска я хочу принять произвольное количество слов, которые я помещаю в массив (например, "Музыка" Iron Maiden "" -> ["Музыка", "Iron Maiden"]. Это я выяснил (используя shlex).

Проблема в том, что Sunburnt синтаксис для ORing терминов

    response = si.query(si.Q(tag = 'Music') | si.Q(tag = 'Iron Maiden'))

Как я могу перебрать свой список поисковых слов и в итоге получить что-то подобное выше? Или есть другой способ сделать это, о котором я не знаю?

3 ответа

Решение

Что вы действительно хотите сделать, это:

query = si.query()

for word in words:
    query |= si.Q(word)

или, как однострочник

query = reduce(operator.or_, [si.Q(word) for word in words])

Я понял! eval() функция была ключом:

words = shlex.split(request.args.get('q', ''))

qrystr=""
for word in words:
    qrystr = qrystr + "si.Q(title_s = '*" + word.replace("\0", "") + "*') | "
    # Each word needs to be stripped of null characters for the eval to work

qrystr = qrystr[:-2]; 


results = si.query(eval(qrystr))
finalresults = results.execute()    

Можете ли вы перебрать свой массив и построить выражение запроса?

Вообще что-то похожее на

expr=""
for word in words:
    expr = expr + "si.Q(tag =" + word + ") |"

response = si.query(expr[:-1]); #to remove the dangling "|" character
Другие вопросы по тегам