GH GambleHub

기술 및 인프라 → Elastic검색 및 전체 텍스트 검색

엘라스틱 검색 및 전체 텍스트 검색

1) 엘라 스틱 검색 역할

엘라 스틱 검색 (ES) 은 집계를위한 역 인덱스 및 열 구조를 기반으로하는 분산 검색 및 분석 시스템입니다. 그것은 제공합니다:
  • 전체 텍스트: 관련성 (BM25), 형태, 퍼지/오타에 내성이 있습니다.
  • 페이스 및 집계: 속성별로 빠른 조각.
  • 하이브리드 검색: BM25 + 벡터 kNN (의미론).
  • 개발 속도: 쿼리 DSL, 섭취 파이프 라인, 풍부한 생태계.

iGaming/fintech의 경우: 게임/제공자, 프로모션 및 규칙 검색, 빠른 반응 측면 (제공자, 변동성, RTP, 언어), KYC/AML 잡지 검색, 로그 분석 및 경고.


2) 데이터 모델 및 매핑

2. 1 필드 인덱스 및 유형

전체 텍스트에 대한 '텍스트'.
'키워드' - 정확한 값/집계/정렬.
'날짜', '긴/이중', '부울', 'ip', 'geo _ point'.
'중첩' - 올바른 필드 상관 관계를 가진 객체 배열.
'dense _ vector' - 벡터 표현 (포함).

2. 2 다자간 전략

필드를 여러 번보기에 저장하십시오: '이름. 텍스트 ',' 이름. 원시 '(키워드)', 이름. ngram '(자동 완성 용).

json
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ru_morph",
"fields": {
"raw": { "type": "keyword", "ignore_above": 256 },
"ngram": { "type": "text", "analyzer": "edge_ngram_2_20" }
}
},
"provider": { "type": "keyword" },
"tags":   { "type": "keyword" },
"rtp":   { "type": "float" },
"released_at": { "type": "date" },
"lang":   { "type": "keyword" },
"embedding": { "type": "dense_vector", "dims": 384, "index": true, "similarity": "cosine" }
}
},
"settings": {
"analysis": {
"filter": {
"ru_stop": { "type": "stop", "stopwords": "_russian_" },
"ru_stemmer": { "type": "stemmer", "language": "russian" },
"syn_ru": { "type": "synonym", "lenient": true, "synonyms": [
"слот,игровой автомат => слот",
"джекпот,суперприз => джекпот"
] }
},
"analyzer": {
"ru_morph": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "ru_stop", "ru_stemmer", "syn_ru"]
},
"edge_ngram_2_20": {
"type": "custom",
"tokenizer": "edge_ngram",
"filter": ["lowercase"],
"char_filter": [],
"tokenizer": "edge_ngram"
}
},
"tokenizer": {
"edge_ngram": { "type": "edge_ngram", "min_gram": 2, "max_gram": 20 }
}
}
}
}

2. 패싯을위한 3 개의 둥지

양식 '기능: [{이름, 값}]' 디자인 '중첩', 그렇지 않으면 패싯이 잘못 일치합니다.


3) 관련성: BM25, 부스트 및 하이브리드

3. 1 클래식 (BM25)

필드를 가중치와 결합하십시오 (제목 ² 4, 태그 ² 2, 설명).

(PHP 3 = 3.0.6, PHP 4)

3. 2 벡터 (kNN) + BM25 (rerank)

엠베딩 (예: 'dense _ vector' 에서 384-768).
벡터별로 먼저 kNN (상위 200-500) 한 다음 rescore BM25 + 비즈니스가 향상됩니다 (참신, RTP, 지역 라이센스).

하이브리드 쿼리 예:
json
{
"knn": {
"field": "embedding",
"query_vector": [/... /],
"k": 400, "num_candidates": 2000
},
"query": {
"bool": {
"should": [
{ "multi_match": {
"query": "египетские слоты джекпот",
"fields": ["title^4","tags^2","description"],
"type": "best_fields",
"minimum_should_match": "60%"
}}
],
"filter": [
{ "term": { "region": "TR" }},
{ "range": { "rtp": { "gte": 94.0 }}}
]
}
},
"rescore": {
"window_size": 400,
"query": {
"rescore_query": {
"function_score": {
"query": { "match_all": {} },
"boost_mode": "sum",
"functions": [
{ "gauss": { "released_at": { "scale": "180d", "offset": "30d", "decay": 0.5 } } },
{ "field_value_factor": { "field": "popularity", "factor": 0.2, "modifier": "log1p" } }
]
}
}
}
},
"highlight": { "fields": { "title": {}, "description": {} } }
}

4) 자동 완성 및 프롬프트

접근 방식:
  • 서브 필드 제목에 가장자리 N- 그램. ngram '(빠르고 간단한).
  • 완료 제안 자 ('완료' 필드) -빠른 힌트이지만 별도의 색인 경로.
  • 검색 유형-토큰 화를 결합하여 단어와 구를 시작합니다.
