모든 옵션 사용시 검색 액션이 두 번 들어가는 구조입니다.
옵션 1 따로 가고요.
(옵션1 고성능 검색이 가능할 경우 시도 - 자동완성, 등등)
옵션 1 - 키워드
옵션 2~9 따로 갑니다.
(아래는 완전일치)
옵션 2 - 지역? - trip_destination
옵션 3 - 일시? - trip_start_date / trip_end_date
옵션 4 - 선호성별? - trip_wanted_sex
옵션 5 - 경비? - trip_cost <<< 추후에 뺄 수도 있음
옵션 6 - 인원수? - trip_max_buddies_counts <<< 추후에 뺄 수도 있음
옵션 7 - 만남장소? - trip_meet_location <<< 추후에 뺄 수도 있음
(만약에 속도느리면 인덱싱 걸고...)
(아래2개는 세개 중 한개라도 일치하는것 다 가져온다음에, 가능하면 우선순위로 필터링)
옵션 8 - 테마? - trip_themes
옵션 9 - 선호버디즈성향? - trip_wanted_buddies
==> 1 따로 가서 배열하나 받고, 2~9 따로 가서 배열하나 받아서 중복 제거
일부를 옵션으로 선택했을 경우에는 아래와 같습니다.
옵션 1 키워드만 했을때
키워드만 검색했을때 로직은 옵션2~10까지는 고려하지 않고,
trips 테이블에서 isValidate 가 true 인 모임 중에서
trip_title 과 trip_content 에서 키워드와 일치하는 trip_id를 뽑아낸다.
옵션이 하나만(2~7) 존재할 경우
trips 테이블에서 isValidate 가 true 이면서
trip_(column) 이 일치하는 trip_id 를 뽑아낸다.
예외) 옵션 8 / 옵션 9 의 경우
trips 테이블에서, isValidate 가 true 인 것들만남기고
user가 선택한 chip 최대 세개를 기준으로
trip_theme1, trip_theme2, trip_theme3 에서 한개라도 걸리는 trip을 다 불러온다음
// 옵션 8, 9 에 대한 함수
async function searchTripDocuments(searchTerms) {
let query = supabase
.from('trips')
.select('*')
.filter('isValidate', 'eq', true);
const searchConditions = searchTerms.map(term => {
return `(pool1 ILIKE '%${term}%' OR pool2 ILIKE '%${term}%' OR pool3 ILIKE '%${term}%')`;
}).join(' OR ');
query = query.or(searchConditions);
const { data, error } = await query;
if (error) {
console.error('Error searching documents:', error);
} else {
console.log('Search results:', data);
}
}
const searchTerms = ['one', 'two', 'three'];
searchDocuments(searchTerms);
async function searchBuddiesDocuments(searchTerms) {
let query = supabase
.from('documents')
.select('*')
.filter('isValidate', 'eq', true);
const searchConditions = searchTerms.map(term => {
return `(pool1 ILIKE '%${term}%' OR pool2 ILIKE '%${term}%' OR pool3 ILIKE '%${term}%')`;
}).join(' OR ');
query = query.or(searchConditions);
const { data, error } = await query;
if (error) {
console.error('Error searching documents:', error);
} else {
console.log('Search results:', data);
}
}
const searchTerms = ['one', 'two', 'three'];
searchDocuments(searchTerms);
(도전과제 - 위 함수의 결과로 리턴된 배열에서 몇개가 일치하는지 퍼센트를 계산해서 그 순서대로 배열 순서 재배치)
// 2~7번 까지를 결합할 수 있는 코드
import { createClient } from '@supabase/supabase-js';
const supabaseUrl = 'https://your-project.supabase.co';
const supabaseKey = 'your-public-anon-key';
const supabase = createClient(supabaseUrl, supabaseKey);
async function searchTripDocuments(searchTerms) {
let query = supabase
.from('trips')
.select('*')
.filter('isValidate', 'eq', true);
// 동적으로 추가할 조건들 (클라이언트에서 보내면됨 아래를)
const filters = [
{ column: 'blabla', operator: 'eq', value: variable2 },
{ column: 'blabla2', operator: 'eq', value: variable3 },
// 필요한 만큼 추가 가능
];
// 각 조건을 query에 추가
filters.forEach(filter => {
query = query.filter(filter.column, filter.operator, filter.value);
});
// OR 조건을 만들어 여러 컬럼에 대해 검색어를 일치시키기
const searchConditions = searchTerms.map(term => {
return `(pool1 ILIKE '%${term}%' OR pool2 ILIKE '%${term}%' OR pool3 ILIKE '%${term}%')`;
}).join(' OR ');
query = query.or(searchConditions);
const { data, error } = await query;
if (error) {
console.error('Error searching documents:', error);
} else {
console.log('Search results:', data);
}
}
const searchTerms = ['one', 'two', 'three'];
const variable2 = 'some_value1';
const variable3 = 'some_value2';
searchTripDocuments(searchTerms);
'supabase' 카테고리의 다른 글
[240721 TIL] 수파베이스 SQL로 테이블 생성하기 (0) | 2024.07.21 |
---|---|
[240720 TIL] Supabase 유저테이블 자동입력 SQL (0) | 2024.07.20 |
[240712 TIL] 자동 like count 기록 기능 만들기 최종본 (0) | 2024.07.12 |
[240619 TIL] Supabase 인증 with Tanstack Query (0) | 2024.06.19 |
[240609 WIL] supabase 정리 (0) | 2024.06.09 |