2012-10-15 13 views
12

GAE search API का उपयोग करना आंशिक मिलान की खोज करना संभव है?आंशिक मिलान जीएई खोज एपीआई

मैं स्वत: पूर्ण कार्यक्षमता बनाने की कोशिश कर रहा हूं जहां यह शब्द आंशिक शब्द होगा। जैसे।

> ख
> bui
> निर्माण

होगा सब वापसी "इमारत"।

GAE के साथ यह कैसे संभव है?

उत्तर

27

हालांकि LIKE कथन (आंशिक मिलान) पूर्ण पाठ खोज में समर्थित नहीं है, लेकिन आप इसके आसपास हैक कर सकते हैं।

सबसे पहले, हर संभव सबस्ट्रिंग के लिए डेटा स्ट्रिंग (हैलो = ज, वह, Hel, लो, आदि)

def tokenize_autocomplete(phrase): 
    a = [] 
    for word in phrase.split(): 
     j = 1 
     while True: 
      for i in range(len(word) - j + 1): 
       a.append(word[i:i + j]) 
      if j == len(word): 
       break 
      j += 1 
    return a 

एक सूचकांक + दस्तावेज़ (खोज API) का निर्माण tokenized तार का उपयोग कर tokenize

index = search.Index(name='item_autocomplete') 
for item in items: # item = ndb.model 
    name = ','.join(tokenize_autocomplete(item.name)) 
    document = search.Document(
     doc_id=item.key.urlsafe(), 
     fields=[search.TextField(name='name', value=name)]) 
    index.put(document) 

खोज करें, और वॉला!

results = search.Index(name="item_autocomplete").search("name:elo") 

https://code.luasoftware.com/tutorials/google-app-engine/partial-search-on-gae-with-search-api/

+0

दोहराना नहीं यह अच्छी तरह से काम करता है। मैं फेरिस की search.index फ़ंक्शन को स्वचालित रूप से सभी टेक्स्टफील्ड (एक पंक्ति परिवर्तन) को टोकन करने में कामयाब रहा, और यह "बस काम करता है"। बस खोज परिणामों से सीधे उपयोगकर्ता को कहा गया फ़ील्ड प्रदर्शित करने का प्रयास न करें;) –

+1

मैंने 'name.lower() 'भी जोड़ा है क्योंकि मुझे रूसी भाषा के साथ कुछ अजीब समस्याएं थीं: यदि टोकन पूंजी पत्र से शुरू होता है मैं इस तरह के टोकन खोजने में असमर्थ था। –

+8

दोस्ताना नोट: वाक्यांश "voila!" है –

2

जैसा कि Full Text Search and LIKE statement पर वर्णित है, कोई भी संभव नहीं है, क्योंकि खोज एपीआई पूर्ण पाठ अनुक्रमण लागू करता है।

आशा है कि इससे मदद मिलती है!

0

मैं Typeahead नियंत्रण के लिए एक ही समस्या है, और मेरे समाधान करने के लिए छोटा सा हिस्सा पार्स स्ट्रिंग है:

name='hello world' 
name_search = ' '.join([name[:i] for i in xrange(2, len(name)+1)]) 
print name_search; 
# -> he hel hell hello hello hello w hello wo hello wor hello worl hello world 

आशा इस मदद

2

सिर्फ @Desmond लुआ उत्तर की तरह , लेकिन विभिन्न टोकननाइज़ फ़ंक्शन के साथ:

 
def tokenize(word): 
    token=[] 
    words = word.split(' ') 
    for word in words: 
    for i in range(len(word)): 
     if i==0: continue 
     w = word[i] 
     if i==1: 
     token+=[word[0]+w] 
     continue 

     token+=[token[-1:][0]+w] 

    return ",".join(token) 

यह hello world को he,hel,hell,hello,wo,wor,worl,world के रूप में पार्स करेगा।

यह प्रकाश स्वत: पूर्ण प्रयोजन के लिए अच्छा है

0

मेरे संस्करण अनुकूलित: टोकन

def tokenization(text): 
    a = [] 
    min = 3 
    words = text.split() 
    for word in words: 
     if len(word) > min: 
      for i in range(min, len(word)): 
       token = word[0:i] 
       if token not in a: 
        a.append(token) 
    return a 
+0

कृपया अपने पोस्ट उत्तर के बारे में अधिक जानकारी जोड़ें सर। –

संबंधित मुद्दे