2013-01-12 3 views
5

이것은 쉬운 질문이어야합니다. 그러나 the docs는 대답하지 않는 것 같습니다. 그들로부터 예제를 사용하여, 나는 이것을하고 싶다 :ndb 쿼리 부분 문자열 일치

Account.query(Account.title == "best") 

나는 부분 문자열도 일치시키고 싶다. 이 시나리오에서 그래서 :

acct = Account(title="the best account in the world") 

인수를 가진 NDB 쿼리 "최고"를 acct 일치합니다.

내가 볼 수있는 유일한 옵션은 Account.query()을 반복하고 각 titlere.search 모듈과 일치시키는 것입니다. 이것은 좋은 해결책처럼 보이지 않습니다.

업데이트 : 나는 또한 gql을보고있다. 이렇게 :

acct = ndb.gql('SELECT * from Account WHERE title LIKE '%best%') 

Parse Error: Invalid WHERE Condition at symbol LIKE

+0

GQL은 SQL이 아닙니다. –

답변

7

GQL 당신이 full text search를 사용할 필요가 있음을 달성하기 위해 일치하는 와일드 카드가없는 반환합니다.

3

제목과 같이 짧은 필드의 경우 제목의 각 단어가 포함 된 반복되는 StringProperty를 추가하면 (어쩌면 중지 단어는 무시함) 단어를 검색 할 수 있고 검색 API를 사용하는 것보다 간단 해집니다 .

+1

은 일반적인 관행입니까? 해킹처럼 보입니다. – mehulkar

+0

와우 .. 정말이 대답으로 놀랐어요. :-( – CIF

+0

다른 곳을 추천 해 봤지만 (죄송합니다. 링크가 없습니다.) – Trevor

5

참고 :이 질문에는 정확하게 대답하지 않지만 시작하기를 원하는 사람이이 대답을 유용하게 사용할 수 있습니다.

NDB의 문자열 필드는 (>=)보다 크고 (<) 개 미만의 검색을 수행 할 수 있도록 색인이 생성됩니다. 다음 Person 모델을 가정 :

class Person(ndb.Model): 
    name   = ndb.StringProperty() 
    name_lower = ndb.ComputedProperty(lambda self: self.name.lower()) 

당신은 다음과 같은 작업을 수행 할 수

def search_by_text(text): 
    text = text.lower() 
    limit = text[:-1] + chr(ord(text[-1]) + 1) 
    return Person.query(Person.name_lower >= text, Person.name_lower < limit).fetch(50) 

p = search_by_text('kri') 

이 예에서 limit 변수가 문자열 'krj'를 포함하고 검색 값의 한계를하게됩니다. 위의 내용은 kri보다 크지 만 krj보다 작은 모든 사람들을 얻게되며 처음 50 개 결과로 제한됩니다. 제한 때문에 krosslark과 같은 이름은 걸러집니다.

참고 : 검색 할 필드의 소문자 버전을 포함하려면 ndb.ComputedProperty이 있어야합니다. 그것을 추가하는 것을 잊지 마십시오!

+0

이것은 내가보기에 가장 좋은 해결책입니다. 전체 텍스트 검색을 구현할 필요없이 간단한 부분 문자열 일치 검색을 찾을 수 있습니다. – werm098