Google Firestore : 속성 값의 하위 문자열에 대한 쿼리 (텍스트 검색)
간단한 검색 필드를 추가하고 싶습니다. 다음과 같은 것을 사용하고 싶습니다.
collectionRef.where('name', 'contains', 'searchTerm')
을 사용해 보았지만 where('name', '==', '%searchTerm%')
아무것도 반환하지 않았습니다.
그런 운영자가 없다, 허용 사람은 ==
, <
, <=
, >
, >=
.
당신은 사이의 시작이 그 모든 것을 예를 들어, 단지 접두사에 의해 필터링 할 수 있습니다 bar
및 foo
사용할 수있는
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은 기본 인덱싱을 지원하지 않거나 문서에서 텍스트 필드를 검색합니다. 또한 클라이언트 측에서 필드를 검색하기 위해 전체 컬렉션을 다운로드하는 것은 실용적이지 않습니다.
Algolia 및 Elastic 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}`)
'IT TIP' 카테고리의 다른 글
'gc'와 'gccgo'의 주요 차이점은 무엇입니까? (0) | 2020.10.24 |
---|---|
.NET Core (비 ASP.NET Core) 프로젝트 용 VS2017 솔루션 탐색기에서 파일을 중첩 할 수 있습니까? (0) | 2020.10.24 |
.NET에 XML 직렬화 가능한 사전이없는 이유는 무엇입니까? (0) | 2020.10.24 |
사용자 정의 속성의 생성자는 언제 실행됩니까? (0) | 2020.10.24 |
Java : 특정 큐 크기 이후 제출시 차단되는 ExecutorService (0) | 2020.10.24 |