문제

JDO와 함께 Google App Engine (Java)을 사용하고 있습니다. JDO에 해당하는 방법은 어떻게 할 수 있습니까?

select * from table where field like '%foo%'

지금까지 본 유일한 권장 사항은 루센을 사용하는 것입니다. 나는이 기본이 상자 외부에서 불가능하다는 것에 놀랐습니다.

도움이 되었습니까?

해결책

App Engine에서 이러한 종류의 하위 문자열 검색을 수행 할 수 없습니다. 그 이유는 App Engine Datastore가 확장 가능하도록 만들어졌으며 인덱스에 만족할 수없는 쿼리를 실행하는 것을 거부하기 때문입니다. 이와 같이 쿼리를 색인화하는 것은 불가능합니다. 각 레코드의 '필드'속성 전체를 일치하는 데 대한 전체를 검색해야하기 때문입니다. 이 쿼리를 실행하는 관계형 데이터베이스는 전체 테이블 스캔을 수행하고 각 레코드를 개별적으로 확인하여 실행할 수 없습니다.

이미 알게 된 바와 같이 솔루션은 Lucene과 같은 전체 텍스트 인덱싱을 사용하는 것입니다. 앱 엔진에서 Lucene을 실행하는 라이브러리가 있습니다. 가엘루 센. 이것은 또한 순진한 하위 문자열 일치보다는 적절한 전체 텍스트 검색의 힘을 제공합니다.

다른 팁

tl; dr: 자신의 다중 값 검색 속성을 관리하고 이에 대한 쿼리를 수행하십시오.

세부:간단하고 DIY를 찾는 사람들을 위해 다음을 수행 할 수 있습니다.

  1. 당신의 엔티티에서, 다중 값을 만듭니다 searchTerms 재산. 여기에는 엔티티의 검색 가능한 항목이 포함됩니다.

  2. 엔티티의 검색 가능한 텍스트를 단어로 나눕니다. 이 단어는 엔티티의 유일한 검색 가능한 부분이 될 것입니다. 공백을 분할하여 시작하거나 기본적인 줄기를 추가 할 수 있습니다. 예 : 이메일 주소를 처리 할 때는 모두 검색 할 수 있도록 사용자와 도메인 부품을 별도로 배치 할 수 있습니다. 엔티티가 업데이트되면이 속성을 재건해야합니다.

  3. 검색을 수행하려면 검색 입력을 단어로 나누고 (필요한 경우 기본 스템 수행) Equals 연산자를 사용하여 각각을 필터로 추가하십시오. searchTerms 재산.

    (그만큼 = 다중 값 속성의 운영자는 다음을 묻습니다 어느 값은 필터와 같습니다.)

    EG (사용 객관화):

    Query query = dao.ofy().query(Recipe.class);
    for (String term : search.toLowerCase().split(" ")) {
      query = query.filter("searchTerms =", term);
    }
    

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top