Создание динамического запроса 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