검색엔진이 필요해서 제미니에게 아래와 같이 질문을 했다.
예상대로 엘라스틱 서치와 아파치 솔라 추천해 주는데 이걸 언제 메뉴얼 보고 테스트 하나 싶어 예전에 사용했던 스핑크스가 생각이 나서 이번에 설치하고 테스트 해봤습니다.
직접 설치해서 사용하는 검색엔진에서 사용할만한 프로그램중 하나인 러시아산 스핑크스 검색엔진 입니다.
웬만한 중소 사이트에서 사용하는데 무리가 없을정도 이고 검색 결과는 본래 수동으로 손을 봐야 하는것도 많기 때문에 사용 검색엔진이라고 본인의 입맞에 딱 맞을 수도 있지만 아닌경우도 있습니다.
상황에 맞게 잘 응용해서 사용해야 겠지요.
CentOS7 에서는 최대 버전이 3.5.1 까지만 설치가 되고 그 이후는 라이브러리가 맞지 않아서 기본적으로는 안됩니다.
- 수집. 색인. 검색 보통 이렇게 3부분으로 나뉘어져 있고 환경 설정도 이렇게 되어 있다고 인지 하는것이 좋습니다.
- 위 3가지가 각각 별개로 작동 한다는 의미 이면서 순서대로 당연히 영향을 미칩니다.
- 빠르기도 하고 PHP에서 별도 라이브러리 설치할 필요 없이 평소 사용하던 mysql로 접속 사용하면 됩니다.
- 쿼리도 mysql과 비슷하기 때문에 기본적으로 쉽게 사용가능 합니다.
- 착각하지 말것이 이건 스핑크스 클라이언트 이지 mysql> 이라고 나왔다고 데이터베이스가 아니라는 것입니다.
- 즉, delete, drop, create 이런것 안되고 접속할 때 계정, 비번 이런것이 없습니다. 이건 검색엔진 클라이언트를 mysql 활용한것이지 DBMS가 아니기 때문입니다.
- 뭐야 이건 비밀번호도 없이 들어가네... 착각 하지 말라는 것입니다.
source src_pabburi
{
type = mysql
sql_host = 디비호스트
sql_user = 디비유저
sql_pass = 디비비밀번호
sql_db = test_pabburi
sql_port = 디비포트
sql_sock = /mysql/mysql.sock
# 삭제 제외
sql_query = SELECT id, unified_no, wr_subject, wr_subject_kw FROM test_pabburi.search WHERE sphinx_status != 'Del'
# **중요: 쿼리에서 첫번째 컬럼은 고유한 숫자컬럼 - 하지만 이것을 아래 필드 설정에 넣는것은 아니다.**
# sql_field_string: MATCH() 함수로 검색 가능
# sql_attr_string: 검색 안되고 속성(Attribute) 필드 - 필터링/정렬/그룹핑 용도. MATCH() 사용만 안되고 나머지는 사용 가능
sql_attr_string = unified_no
sql_field_string = wr_subject
sql_field_string = wr_subject_kw
}
# 정적인덱스: 여기선 plain index 라고 부른다.
index pabburi_test
{
#
type = plain
source = src_pabburi
path = /sphinx/indexes/pabburi_test
# infix 인덱싱 추가 (부분 일치 검색)
min_prefix_len = 0
min_infix_len = 2
# 1글자 단어도 인덱싱
min_word_len = 1
charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
ngram_len = 1
ngram_chars = U+4E00..U+9FBB, U+3400..U+4DB5, U+20000..U+2A6D6, U+FA0E, U+FA0F, U+FA11, U+FA13, U+FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27, U+FA28, U+FA29, U+3105..U+312C, U+31A0..U+31B7, U+3041, U+3043, U+3045, U+3047, U+3049, U+304B, U+304D, U+304F, U+3051, U+3053, U+3055, U+3057, U+3059, U+305B, U+305D, U+305F, U+3061, U+3063, U+3066, U+3068, U+306A..U+306F, U+3072, U+3075, U+3078, U+307B, U+307E..U+3083, U+3085, U+3087, U+3089..U+308E, U+3090..U+3093, U+30A1, U+30A3, U+30A5, U+30A7, U+30A9, U+30AD, U+30AF, U+30B3, U+30B5, U+30BB, U+30BD, U+30BF, U+30C1, U+30C3, U+30C4, U+30C6, U+30CA, U+30CB, U+30CD, U+30CE, U+30DE, U+30DF, U+30E1, U+30E2, U+30E3, U+30E5, U+30E7, U+30EE, U+30F0..U+30F3, U+30F5, U+30F6, U+31F0, U+31F1, U+31F2, U+31F3, U+31F4, U+31F5, U+31F6, U+31F7, U+31F8, U+31F9, U+31FA, U+31FB, U+31FC, U+31FD, U+31FE, U+31FF, U+AC00..U+D7A3, U+1100..U+1159, U+1161..U+11A2, U+11A8..U+11F9, U+A000..U+A48C, U+A492..U+A4C6
}
# 동적인덱스: 여기선 rt 인덱스라고 부른다.(real time index)
# - 10만개 이하면 정적으로만 자주 해도 충분하다.
indexer
{
mem_limit = 512M
}
# ----------------------------------------------------------------------------
# 검색기
# ----------------------------------------------------------------------------
#
# mysql 클라이언트 접속 방법: mysql -h127.0.0.1 -P5036
#
# Native API는 사용하지 않아서 없애버림 - listen = 9312
searchd
{
listen = 5036:mysql41
log = /sphinx/searchd.log
query_log = /sphinx/query.log
read_timeout = 5
max_children = 30
pid_file = /sphinx/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads # for RT to work
binlog_path = /sphinx/binlogs
}
- sql의 select 에서 첫번째는 반드시 숫자로 된 고유한 컬럼이어야 하고 이것은 아래쪽 필드에서 지정하는것이 아닙니다.
- id 컬럼이 자동으로 생성 됩니다.
위 설정은 동적 색인 부분은 들어가지 않은 환경입니다. 동적(rt)는 전에 테스트 한게 있었는데 이게 머지를 해줘야 되서 동적으로 하는게 장점이 있는지 ???
그리고 실시간 조회용은 제가 예전에 사용했던 상용 검색엔진도 머지 합니다.
설치에 대한 것은 아래 추가한 사이트가 잘 되어 있습니다.
그리고 2025년 11월 30일 현재 LLM(GPT, 제미니) 물어보면 대답은 잘 하는데 예전 버전에 대한 것을 알려주기 때문에 기본적으로 메뉴얼은 숙지 하고 있어야 합니다.
특히 쿼리에 대해서 좀 상세하게 물어보면 제가 원하는 형태에선 계속 오류가 나서 메뉴얼 보고 간단하게 처리.
LLM은 계속 좋아지고 코딩도 예전에 비해 많이 좋아지고 있지만 아직 갈길이 사당히 많이 남아 있습니다.