programing

Firebase 데이터베이스에서 문자열로 간단한 검색을 수행하는 방법은 무엇입니까?

magicmemo 2023. 6. 20. 21:30
반응형

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

반응형