2011-08-10 4 views
10

값이 "벤자민"인 lastName이라는 엔티티가 있습니다. 사용자가 "Ben"또는 "jam"또는 "Benja"를 입력하면 객체 화하는 방법이 있습니까? 나는 여전히 query.filter()를 사용하여이 엔티티를 찾을 수 있습니다. 나는 다른 검색 기준을 검사하고 있으므로 쿼리를 사용해야합니다.objectify를 사용하여 엔티티 내에서 하위 문자열 검색

"Obgaektify"에서 "starts with"연산자를 보았습니다. 그러나 그것은 작동하지 않습니다. 모든 제안을 부탁드립니다. 감사합니다

+1

왜 이름에서 부분 문자열 검색을 원하십니까? 나는 이것을 위해 좋은 유스 케이스를 본 적이 없다. –

+0

이름이 actully가 아닙니다. 그것은 일반적으로 텍스트 검색 내에 있습니다. 그러나 단순함을 위해 나는 단지 이름을 말했다 : –

+3

음, 질문은 남아 있었다. Fulltext 검색은 형태소 분석과 정규화를 수행 한 다음 전체 단어를 검색합니다. 'cat'을 반환하는 'defecate'에 대한 쿼리가 거의 존재하지 않기 때문입니다. –

답변

12

는 그러나대소 문자를 구별는 advantag을 고려하여 시뮬레이션 할 수있다 "로 시작", 하위 문자열에 대한 "LIKE"유형의 쿼리를이 없습니다 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"); 

쿼리는 "벤"으로 태초 항목에 대한 name 속성을 '검색'및 \ufffd이 가장 높은 유니 코드 문자 "Ben\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'는 여기에서 사용할 수있는 표준 '최대 UTF 문자'입니다. –

+0

이것은 나를 위해 일했습니다. 도와 줘서 고마워. –

+0

차가운 그늘진, 초록색 눈금을 쳐서 답을 받아 들인다. 이것은 2rep, 답 주인에게 rep를주고 다른 사람들에게 질문이 해결되었음을 알려준다. –

2

포함하는 쿼리에 대한 표준 기존 인덱스가 없습니다. Btw, 당신은 항상 자신을 소개 할 수 있습니다. 이 경우에 당신은 할 수있는 모든 가능한 조합 lastNameIndex 필드를 채울 것 @PrePersist로 표시 String[] lastNameIndex

  • 추가 방법 등의

    1. 추가 및 합성 필드를
    2. 이 지수는 query.filter('lastNameIndex =', val)을 사용하여 엔티티를 찾으려면
  • 0

    , 여기 객관화 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();} 
    

    이 후, 교환 형 필드를 정의 표준 중 Y의 쿼리와 SearchService을 처리 할 수 ​​있습니다 : 여기에 자바 코드입니다.

    +0

    FFFD는 인쇄 할 수있는 ASCII 문자가 아니기 때문에'< "\ ufffd"'가 아닌'<='이 아니라고 생각합니다. 그래서 제외 시키려합니다. 실제로 그것은 아마도 문제가되지 않습니다. 틀 렸으면 고쳐줘. –

    +0

    감사합니다 올리버, 당신 말이 맞아요. 내 대답을 수정했습니다! – Zensursula

    0

    : 크리스의 대답과 함께 닉에서 주석을 넣기

    관련 문제