문제

정말 간단합니다.SQL에서 텍스트 필드에서 몇 개의 문자를 검색하려면 다음을 수행할 수 있습니다.

SELECT blah FROM blah WHERE blah LIKE '%text%'

App Engine 문서에는 이를 달성하는 방법에 대한 언급이 없지만 확실히 충분히 일반적인 문제일까요?

도움이 되었습니까?

해결책

App Engine의 데이터베이스 백엔드인 BigTable은 수백만 개의 레코드로 확장됩니다.이로 인해 App Engine에서는 테이블 스캔을 초래하는 쿼리 수행을 허용하지 않습니다. 테이블이 잘 채워지면 성능이 저하되기 때문입니다.

즉, 모든 쿼리는 인덱스를 사용해야 합니다.이것이 당신이 할 수있는 이유입니다 =, > 그리고 < 쿼리.(사실 당신도 할 수 있습니다 != 하지만 API는 다음의 조합을 사용하여 이를 수행합니다. > 그리고 < 쿼리.) 이것이 바로 개발 환경이 사용자가 수행하는 모든 쿼리를 모니터링하고 누락된 인덱스를 자동으로 추가하는 이유이기도 합니다. index.yaml 파일.

색인을 생성할 방법이 없습니다. LIKE 쿼리를 수행하면 단순히 사용할 수 없습니다.

시계를 가지고 이번 Google IO 세션 이에 대한 훨씬 더 좋고 자세한 설명을 원하시면.

다른 팁

나도 같은 문제에 직면해 있는데 Google 앱 엔진 페이지에서 뭔가를 발견했습니다.

팁:쿼리 필터에는 문자열 값의 일부만 일치시키는 명시적인 방법이 없지만 불일치 필터를 사용하여 접두사 일치를 가짜로 만들 수 있습니다.

db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2",
            "abc",
            u"abc" + u"\ufffd")

이는 모든 MyModel 엔터티를 abc 문자로 시작하는 문자열 속성 prop과 일치시킵니다.유니코드 문자열 u"\ufffd"는 가능한 가장 큰 유니코드 문자를 나타냅니다.속성값을 인덱스로 정렬할 때 해당 범위에 속하는 값은 해당 접두사로 시작하는 모든 값입니다.

http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html

어쩌면 이것이 트릭을 할 수도 있습니다;)

App Engine은 LIKE 쿼리를 지원하지 않지만 속성을 살펴보세요. 목록속성 그리고 문자열목록속성.이러한 속성에 대해 동일성 테스트가 수행되면 테스트는 실제로 모든 목록 멤버에 적용됩니다. list_property = value 값이 목록의 아무 곳에나 나타나는지 테스트합니다.

때때로 이 기능은 LIKE 쿼리 부족에 대한 해결 방법으로 사용될 수 있습니다.예를 들어, 다음을 수행할 수 있습니다. 이 게시물에 설명된 대로 간단한 텍스트 검색.

당신은 사용해야합니다 검색 서비스 SQL과 유사한 전체 텍스트 검색 쿼리를 수행합니다. LIKE.

게릭 더 많은 작업을 수행할 수 있도록 도메인별 언어를 제공합니다. 사용자 친화적인 검색어.예를 들어 다음 스니펫은 제목이 다음을 포함하는 최신 도서에서 정렬된 처음 10권의 도서를 찾습니다. fern정확히 일치하는 장르 thriller:

def documents = search.search {
    select all from books
    sort desc by published, SearchApiLimits.MINIMUM_DATE_VALUE
    where title =~ 'fern'
    and genre =  'thriller'
    limit 10
}

Like는 Groovy의 일치 연산자로 작성되었습니다. =~.다음과 같은 기능을 지원합니다. distance(geopoint(lat, lon), location) 또한.

App Engine이 범용 출시됨 전문 검색 서비스 데이터 저장소를 지원하는 버전 1.7.0.

자세한 내용은 발표.

사용 방법에 대한 추가 정보: https://cloud.google.com/appengine/training/fts_intro/lesson2

