Android Room database FTS

사용 언어: Kotlin 1.9.22
사용 버전: Android Studio Iguana 2023.2.1


안드로이드 Room database FTS를 알아보겠습니다.



FTS는 Sqlite에서 제공해 주는 Full-text search(글자 검색)를 위한 가상의 table(테이블)입니다.
아래는 Sqlite fts 문서입니다.
https://www.sqlite.org/fts3.html


이 문서에 따르면 517,430개의 data에서 어떠한 글자를 찾는데 일반 table은 22.5초가 걸린 반면 FTS3에서는 0.03초 밖에 안 걸렸다고 하네요.





Sqlite 기반인 Room 또한 FTS를 지원합니다.

Android Room Fts4 문서입니다.



우리는 DBA(데이터베이스 관리자)가 될 만큼 지식이 많이 필요하지 않기 때문에 바로 Summary를 봐줍니다.

Sqlite 문서입니다.






여기에 따르면 FTS tables는 일반 table과 같이 INSERT, UPDATE 그리고 DELETE로 관리합니다. 자료를 가져오는 것은 동일하게 SELECT를 사용합니다.

다른 점은 아래와 같습니다.

  1. 다른 가상 테이블과 마찬가지로 색인을 만들거나 트리거를 붙일 수 없습니다. 추가적인 column은 ALTER TABLE로 추가하거나 이름을 변경할 수 있습니다.

  2. rowId를 제외한 모든 columns는 TEXT 형식입니다.

  3. rowId 대신 사용할 수 있는 docId를 제공합니다.

  4. FTS MATCH 명령어로 full-text를 검색할 수 있습니다.

  5. FTS auxiliary 함수를 제공합니다. snippet(), offsets() 그리고 matchinfo()가 있습니다.

  6. 모든 FTS tables는 숨겨진 column이 있습니다. 테이블 이름과 동일하며, blob 타입으로 MATCH나 FTS auxiliary functions에 사용하기 좋습니다.





FTS table 또한 wild card가 있는데요.

'*'는 어떠한 글자도 포함하는 것입니다.

':'은 특정한 column에서만 찾을 때 사용합니다.

'^'는 처음 시작하는 글자만 찾습니다.

'"'는 특정한 형식으로 구성된 글자를 찾습니다.

'NEAR'은 두 단어 사이에 1~10가지 단어가 있는 것을 찾습니다.

'AND'는 모두 만족하는 것을 찾습니다.

'OR'은 하나만 만족해도 찾습니다.

'NOT'은 아닌 것을 찾습니다.



자세한 내용은 Full-text Index Queries 항목을 보세요.







FTS는 위에서 설명한 특징이 있습니다.

Room에서는 숨겨진 column은 rowid입니다. 이것은 Int이며, 나머지는 String을 가집니다.

그리고 Entity 밑에 Fts4 annotation을 가집니다.









실제로 적용해 봅시다.



AirportFtsEntity.kt

AirportFtsEntity를 만들어줍니다.









그다음 Dao도 만들어줍니다.

AirportFtsDao.kt

위에서 배운 와일드카드도 넣어줍니다.








AppDatabase.kt

Database에도 방금 만든 AirportFtsEntity, airportFtsDao를 추가해 줍니다.






DaoModule.kt

저는 Hilt를 사용해서 Module을 사용합니다.

DaoModule에도 provideAirportFtsDao를 만듭니다.




AirportsFtsRepository.kt

AirportsFtsDataSource.kt

DataSourceModule.kt

RepositoryModule.kt

위의 4개의 파일에 의존성을 추가해 줍니다. Hilt를 위한 설정이라 여기서 설명은 하지 않겠습니다.







AirportEntity.kt

AirportEntity를 FtsEntity로 변경하는 extension 함수를 만듭니다.





SearchFlightApplication.kt

onCreate에 여러 종속성을 연결하고 airportsEntity를 airportsFtsEntity로 변경하여 넣어줍니다.









이제, 검색은 Fts를 사용해서 진행해 줍니다.

GetSuggestionsStreamUseCase.kt

airportsFtsRepository.searchAirportsStream(query)를 사용해서 검색하는 것을 볼 수 있습니다.







실행해 봅시다.






참고 프로젝트:



끝.


댓글

이 블로그의 인기 게시물

Python urllib.parse.quote()

Python OpenCV 빈 화면 만들기

tensorflow tf.random.uniform()

Android Notification with Full Screen

KiCad 시작하기 2 (PCB 만들기)

Android Minimum touch target size

Python bs4.SoupStrainer()

KiCad 시작하기 4 (기존 회로도 수정 및 추가)

음악 총보(Score), 파트보(Part)

tensorflow tf.expand_dims()