2011-08-10 12 views
10

"Benjamin" değerine sahip lastName adında bir varlık var. Kullanıcı "Ben" veya "reçel" veya "Benja" koyarsa, nesnel olarak bir yol var mı. Bu varlığı hala query.filter() kullanarak bulabilirim. Sorguyu, kontrol ettiğim diğer arama kriterleri olduğu için kullanmalıyım.Nesneleri kullanarak bir nesnedeki alt dizeyi arayın

"Start with" operatörü olarak adlandırılan "Obgaektify" öğesinde bir şey gördüm. ama bu çalışmıyor. Herhangi bir öneri takdir edilecektir. Teşekkürler

+1

Neden bir alt dize araması yapmak istiyorsunuz? Bunun için hiç iyi bir kullanım durumu görmedim. –

+0

Bu isimler içinde geçerli değil. Genel olarak metin araması içinde. ama sadelik için sadece isim dedim :) –

+3

Eh, soru kaldı. Tam metin arama, normalleştirmeyi ve normalleştirmeyi yapmaz, daha sonra tüm kelimeler üzerinde arama yapar, çünkü 'cat' return 'defecate' için bir sorguya sahip olmanın çok az noktası vardır. –

cevap

12

ancakharf duyarlı advantag alarak simüle edilebilir "ile başlar", alt dize için hayır "GİBİ" tipi sorguları var Dizinler üzerinde > ve < işleçlerinin e.

// 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"); 

sorgu "Ben" ile başlayıp öğeler için name özelliğini 'ara' ve \ufffd mümkün olan en yüksek unicode karakter "Ben\ufffd", daha az olacaktır. Ben dizgeciklere yöntemini kullandık

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', burada kullanılabilecek kurallı 'en büyük UTF karakteridir'. –

+0

Bu benim için çalıştı. Yardımınız için teşekkürler :) –

+0

Cool Shady, yeşil onay işaretini tıklayarak cevabı kabul edin, bu size yanıt sahibi 2rep, rep verir ve sorunun çözüldüğünü başkalarına gösterir. –

2

İçerisinde benzer sorgularda standart mevcut bir dizin bulunmamaktadır. BTW, her zaman kendi tanıtımı yapabilirsiniz. Bu durumda size yapabilirsiniz: Tüm mevcut kombinasyonlarıyla lastNameIndex alanını dolduracak @PrePersist olarak işaretlenmiş String[] lastNameIndex

  • eklenti yöntemine gibi

    1. eklenti ve sentetik alanını
    2. Bu indeks query.filter('lastNameIndex =', val) yapmak kullanarak varlıkları bulmak istiyorum
  • 0

    , burada somutlaştırabilir V4 için bir sorgu filtresi oluşturmak için koddur.

    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();} 
    

    Bu daha sonra, bir çift taraflı alanı tanımlamak standart ofy sorgular ve SearchService süreci sağlar: Burada Java kodudur.

    +0

    "<" \ ufffd "olması gerektiğine inanıyorum. <= Çünkü FFFD yazdırılabilir bir ascii karakter olmadığından, bunu hariç tutmak istiyorsunuz. Pratikte muhtemelen önemli değil. Yanlışsam düzelt. –

    +0

    Teşekkürler Oliver, haklısın. Cevabımı değiştirdim! – Zensursula

    0

    : Chris cevap ve birlikte Nick yorumunu koymak

    İlgili konular