내가 알고리즘이랑 라이브러리 디자인 능력이 부족해서 잘하는 사람들에게 피드백을 받고자 개발커뮤니티 여기저기 올리는 중임
---
간단한 시연 코드를 적은 runkit
---
수행하는 기능들은 다음과 같음
- 트라이 구조에 문자열을 저장
- 저장된 문자열을 트라이로부터 삭제
- 아호코라식 알고리즘을 사용해서 문자열 안에 존재하는 모든 트라이 속 문자열들을 탐색해서 반환
- 직렬화/역직렬화
---
만든 이유는 es 나 meilisearch 같은 검색엔진을 쓰기엔 부담스러운 상황에서 간단한 검색을 하기위해 만들엇음
-
나같은 경우 내가 운영중인 핫딜 키워드 알림 시스템에서 이걸 사용해서 핫딜 제목 안에 사용자들이 등록한 키워드들 중 어떤 키워드들이 잇는지를 빠르게 검색하려고 함
---
라이브러리로 만든 이유는 이 기능들을 내가 만든 여러개의 컨테이너에서 공통코드로 사용해서 관리용이성을 위해 라이브러리로 배포하게 되엇음
솔직하게 말하자면 저것도 잇지만 나보다 더 잘하는 사람들의 피드백과 컨트리뷰션을 받고싶은 마음도 큼
평소 자주 눈팅하는 사이트이기도 하고, 깃갤에서 누군가가 자작라이브러리를 올리고 또다른 누군가가 거기에 컨트리뷰션을 해주는 걸 보고 여기도 올려보게 됨
---
현재 보완이 필요하다고 생각하는 부분들은 이러함
먼저, 키워드를 새로 삽입할 때마다 아호코라식 연산을 수행하기 전에 필요한 failure link 를 만들어주는 과정을 계속 수행해야 함
hot reload 처럼 새로운 키워드가 들어와서 새로운 트라이들이 만들어질때, 딱 그거에 필요한 failure link 만을 만들고싶은데 그 방법이 없을까 고민하다가 막혓음
-
그 다음으로는, 현재까지 직렬화/역직렬화 시에 failure link 들을 저장하는데 실패햇단 점임
트라이 자체는 위에서 아래로 내려가는 단방향성이지만, 아호코라식을 위해 전처리로 만들어주는 failure link 의 경우는 순환적이잖음? root 애서 terminal 로 node 가 이어지다가 탐색에 실패하면 다시 root node 를 찍는 등의 상황이 발생하니깐.
이걸 어찌 해야하나 고민하다가 일단 직렬화/역직렬화 하는 과정에서 얘내는 일단 빼버리고 만듦
---
부족하기에 많은 조언을 부탁드립니다...
buildFailureLink를 따로해줘야하는게 구림
insert, bulkInsert 두개를 만들고 해당 메소드 내부구현으로 처리할듯
아무래도 그게 낫겟지? 사용자는 넣고 삭제하고 검색하는거만 알면 되니깐?
bulkInsert 는 이제 list of string 으로 받아서 처리하는거고, insert 는 string 으로 박아서 처리하는거 맞나?
ㅇㅇ 사용자가 그걸 알 필요가없음, 사용자는 CRUD만 알면 됨
고마워 그럼 그 부분은 은닉처리 하도록 할게
그리고 직렬화가 그렇게중요한 피쳐인가도 궁금하네, 앱 시작전에 초기화해주면 되잖음
이게 키워드를 삽입하는 컨테이너 따로, 문장을 넣고 키워드를 검색하는 키워드가 나뉘어져 잇는 상황이라 얘내들을 어딘가에 들고잇어야 할 필요성을 느껴서 serde 를 구현하게 되엇음 나같은 경우는 중간에 in memory kv storage 하나를 두고, 거기서 서로 넣고빼고 하면서 쓰는 상황임
serialize 종류도 여러개라 혼란스럽고 역직렬화도 그냥 stringfy parse 로 심플하게 하면어떨까싶음, 그리고 역직렬화후에 buildFailureLink도 역시 은닉하는게좋고
고마워 그 부분도 바로 반영할게
말한 기능들 전부 반영햇고, 문서 예제 코드도 추가하고, 벤치마크도 간단하게 해서 추가해봣어 많이 도움됏어 정말 고마워!