샘플 프롬프트:
json
{ "suggest": { "game-suggest": { "prefix": "book o", "completion": { "field": "title_suggest", "fuzzy": { "fuzziness": 1 }}}}}

5) 동의어, 오타 및 다국어

동의어: '동의어' 필터를 통해 파일/목록을로드하십시오. 별도의 도메인 (카지노/스포츠).
타이포: 'multi _ match' 의 'fuzziness: 해' 는 길이와 필드로 제한됩니다. 프롬프트- '퍼지' 완료 모드.

다국어:
  • 로케일 당 색인 (ru/en/tr/pt-BR) 또는 다중 분석기 회로: '제목 _ ru', '제목 _ en'.
  • "russian", 'english', 'turkish', 'portuguese' 분석기.
  • 언어를 라우팅 키로 이동하여 핫 로케일을 사용자에게 더 가깝게 유지하십시오.

6) 필터, 패셋 및 집계

패싯의 경우 '키워드' 및 '중첩' 집계를 사용하십시오.
집계에서 기본 필드 (고유 ID) 를 피하십시오-' 런타임 필드 '또는 사전 창으로 가져옵니다.

패싯의 예:
json
{
"size": 20,
"aggs": {
"by_provider": { "terms": { "field": "provider", "size": 20 } },
"by_volatility": { "terms": { "field": "volatility" } },
"rtp_hist": { "histogram": { "field": "rtp", "interval": 1 } }
}
}

7) 데이터 입력 및 텍스트 지우기

소화 파이프 라인: 정규화, 현장 추출, 지리 인코딩, HTM 삭제.
첨부 파일/ingest-ocr (필요에 따라): CP/이미지 색인 (PII에주의).
안정화: 분석기 또는 외부 파이프 라인을 통해 (토큰 사전 계산).


8) 파편, 복제품 및 ILM

8. 1 차원 및 샤딩

더 적은 파편이 더 좋습니다. 목표: 혼합 하중에 대한 파편 당 10-50GB.
(PHP 3 = 3.0.6, PHP 4) 복제품-판매량에서 최소 1 개.

8. 2 ILM (라이프 사이클)

hot → warm → cold → 로그/히스토리 프로모션의 경우 삭제하십시오.
콜드 세그먼트의 힘이 병합됩니다.
카탈로그 및 제품 검색 - 주기적으로 최적화 된 "영구" 핫.

8. 3 다운 타임없는 마이그레이션 알고리

새로운 인덱스 'games _ v2' → 별칭 '게임' 은 'reindex' 및 백필 후에 전환됩니다. 우울한 필드-점차적으로 제거하십시


9) 스냅 샷, DR 및 업데이트

스냅 샷에서 오브젝트 스토리지 (S3/GCS), 예약 및 복원.
노드의 롤링 업데이트, 파편 할당 인식 확인 (영역 별).
DR 계획: 임계 색인 (디렉토리, 디렉토리) 에 대한 교차 지역 복제 (CCR).


10) 안전 및 PII

클라이언트와 클러스터 간의 SL/mTLS.
RBAC: 색인/작업 당 역할; Dev/Stage/Prod-별도로.
PII/PCI: 불필요하게 개인 데이터가있는 필드를 색인화하지 마십시오. 섭취 마스킹을 사용하십시오.
잊을 권리: 사용자 _ id에 의한 삭제를 위해 문서에 대한 링크를 유지하십시오. 소프트 삭제 + 재 인덱스/공지.


11) 관찰 및 검색 SLO

메트릭:
  • 쿼리 P50/P95/P99 대기 시간, 4xx/5xx 오류.
  • 캐시 적중 (쿼리 캐시/샤드 요청 캐시).
  • Heap 사용량, GC 자체, 세그먼트 병합, 스레드 풀 (검색/쓰기).
  • 뜨거운 파편/핫 노드, 거부.
  • KNN: 'graph _ hits', 'Search _ k', 대기 시간, recall @ k.
SLO 예:
  • 게임 검색: P95 λ200 ms, 오류 <0. 30 분 창에서 5%.
  • 팁: P95 λ80 ms.
  • KNN 하이브리드: 상위 20 개 결과를위한 P95 λ350ms.

12) FinOps: 비용과 성능

색인 크기: 토큰 화 저장, 불필요한 'fielddata' 비활성화, 필요한 경우에만 'doc _ 값' 사용.
세그먼트: 합병 정책을 계획하고 "분할" 을 허용하지 마십시오.
KNN은 RAM/CPU에서 더 비쌉니다. BM25의 한계 덤, 'num _ lators', 사전 필터링.
RAM의 핫 필드: 필드 데이터/힙을 모니터링하십시오. "무거운" 집계를 별도의 지수로 가져갑니다.


13) 샘플 요청

