일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- mysql
- Docker
- 양자컴퓨터
- java
- IONQ
- dbeaver
- 아이온큐
- redis
- file download
- Aggregation
- NORI
- Analyzer
- Cache
- Elasticsearch
- elasticsearch cache
- Elastic
- KNN
- ann
- vavr
- api cache
- Query
- JPA
- Selenium
- java crawler
- aggs
- API
- TSLA
- aqqle
- 테슬라
- request cache
- Today
- Total
아빠는 개발자
[es8] similarity Search 본문
텍스트, 이미지, 이벤트 등 모든 종류의 콘텐츠를 벡터로 나타낼 수 있는 차세대 기계 학습 모델 덕분에 벡터 검색에 대한 관심이 급증했습니다. 종종 "임베딩 모델"이라고 하는 이러한 강력한 표현은 표면 수준 특성을 넘어서는 방식으로 두 콘텐츠 간의 유사성을 포착 할 수 있습니다.
뭐 이렇다고 한다.
7버전에서도 dense_vector 타입으로 색인하고 cosine similarity 등 kNN 검색이 가능한데.. 8의 특징이 ANN 검색이라고 하니
얼마나 좋아졌는지 테스트 해봐야겠다
k-nearest neighbor (kNN) search algorithms 은 쿼리 벡터와 가장 유사한 데이터세트에서 벡터를 찾습니다. 이러한 벡터 표현과 함께 kNN 검색은 검색에 대한 흥미로운 가능성을 열어준다고 한다
- 질문에 대한 답을 포함할 가능성이 있는 구절 찾기
- 대규모 데이터 세트에서 중복에 가까운 이미지 감지
- 주어진 노래와 비슷하게 들리는 노래 찾기
ANN 검색을 테스트 해보자
dense_vector 타입에서 index: true 유사성을 추가한다.
sample
PUT index
{
"mappings": {
"properties": {
"image-vector": {
"type": "dense_vector",
"dims": 128,
"index": true,
"similarity": "l2_norm"
}
}
}
}
PUT index/_doc
{
"image-vector": [0.12, 1.34, ...]
}
ANN 검색을 위한 _knn_search Endpoint 를 제공한다.
GET index/_knn_search
{
"knn": {
"field": "image-vector",
"query_vector": [-0.5, 9.4, ...],
"k": 10,
"num_candidates": 100
}
}
이 예에서 ANN 검색은 정확한 접근 방식보다 훨씬 빠릅니다. 회수율은 약 95%이므로 평균적으로 가장 가까운 이웃 10개 중 9개 이상을 찾습니다.
기존에 만들어 놓은 dense_vector 검색을 128 차원 백터로 만들고 테스트
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)>
터미널에서
pip install --upgrade certifi
가 안되면
pip3 install --upgrade certifi
Finder
파인더에서 Applications(응용프로그램)> Python3.7 폴더 (또는 사용중인 Python 버전)로 이동하여 "Install Certificates.command"파일을 더블 클릭
GET ann-test/_mapping
{
"ann-test": {
"mappings": {
"dynamic": "true",
"properties": {
"category": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"id": {
"type": "keyword"
},
"name": {
"type": "text"
},
"name_vector": {
"type": "dense_vector",
"dims": 512,
"index": true,
"similarity": "l2_norm"
},
"price": {
"type": "keyword"
}
}
}
}
}
Test
GET ann-test/_knn_search
{
"knn": {
"field": "name_vector",
"query_vector": [
-0.03491777554154396,
-0.021893702447414398,
-0.05286424607038498,
...
0.043530356138944626,
0.0038510074373334646,
0.007266352418810129
],
"k": 10,
"num_candidates": 100
}
}
#! The kNN search API has been replaced by the `knn` option in the search API.
#! The kNN search API has been replaced by the `knn` option in the search API.
{
"took": 62,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 200,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "ann-test",
"_id": "4MORA4MBk5ELlvhG3ghJ",
"_score": 1,
"_source": {
"price": 277000,
"name": "아크네스튜디오 애드 남성 반팔 티셔츠 Evert Tshirt In Cotton BL0176 9001",
"id": 301,
"category": "패션의류 남성의류 티셔츠",
"name_vector": [
-0.03491777554154396,
-0.021893702447414398,
-0.05286424607038498,
0.023670518770813942,
-0.021262001246213913,
0.04230502247810364,
0.03469358757138252,
0.01770828105509281,
-0.06424234807491302,
0.048049405217170715,
-0.011201688088476658,
-0.0019089147681370378,
_knn_search Endpoint 가 아닌 search api 의 knn option 을 사용해야 하나 보다
이거
POST image-index/_search
{
"knn": {
"field": "image-vector",
"query_vector": [54, 10, -2],
"k": 5,
"num_candidates": 50,
"filter": {
"term": {
"file-type": "png"
}
}
},
"fields": ["title"],
"_source": false
}
아님 이거
POST image-index/_search
{
"query": {
"match": {
"title": {
"query": "mountain lake",
"boost": 0.9
}
}
},
"knn": {
"field": "image-vector",
"query_vector": [54, 10, -2],
"k": 5,
"num_candidates": 50,
"boost": 0.1
},
"size": 10
}
후자로 만들
input : 루이 비똥
와오..이거 잘나오네
'ES8 > elasticsearch8' 카테고리의 다른 글
[es8] Top hits aggregation - 이론편 (5) | 2024.10.20 |
---|---|
[ES8] elasticsearch-head (0) | 2024.02.03 |
[ES8] ES|QL (1) | 2023.12.23 |