Objectify를 살펴보세요 여기 , 이는 Datastore 액세스 API와 같습니다.구체적으로 이 질문에 대한 FAQ가 있습니다. 여기에 답변이 있습니다.

좋아요 쿼리(LIKE "foo%")를 어떻게 수행하나요?
저장하고 검색할 때 순서를 반대로 하면 startWith 또는 endWith와 같은 작업을 수행할 수 있습니다.원하는 시작 값과 원하는 값 바로 위의 값을 사용하여 범위 쿼리를 수행합니다.

String start = "foo";
    ... = ofy.query(MyEntity.class).filter("field >=", start).filter("field <", start + "\uFFFD");

여기를 따르세요:init.py#354">http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/초기화.py#354

효과가있다!

class Article(search.SearchableModel):
    text = db.TextProperty()
    ...

  article = Article(text=...)
  article.save()

To search the full text index, use the SearchableModel.all() method to get an
instance of SearchableModel.Query, which subclasses db.Query. Use its search()
method to provide a search query, in addition to any other filters or sort
orders, e.g.:

  query = article.all().search('a search query').filter(...).order(...)

나는 이것을 GAE Datastore 하위 수준 Java API로 테스트했습니다.나와 완벽하게 작동합니다

    Query q = new Query(Directorio.class.getSimpleName());

    Filter filterNombreGreater = new FilterPredicate("nombre", FilterOperator.GREATER_THAN_OR_EQUAL, query);
    Filter filterNombreLess = new FilterPredicate("nombre", FilterOperator.LESS_THAN, query+"\uFFFD");
    Filter filterNombre =  CompositeFilterOperator.and(filterNombreGreater, filterNombreLess);

    q.setFilter(filter);

일반적으로 이 게시물은 오래된 게시물이더라도 'LIKE' 또는 'ILIKE'를 생성하는 방법은 '>=' 쿼리에서 모든 결과를 수집한 다음, 원하는 내용이 포함된 요소에 대해 Python(또는 Java)에서 결과를 반복하는 것입니다. 찾고 있어요.

q='luigi'가 주어진 사용자를 필터링하고 싶다고 가정해 보겠습니다.

users = []
qry = self.user_model.query(ndb.OR(self.user_model.name >= q.lower(),self.user_model.email >= q.lower(),self.user_model.username >= q.lower()))

for _qry in qry:
 if q.lower() in _qry.name.lower() or q.lower() in _qry.email.lower() or q.lower() in _qry.username.lower():
      users.append(_qry)

데이터 저장소 앱 엔진에서는 LIKE 검색을 수행할 수 없습니다. 그러나 문자열에서 단어를 검색해야 하는 경우 Arraylist를 만드는 것이 트릭을 수행할 수 있습니다.

@Index
    public ArrayList<String> searchName;

그런 다음 objectify를 사용하여 인덱스를 검색합니다.

List<Profiles> list1 = ofy().load().type(Profiles.class).filter("searchName =",search).list();

그러면 검색에서 검색한 세계가 포함된 모든 항목이 포함된 목록이 제공됩니다.

만약 LIKE '%text%' 항상 한두 단어(순열을 생각해 보세요)와 비교하고 데이터가 천천히 변경됩니다(천천히 의미하는 것은 인덱스를 생성하고 업데이트하는 데 가격 측면과 성능 측면 모두 엄청나게 비싸지 않다는 의미). RIE(Relation Index Entity)는 대답.

예, 추가 데이터 저장소 엔터티를 구축하고 적절하게 채워야 합니다.예, 해결해야 할 몇 가지 제약 조건이 있습니다(하나는 GAE 데이터 저장소의 목록 속성 길이에 대한 5000 제한입니다).그러나 결과 검색은 매우 빠릅니다.

자세한 내용은 내 Java 및 Ojbectify를 사용한 RIE 그리고 Python을 사용한 RIE 게시물.

"좋아요"는 가난한 사람이 텍스트 검색을 대신하는 단어로 자주 사용됩니다.텍스트 검색의 경우 다음을 사용할 수 있습니다. Whoosh-AppEngine.

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