Google की पूर्ण पाठ खोज सेवा के लिए खोज क्वेरी से बचें

This is a cross-post of https://groups.google.com/d/topic/google-appengine/97LY3Yfd_14/discussion

मैं gae 1.6.6 में नई पूर्ण पाठ खोज सेवा के साथ काम कर रहा हूं और मुझे यह पता लगाने में परेशानी हो रही है कि मैं खोज क्वेरी में उन्हें पास करने से पहले अपने क्वेरी स्ट्रिंग से कैसे बचूं। दस्तावेज़ों का उल्लेख है कि कुछ पात्रों से बचने की आवश्यकता है (अर्थात् संख्यात्मक ऑपरेटरों ), हालांकि वे क्वेरी पार्सर को कैसे निर्दिष्ट नहीं करते हैं, स्ट्रिंग से बचने की अपेक्षा करता है।

मेरे पास जो मुद्दा है वह दो गुना है:

  1. Failing to escape the crap out of many characters (more than those that are hinted at in the docs) will cause the parser to raise a QueryException.
  2. When I've escaped the query to the point it won't raise, the numeric operators (>, <, >=, <=) no longer parse correctly (not factored into the search).

मैं एक परीक्षण स्थापित करता हूं जहां मैं string.printable को my_index.search() में फ़ीड करता हूं और पाया कि यह प्रत्येक "प्रिंट करने योग्य" पर QueryException उठाएगा "चरित्रों को नियंत्रित करें, जिन्हें मैं अब अलग कर रहा हूं, साथ ही चीजें जो तारांकन, अल्पविराम, कोष्ठक, ब्रेसिज़, टिल्ड जैसे निर्दोष लगती हैं। इनमें से कोई भी डॉक्स में भागने की आवश्यकता के रूप में उल्लेख नहीं किया गया है।

अब तक मैंने कोशिश की है:

  • cgi.escape()
  • saxutils.escape() with a mapping of ascii to urlencoded equivalents (eg , -> %2C)
  • saxutils.escape() with a mapping of ascii to html entity encoded ascii codes (eg {)
  • urllib.quote_plus()

I've gotten the best results so far using url-style(%NN) replacements, but >, <, >=, and <= continue to fail to yield the expected results from the index. Also, and this doesn't really seem to have anything to do with the escaping issue, but using NOT in front of a field = value type query seems to not be working as advertised either.

tl; डॉ

खोज सेवा में भेजने से पहले मुझे अपने प्रश्नों से कैसे बचना चाहिए ताकि पार्सर QueryException और नहीं उठाएगा, मेरी क्वेरी अपेक्षित परिणाम उत्पन्न करती है?

0
जोड़ा संपादित
विचारों: 1

1 उत्तर

संक्षेप में दस्तावेज़ीकरण में समझाया गया है ( https://developers.google.com/ एपेंगिन/डॉक्स/पायथन/सर्च/अवलोकन # क्वेरी_भाषा_ऑवरव्यू ), क्वेरी पैरामीटर एक स्ट्रिंग है जो हमारी क्वेरी भाषा को अनुरूप बनाना चाहिए। जो हमें बेहतर दस्तावेज करना चाहिए।

अभी के लिए, मैं आपको डबल कोट्स में अपने प्रश्नों (या कम से कम कुछ शब्दों/शर्तों) को लपेटने की सलाह देता हूं। इस तरह आप सभी प्रिंट करने योग्य पात्रों को पारित करने में सक्षम होंगे, लेकिन "और निम्नलिखित उदाहरण परिणाम दिखाता है।

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('\\', ''))

EDIT: Note that anything that is enclosed in double quotes is an exact match, that is "foo bar" would match against ...foo bar... but no ...bar foo..

0
जोड़ा
क्या एक और व्यावहारिक उदाहरण प्रदान करना संभव होगा? made> = 200-20-13-13 और विवरण: foobar जैसी किसी चीज़ की क्वेरी को देखते हुए, आप इससे बचने के बारे में कैसे जाएंगे?
जोड़ा लेखक Owen Nelson, स्रोत
ठीक है, मैं देखना शुरू कर रहा हूँ। यह वास्तव में प्रासंगिक है (जैसा कि मैंने अपने समूहों के पोस्ट में बताया है)। foo> = 123 हस्तक्षेप के बिना काम करता है, लेकिन foo> = 123> अपवाद उठाएगा। ऐसा लगता है कि इसे पूरी तरह से संभालने के लिए मुझे प्री-पार्सर पार्सर बनाने की आवश्यकता है। यह अजीब है।
जोड़ा लेखक Owen Nelson, स्रोत
इसके अतिरिक्त, मेरे दिनांक क्षेत्र से भी कम, सिविल, अच्छी तरह से गठित क्वेरी प्रदान करते समय भी काम नहीं करता है।
जोड़ा लेखक Owen Nelson, स्रोत
मैं देखता हूं कि आप उस प्रश्न के साथ कहां जा रहे हैं। अब मैं चल रहे प्रश्नों के लिए 2 अलग-अलग संदर्भ देख रहा हूं: पहला वह है जब मैं उपयोगकर्ता के लिए क्वेरी तैयार कर रहा हूं (सुरक्षित, भागने की आवश्यकता नहीं है) और उपयोगकर्ता से आने वाले दूसरे प्रश्न हैं (जो मुझे होना चाहिए जब यह आता है तो बर्बर रूप से बार्बों और कांटों को अलग करना)।
जोड़ा लेखक Owen Nelson, स्रोत
यह उत्तर मूल खोज शब्द को किसी भी डबल-कोट्स को हटाकर बदलता है जो वास्तव में क्वेरी का हिस्सा हो सकता है। इसके बजाय मैं निम्नलिखित प्रतिस्थापन सफलतापूर्वक उपयोग कर रहा हूं, जो खोज शब्द के भीतर किसी भी डबल-कोट्स से बच निकलता है: search_term.replace ('' ',' \\ "')
जोड़ा लेखक Nick Franceschina, स्रोत
आपके द्वारा प्रदान की गई क्वेरी को क्वेरी से बचने की आवश्यकता नहीं है ('बनाया गया> = 200 9 -13-13 और विवरण: foobar') बस ठीक काम करता है। यदि आप वास्तव में स्ट्रिंग 'बनाई गई> = 200 9 -13-13 और विवरण: foobar' को अपने दस्तावेज़ों में ढूंढ रहे हैं, तो आपको स्ट्रिंग में स्ट्रिंग को संलग्न करना चाहिए। लेकिन एक नियम के रूप में मैं दस्तावेज़ों में परिभाषित किसी भी ऑपरेटर को दोहरे उद्धरणों में घेर लेगा यदि मैं उन्हें वर्णों के रूप में उपयोग करना चाहता हूं और ऑपरेटर नहीं।
जोड़ा लेखक Sebastian Kreft, स्रोत
मुझे लगता है कि आप एक अंतिम उपयोगकर्ता से क्वेरी स्ट्रिंग प्राप्त कर रहे हैं। सही?
जोड़ा लेखक Sebastian Kreft, स्रोत
यह उत्तर 2012 से आता है और "अभी के लिए" उल्लेख करता है। क्या अब ऐसा करने का कोई बेहतर तरीका है? उद्धरणों में लपेटना एक वांछनीय समाधान नहीं है क्योंकि यह सटीक स्ट्रिंग की तलाश करेगा
जोड़ा लेखक manubot, स्रोत