Firebase 데이터베이스에서 문자열로 간단한 검색을 수행하는 방법은 무엇입니까?
제 앱에서 간단한 검색을 만들고 싶지만, 인터넷에서 검색에 대한 내용을 찾을 수 없습니다. 2014년보다 더 최근의 것입니다.더 좋은 방법이 있을 겁니다.startAt 기능과 endAt 기능이 있지만 예상대로 작동하지 않고 대소문자를 구분합니다.당신들은 이 문제를 어떻게 해결합니까?어떻게 이 기능이 2016년에도 여전히 존재하지 않을 수 있습니까?
저의 경우 다음과 같은 방법으로 SQL LIKE를 부분적으로 달성할 수 있었습니다.
databaseReference.orderByChild('_searchLastName')
.startAt(queryText)
.endAt(queryText+"\uf8ff")
캐터릭.\uf8ff
쿼리에 사용되는 코드는 유니코드 범위에서 매우 높은 코드 포인트입니다(Private Usage Area(PUA) 코드임).는 유코드에대의일반문으로 합니다.queryText
.
식으로 "하면 "Fred, Freddy, Frey"의 으로 ", 포함된 수 ._searchLastName
데이터베이스의 속성을 입력합니다.
두 문자열 변수 생성
searchInputToLower = inputText.getText().toString().toLowerCase();
searchInputTOUpper = inputText.getText().toString().toUpperCase();
그런 다음 쿼리에서 다음으로 설정합니다.
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Products");//Your firebase node you want to search inside..
FirebaseRecyclerOptions<Products> options =
new FirebaseRecyclerOptions.Builder<Products>()//the Products is a class that get and set Strings from Firebase Database.
.setQuery(reference.orderByChild("name").startAt(searchInputUpper).endAt(searchInputLower + "\uf8ff"),Products.class)
.build();
"이름"은 제품 기본 노드 내의 노드입니다.
.startAt(searchInputUpper) & .endAt(searchInputLower + "\uf8ff")를 사용하여 검색할 수 있습니다.
드디어 알겠습니다. SQL LIKE 키워드와 같은 결과를 얻기 위해 where 절을 사용할 수 있습니다.like%
또는%like
접두사:
Firestore.collection(collectionName).orderBy(field).where(field, ">=", keyword.toUpperCase()).where(field, "<=", keyword.toUpperCase() + "\uf8ff").get()
사용한 사례:
var query = 'text'
databaseReference.orderByChild('search_name')
.startAt(`%${query}%`)
.endAt(query+"\uf8ff")
.once("value")
이런 식으로 "테스트"로 검색하면 데이터베이스에서 "테스트 1, 콘테스트, 테스트 1"이 '검색' 속성 값으로 포함된 레코드를 얻을 수 있습니다.
Firebase는 noSQL이므로 SQL에서 찾을 수 있는 것처럼 검색이 내장되어 있지 않습니다.값/키를 기준으로 정렬하거나 다음과 같을 수 있습니다.
https://firebase.google.com/docs/database/android/retrieve-data
위의 링크에서 예제를 찾을 수 있습니다.그것은 소방 기지에 대한 최신 문서입니다.
검색과 같은 SQL을 찾고 있는 경우.그런 다음 탄력적인 검색을 살펴봅니다.그러나 플랫폼을 설치해야 하기 때문에 복잡성이 증가합니다.그것을 위해 나는 헤로쿠나 어쩌면 구글 클라우드 서버를 추천할 수 있습니다.
탄력적인 검색을 통한 고급 검색에 대한 블로그 게시물입니다. https://firebase.googleblog.com/2014/01/queries-part-2-advanced-searches-with.html
이 질문은 오래된 것일 수도 있지만 이러한 방식을 달성하는 방법에 대한 문서화된 방법이 있습니다. 구현은 간단합니다.인용:
Cloud Firestore 데이터의 전체 텍스트 검색을 활성화하려면 Algolia와 같은 타사 검색 서비스를 사용하십시오.각 노트가 문서인 노트 필기 앱을 생각해 보십시오.
알골리아는 당신의 일부가 될 것입니다.firebase functions
원하는 검색을 모두 수행합니다.
// Update the search index every time a blog post is written.
exports.onNoteCreated = functions.firestore.document('notes/{noteId}').onCreate(event => {
// Get the note document
const note = event.data.data();
// Add an 'objectID' field which Algolia requires
note.objectID = event.params.noteId;
// Write to the algolia index
const index = client.initIndex(ALGOLIA_INDEX_NAME);
return index.saveObject(note);
});
검색을 구현하는 가장 좋은 방법은 즉시 검색 - 안드로이드를 사용하는 것입니다.
샘플 검색 이미지: GIF
찾고 있는 기능을 전체 텍스트 검색이라고 하며, 이 기능은 텍스트 검색에 최적화된 형식(필터링에 최적화된 형식)으로 데이터를 저장해야 하기 때문에 대부분의 데이터베이스(Firebase 포함)에서 즉시 사용할 수 없는 기능입니다. 이러한 기능은 서로 다른 트레이드오프 집합을 가진 두 가지 다른 문제 집합입니다.
따라서 이 작업을 수행하려면 별도의 전체 텍스트 검색 엔진을 Firebase와 함께 사용해야 합니다. 특히 페이싱, 타이포 톨러런스, 머천다이징 등의 기능이 필요한 경우에는 더욱 그렇습니다.
전체 텍스트 검색 엔진에는 다음과 같은 몇 가지 옵션이 옵션은 다음과 같습니다.
- 쉽게 시작하고 실행할 수 있지만 빠르게 비싸질 수 있는 알골리아가 있습니다.
- 학습 곡선이 가파르지만 매우 유연한 ElasticSearch가 있습니다.
- 알골리아를 대체할 오픈 소스를 목표로 하는 Typesense가 있습니다.
이 접근 방식의 확실성은 모르겠지만 안드로이드에서 파이어베이스 버전 10.2.6을 사용하면 다음과 같은 작업을 수행할 수 있습니다.
firebaseDatabase.getReference("parent")
.orderByChild("childNode")
.startAt("[a-zA-Z0-9]*")
.endAt(searchString)
가끔은 잘 되는 것 같습니다.
이에 대한 답변을 위해 드디어 SO에 가입했습니다.python firestore.client에서 여기로 오는 모든 사람을 위한 솔루션이 있습니다.승인된 답변의 개념을 기반으로 하지만 db.reference()가 아닌 클라이언트를 통해 이루어지며 사용자 12750908의 답변과 혼합됩니다.
from firebase_admin import firestore
users = db.collection("users")\
.order_by("last_name")\
.where("last_name", ">=", last_name.upper())\
.where("last_name", "<=", last_name.lower() + "\uf8ff")\
.stream()
제가 했던 간단한 테스트에는 효과가 있지만, 나중에 문제가 생기면 답변을 업데이트하겠습니다.그리고 다시 한 번 상기시켜 드리자면, 이것은
LIKE search%
그리고 아닌
LIKE %search%.
편집 1 질문에 대한 태그를 보지 못했지만 제목 속성에 Android가 포함되어 있으므로 질문에 직접 대답할 필요는 없지만 Python API가 있다면 이 기능이 작동할 것입니다.유감스럽게도 안드로이드 버전에서 파이어베이스 관리자 파이썬에서와 같은 클라이언트/DB 분리가 있는지 잘 모르겠습니다.유사한 답변을 찾는 동안 소방서 고객에 대한 답변을 보지 못했기 때문에 답변을 삭제하고 싶지 않았으며 다른 사람에게 도움이 되기를 바랍니다.
편집 09-03-2020 이것은 보이는 시간의 일부로 작동합니다.대부분 문제가 없는 것 같았지만, 다른 프로젝트에 적용했을 때 예상치 못한 결과가 나왔습니다.간단히 말해서 비교 중인 데이터를 저장하는 방법을 복제해야 할 수도 있습니다.예를 들어 last_name을 모든 대문자로 저장하는 필드와 소문자로 저장하는 다른 필드가 필요할 수 있습니다. 그런 다음 첫 번째 where 절을 last_name_upper를 비교하는 것으로 변경하고 두 번째 where 절을 last_name_lower 대소문자를 비교하는 것으로 변경합니다.지금까지 제 두 번째 프로젝트에서는 이것이 더 정확한 결과를 산출하는 것으로 보이므로 이전 답변이 잘 작동하지 않으면 시도해 보는 것이 좋습니다.
EDIT 09-07-2020 09-03-2020 이전 편집이 부분적으로 정확합니다.제가 급하게 그것을 완전히 해결했다고 생각하는 동안, 저는 파이어베이스가 여러분이 다른 분야에서 <, >, <=, >=를 사용할 수 없도록 한다는 것을 완전히 잊었습니다.두 개의 쿼리를 수행하고 병합해야 할 수도 있지만, 실제 의도한 것보다 더 많은 문서를 읽을 수 있습니다.적절한 검색어를 사용하여 상위 버전 또는 하위 버전과 비교하면 원래 답변에서 예상한 원래 결과가 제공되는 것 같습니다.예:
.orderBy("last_name_upper")
.where("last_name_upper", ">=", this.searchForm.text.toUpperCase())
.where("last_name_upper", "<=", this.searchForm.text.toUpperCase() + "\uf8ff")
파이어베이스 문서에서는 전체 텍스트 검색을 지원하지 않습니다.그러나 이를 위해 타사 도구를 사용할 수 있습니다.
자세한 내용은 이 링크를 참조하십시오. https://firebase.google.com/docs/firestore/solutions/search
만약 당신이 만족스럽지 않다면.orderBy
알고리즘/탄력적 검색의 추가 비용과 복잡성을 원하지 않는 경우 문서에 태그(문자열 배열)를 추가하는 것이 좋습니다.문서에 태그가 지정된 경우 Javascript(예)를 사용하여 자동 완성 기능이 있는 멋진 콤보 상자를 쉽게 만들 수 있습니다.그런 다음 배열 구성원 자격을 사용하여 선택한 태그를 기준으로 문서를 필터링할 수 있습니다.
언급URL : https://stackoverflow.com/questions/38618953/how-to-do-a-simple-search-in-string-in-firebase-database
'programing' 카테고리의 다른 글
UICollectionView, 전체 너비 셀, 동적 높이 자동 레이아웃 허용? (0) | 2023.06.20 |
---|---|
프로세스 닷넷을 시작할 수 없습니다.exe (0) | 2023.06.20 |
지역 깃브랜치가 존재하는지 알 수 있는 더 좋은 방법이 있습니까? (0) | 2023.06.20 |
sql에서 모든 그룹의 첫 번째 행 (0) | 2023.06.15 |
무작위 선택에 "필수 질문" 포함 (0) | 2023.06.15 |