IT TIP

Google Firestore : 속성 값의 하위 문자열에 대한 쿼리 (텍스트 검색)

itqueen 2020. 10. 24. 12:08
반응형

Google Firestore : 속성 값의 하위 문자열에 대한 쿼리 (텍스트 검색)


간단한 검색 필드를 추가하고 싶습니다. 다음과 같은 것을 사용하고 싶습니다.

collectionRef.where('name', 'contains', 'searchTerm')

을 사용해 보았지만 where('name', '==', '%searchTerm%')아무것도 반환하지 않았습니다.


그런 운영자가 없다, 허용 사람은 ==, <, <=, >, >=.

당신은 사이의 시작이 그 모든 것을 예를 들어, 단지 접두사에 의해 필터링 할 수 있습니다 barfoo사용할 수있는

collectionRef.where('name', '>=', 'bar').where('name', '<=', 'foo')

이를 위해 Algolia 또는 ElasticSearch 와 같은 외부 서비스를 사용할 수 있습니다 .


제한이 진행되는 한 Kuba의 대답은 사실이지만 세트와 같은 구조로 부분적으로 에뮬레이션 할 수 있습니다.

{
  'terms': {
    'reebok': true,
    'mens': true,
    'tennis': true,
    'racket': true
  }
}

이제 다음으로 쿼리 할 수 ​​있습니다.

collectionRef.where('terms.tennis', '==', true)

이는 Firestore가 모든 필드에 대해 자동으로 색인을 생성하기 때문에 작동합니다. 불행히도 이것은 Firestore가 자동으로 복합 색인을 생성하지 않기 때문에 복합 쿼리에 대해 직접 작동하지 않습니다.

단어 조합을 저장하여이 문제를 해결할 수 있지만 속도가 너무 빠릅니다.

여전히 아웃 보드 전체 텍스트 검색을 사용하는 것이 좋습니다 .


Firebase는 문자열 내에서 용어 검색을 명시 적으로 지원하지 않지만

Firebase는 (현재) 귀하의 사례와 다른 많은 문제를 해결할 다음을 지원합니다.

2018 년 8 월부터 array-contains쿼리 를 지원 합니다. 참조 : https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html

이제 모든 주요 용어를 필드로 배열에 설정 한 다음 'X'가 포함 된 배열이있는 모든 문서를 쿼리 할 수 ​​있습니다. 논리 AND를 사용하여 추가 쿼리에 대한 추가 비교를 수행 할 수 있습니다. (Firebase 는 현재 여러 배열 포함 쿼리에 대한 복합 쿼리를 기본적으로 지원하지 않으므로 'AND'정렬 쿼리는 클라이언트 측에서 수행해야합니다.)

이 스타일로 배열을 사용하면 동시 쓰기에 최적화 될 수 있습니다. 일괄 요청을 지원하는지 테스트하지 않았지만 (문서는 말하지 않음) 공식 솔루션이기 때문에 그렇게 할 것입니다.


용법:

collection("collectionPath").
    where("searchTermsArray", "array-contains", "term").get()

경우 FireStore 워드 프로세서 , 클라우드 경우 FireStore은 기본 인덱싱을 지원하지 않거나 문서에서 텍스트 필드를 검색합니다. 또한 클라이언트 측에서 필드를 검색하기 위해 전체 컬렉션을 다운로드하는 것은 실용적이지 않습니다.

AlgoliaElastic Search같은 타사 검색 솔루션 이 권장됩니다.


@Kuba의 답변에 동의하지만 접두사 검색에 완벽하게 작동하려면 작은 변경 사항을 추가해야합니다. 여기 나를 위해 일한 것

이름으로 시작하는 레코드 검색 queryText

collectionRef.where('name', '>=', queryText).where('name', '<=', queryText+ '\uf8ff').

\uf8ff쿼리에 사용 된 문자 는 유니 코드 범위에서 매우 높은 코드 포인트입니다 (PUA (Private Usage Area) 코드). 유니 코드에서 대부분의 일반 문자 뒤에 있기 때문에 쿼리는로 시작하는 모든 값과 일치합니다 queryText.


늦은 답변이지만 여전히 답변을 찾고있는 모든 사용자를 위해 사용자 컬렉션이 있고 컬렉션의 각 문서에 "username"필드가 있으므로 사용자 이름이 "al"로 시작하는 문서를 찾고 싶다면 우리는 다음과 같이 할 수 있습니다

 FirebaseFirestore.getInstance().collection("users").whereGreaterThanOrEqualTo("username", "al")

나는 방금이 문제가 있었고 매우 간단한 해결책을 찾았습니다.

String search = "ca";
Firestore.instance.collection("categories").orderBy("name").where("name",isGreaterThanOrEqualTo: search).where("name",isLessThanOrEqualTo: search+"z")

isGreaterThanOrEqualTo를 사용하면 검색 시작 부분을 필터링하고 isLessThanOrEqualTo 끝에 "z"를 추가하여 다음 문서로 롤오버되지 않도록 검색을 제한합니다.


Algolia와 같은 타사 서비스를 사용하고 싶지 않다면 Firebase Cloud Functions 가 훌륭한 대안입니다. 입력 매개 변수를 수신하고 서버 측 레코드를 처리 한 다음 기준과 일치하는 항목을 반환 할 수있는 함수를 만들 수 있습니다.


I actually think the best solution to do this within Firestore is to put all substrings in an array, and just do an array_contains query. This allows you to do substring matching. A bit overkill to store all substrings but if your search terms are short it's very very reasonable.


We can use the back-tick to print out the value of a string. This should work:

where('name', '==', `${searchTerm}`)

참고URL : https://stackoverflow.com/questions/46568142/google-firestore-query-on-substring-of-a-property-value-text-search

반응형