2011-08-10 14 views
10

का उपयोग कर किसी इकाई के भीतर सबस्ट्रिंग के लिए खोजें मेरे पास "बेंजामिन" मान के साथ अंतिम नाम नामक एक इकाई है। क्या यह स्पष्ट करने का कोई तरीका है कि यदि उपयोगकर्ता "बेन" या "जाम" या "बेंजा" डालता है। मैं अभी भी query.filter() का उपयोग कर इस इकाई को खोजने में सक्षम हूं। मुझे क्वेरी का उपयोग करना चाहिए क्योंकि अन्य खोज मानदंड Iam जांच रहे हैं।ऑब्जेक्ट

मैंने ऑपरेटर के साथ "शुरूआत" नामक "Obgaektify" में कुछ देखा। लेकिन यह काम नहीं कर रहा है। किसी भी सुझाव की सराहना की जाएगी। धन्यवाद

+1

आप नामों के भीतर एक सबस्ट्रिंग खोज क्यों करना चाहते हैं? मैंने इसके लिए कभी भी अच्छा उपयोग-मामला नहीं देखा है। –

+0

यह नामों के भीतर नामों में नहीं है। यह सामान्य रूप से पाठ खोज के भीतर है। लेकिन सादगी के लिए मैंने अभी नाम कहा :) –

+3

अच्छा, सवाल बनी रही। फुलटेक्स्ट सर्च स्टेमिंग और सामान्यीकरण करता है, फिर पूरे शब्दों पर खोज करता है, क्योंकि 'बिल्ली' रिटर्न 'हार' के लिए कोई पूछताछ करने में बहुत कम बिंदु है। –

उत्तर

12

वहाँ उप स्ट्रिंग के लिए कोई "की तरह" प्रकार के प्रश्नों, हालांकि एक केस संवेदी लाभ लेने से प्रेरित किया जा सकता है "के साथ शुरू होता है" सूचकांक पर > और < ऑपरेटरों का ई।

// The start string 
String searchStr = "Ben"; 

// emulate a "starts with" query 
Query q = new Query("MyEntity") 
q.addFilter("name", Query.FilterOperator.GREATER_THAN_OR_EQUAL, searchStr); 
q.addFilter("name", Query.FilterOperator.LESS_THAN, searchStr + "\ufffd"); 

क्वेरी आइटम कि "बेन" के साथ शुरुआत के लिए 'खोज' होगा name संपत्ति, और "Ben\ufffd", जहां \ufffd उच्चतम संभव यूनिकोड चरित्र है की तुलना में कम कर रहे हैं।

public <T> Query<T> fieldStartsWith(Query<T> query, String field, String search){ 
    query = query.filter(field + " >=", search); 
    return query.filter(field + " <", searchStr+"\ufffd"); 
} 
+0

'u' \ ufffd 'यहां उपयोग करने के लिए कैननिकल' सबसे बड़ा यूटीएफ चरित्र 'है। –

+0

यह मेरे लिए काम किया। आपकी मदद के लिए धन्यवाद :) –

+0

कूल शैडी, हरे रंग की टिक टिक कर जवाब स्वीकार करें, यह आपको 2rep देता है, उत्तर मालिक को प्रतिनिधि देता है और दूसरों को इंगित करता है कि प्रश्न हल हो गया है। –

2

इसमें शामिल प्रश्नों के लिए कोई मानक मौजूदा अनुक्रमणिका नहीं है। बीटीडब्ल्यू, आप हमेशा अपना परिचय दे सकते हैं। इस मामले में आप कर सकते हैं:

  1. जोड़ने और String[] lastNameIndex
  2. ऐड विधि @PrePersist के रूप में चिह्नित है कि सभी उपलब्ध संयोजनों के साथ lastNameIndex क्षेत्र भर जाएगा की तरह कृत्रिम क्षेत्र
  3. आप इस सूचकांक query.filter('lastNameIndex =', val) कर का उपयोग कर संस्थाओं और खोजना चाहते हैं
0

क्रिस से जवाब और एक साथ निक से टिप्पणी रखें, तो objectify V4 के लिए एक प्रश्न फिल्टर का निर्माण करने के कोड है।

private String tokenize(String phrase) { 
StringBuilder tokens = new StringBuilder(); 
try { 
    for (String word : phrase.split(" ")) { 
    if (word.length() < 1) { 
     continue; 
    } 
    int j = 1; 
    while (true) { 
     for (int i = 0; i < word.length() - j + 1; i++) { 
     tokens.append(word.substring(i, i + j)).append(" "); 
     } 
     if (j == word.length()) { 
     break; 
     } 
     j++; 
    } 
    } 
} catch (Throwable t) { 
    t.printStackTrace(); 
} 
return tokens.toString();} 

यह एक इंडेक्स करने योग्य क्षेत्र को परिभाषित करने के लिए, तो मानक Ofy प्रश्नों और SearchService की प्रक्रिया की अनुमति देता है: यहाँ जावा में कोड है।

+0

मेरा मानना ​​है कि यह '<" \ ufffd "' और '' = 'होना चाहिए क्योंकि एफएफएफडी एक प्रिंट करने योग्य असीसी चरित्र नहीं है, इसलिए आप इसे बाहर करना चाहते हैं। अभ्यास में शायद यह कोई फर्क नहीं पड़ता, हालांकि। यदि मैं गलत हूं तो मुझे सही करों। –

+0

धन्यवाद ओलिवर, आप सही हैं। मैंने अपना जवाब संशोधित किया! – Zensursula

0

मैं tokenization विधि का इस्तेमाल किया है:

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