Вопрос по python – Экранирование поисковых запросов для службы полнотекстового поиска Google

5

Это кросс-постhttps: //groups.google.com/d/topic/google-appengine/97LY3Yfd_14/discussio

Я работаю с новой службой полнотекстового поиска в gae 1.6.6 и не могу понять, как правильно экранировать строки запросов, прежде чем передать их в поисковый индекс. Документы упоминают, что некоторые символы должны быть экранированы (а именно, числовые операторы), однако они не указываютка анализатор запросов ожидает экранирования строки.

У меня двойная проблема:

Если не избежать дерьма из многих символов (больше, чем те, на которые намекают в документах), парсер вызоветQueryException. Когда я выполнил запрос до точки, которую он не вызовет, числовые операторы (>, <,> =, <=) больше не обрабатываются правильно (не учитываются при поиске).

Я настраиваю тест, где кормлюstring.printable вmy_index.search() и обнаружил, что это подниметQueryException на каждом из «печатаемых» управляющих символов, которые я сейчас вычеркиваю, а также вещи, которые кажутся невинными, как звездочка, запятая, скобки, фигурные скобки, тильда. Ни одно из них не упомянуто в документах как нуждающиеся в спасении.

Пока я пробовал:

cgi.escape()saxutils.escape() с отображением ascii в urlencoded эквиваленты (например,, ->%2C)saxutils.escape() с отображением ascii в html-кодировку ascii-кодов сущностей (например,&#123;)urllib.quote_plus()

До сих пор я добивался лучших результатов при использовании URL-стиля %NN) замены, но>, <,> = и <= по-прежнему не дают ожидаемых результатов из индекса. Кроме того, и это, похоже, не имеет ничего общего с проблемой выхода, но использованиеNOT передfield = valueохоже, что запрос типа @ тоже не работает так, как рекламируетс

tl; др

Как я должен избегать своих запросов перед отправкой их в службу поиска, чтобы парсер не вызывалQueryException а такж мой запрос дает ожидаемые результаты?

Ваш Ответ

1   ответ
3

https: //developers.google.com/appengine/docs/python/search/overview#Query_Language_Overvie), параметр запроса - это строка, которая должна соответствовать нашему языку запросов. Который мы должны документировать лучше.

На данный момент я рекомендую вам обернуть свои запросы (или хотя бы некоторые слова / термины) в двойные кавычки. Таким образом, вы сможете передать все печатные символы, но "и". В следующем примере показан результат.

import string
from google.appengine.api.search import Query
Query('"%s"' % string.printable.replace('"', '').replace('\\', ''))

и ты можешь даже передать непечатаемые символы

Query('"%s"' % ''.join(chr(i) for i in xrange(128)).replace('"','').replace('\\', ''))

РЕДАКТИРОВАТ: Обратите внимание, что все, что заключено в двойные кавычки, является точным соответствием, то есть "foo bar" будет соответствовать ... foo bar ... но нет ... bar foo ..

Можно ли привести более практичный пример? Учитывая запрос что-то вродеcreated >= 2009-20-13 AND description:foobar как бы ты избежал этого? Owen Nelson
Введенный вами запрос не требует экранирования Query ('create> = 2009-20-13 AND description: foobar') просто отлично работает. Если вы действительно ищете в своих документах строку «create> = 2009-20-13 AND description: foobar», вы должны заключить эту строку в кавычки. Но, как правило, я заключаю в двойные кавычки любой оператор, определенный в документации, если я хочу использовать их как символы, а не как операторы. Sebastian Kreft
Ладно, я начинаю видеть. Это действительно контекстно (как я упоминал в посте моей группы).foo >= 123 работает без вмешательства, ноfoo >= 123 > выдаст исключение. Похоже, мне нужно собрать анализатор перед синтаксическим анализатором, чтобы справиться с этим полностью. Это неудобно Owen Nelson
Этот ответ изменяет исходный поисковый термин, удаляя любые двойные кавычки, которые могут фактически быть частью запроса. Вместо этого я успешно использую следующую замену, которая просто избегает двойных кавычек в поисковом запросе: search_term.replace ('"', '\\"') Nick Franceschina
Этот ответ датируется 2012 годом и упоминает "пока". Есть ли лучший способ сделать это сейчас? упаковка в кавычки не является желательным решением, так как будет искать точную строку manubot

Похожие вопросы