13. 부스트가있는 1 개의 멀티 필드 전체 텍스트

json
{
"query": {
"multi_match": {
"query": "book of",
"fields": ["title^4","title.ngram^2","tags^2","description"]
}
},
"sort": ["_score", { "released_at": "desc" }]
}

13. 필터 + 패셋 2 개

json
{
"query": {
"bool": {
"must": [{ "match": { "title": "египет" }}],
"filter": [
{ "terms": { "provider": ["Novomatic","PragmaticPlay"]}},
{ "range": { "rtp": { "gte": 95 }}}
]
}
},
"aggs": {
"by_provider": { "terms": { "field": "provider" } },
"by_year": { "date_histogram": { "field": "released_at", "calendar_interval": "year" } }
}
}

13. 3 중첩 속성 필터링

json
{
"query": {
"nested": {
"path": "features",
"query": { "bool": {
"must": [
{ "term": { "features.name": "volatility" }},
{ "term": { "features.value": "high" }}
]
}}
}
}
}

13. 하이라이트가있는 4 로그 검색 (ECS)

json
{
"query": {
"bool": {
"must": [{ "match_phrase": { "message": "payment declined" }}],
"filter": [
{ "term": { "service.name": "payments" }},
{ "range": { "@timestamp": { "gte": "now-1h" }}}
]
}
},
"highlight": { "fields": { "message": { "number_of_fragments": 0 } } }
}

14) 다중 임차인 및 격리

테넌트 (더 나은) 또는 필드 '테넌트 _ id' + ACL 필터 색인 (집계시 더 비싸다).
'테넌트 _ id' 로 라우팅하여 파편을 현지화합니다.
임차인의 제한/시간 제한 요청 '쿼리. 위상 '가드 레일.


15) 구현 점검표

1. 스키마: '텍스트/키워드/중첩' + 다중 필드, 필요한 경우 'dense _ vector'.
2. 자동 완성을위한 언어 당 분석기, 동의어, edge-ngram.
3. 관련성: BM25는 + 하이브리드 kNN → rescore를 향상시킵니다.
4. 페이스 북: 키워드/중첩, "건강한" 필드에 대해서만 집계.
5. 인덱싱: 가장 많은 파이프 라인 (정규화), 배치 로딩.
6. 샤딩: 작은 시작, 이동 별칭, "긴" 로그의 경우 ILM.
7. DR: 스냅 샷 일정, 복구 점검, 중요한 색인에 대한 CCR.
8. 보안: SL, RBAC, PII 마스킹, 삭제 정책.
9. 관찰 가능성: 대기 시간, 더미/GC, 캐시 히트, 핫 샤드, 거부.
10. FinOps: 색인 크기, kNN 매개 변수화, 추가 'doc _ 값/fielddata' 비활성화.


16) 반 패턴

"모두에 대한" 하나의 인덱스: 다른 도메인 (디렉토리, 로그, 트랜잭션) 에는 다른 설정이 필요

사려 깊지 않은 '퍼지: 두 가지' → 모든 분야에서 느리고 시끄럽습니다.
동의어 "의미": 사전 도메인을 분리하지 마십시오.
필드 번들 → 잘못된 패싯이 필요한 곳에 중첩되지 않은 경우.
파편이 너무 많습니다 (문서 당 하나) -클러스터 상태 오버 헤드.
마이그레이션 중 별명을 사용하지 않음-다운 타임 및 파손 된 링크.
PII 지수 "그대로" -규제 위험 및 고가의 순록.


17) iGaming 컨텍스트/핀 테크: 빠른 레시피

게임 검색: 부스트 '제목 네', '태그 ² 2', 공급자/변동성 별 측면, 지역/통화 별 필터, "주제" 에 대한 벡터와의 하이브리드 (예: "이집트", "과일 클래식").
프로모션/보너스: 동의어 ("freespins", "free spins"), 데이터 필터 'active _ from/active _ to', 완료를 통한 팁.
KYC/AML 로그: ECS 스키마, '메시지' 별 전체 텍스트, 'rule _ Name', 'country' 별 집계, '@ timestamp' 히스토그램의 이상.
공급자 디렉토리: 패싯과 정렬을위한 키워드 필드; 텍스트 설명- 형태가있는 '텍스트'.
규제 페이지: 다국어 필드, 소프트 힌트에 대한 '검색 _ as _ you _ style'.


결과

Elastic검색에 대한 효과적인 검색은 "BM25를 켜십시오" 뿐만 아니라 올바른 분석기 및 매핑, 멀티 필드 및 중첩, BM25 + 벡터의 하이브리드, 깔끔한면 및 집계, 샤핑 및 ILM 분야, 명확한 SLO 및 관찰 가능성, 안전 및 FinOps. 이러한 원칙을 사용하면 검색이 빠르고 관련성이 있으며 예측 가능하며 제품 플랫폼 트래픽의 최고점을 견딜 수 있습니다.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.