1. dims
2. element_type
3. similarity
4. index_options
index_options로 hnsw, int8_hnsw, int4_hnsw 사용하는 경우
m
- HNSW 그래프에서 연결될 노드의 수
- 기본값 16
ef_construction
- 가까운 이웃 리스트를 수집하는 동안 추적할 후보 수
"VECTOR": {
"type": "dense_vector",
"dims": 800,
"index": true,
"similarity": "cosine",
"index_options": {
"type": "int8_hnsw",
"m": 64,
"ef_construction": 800
}
},
k
field
query_vector
num_candidates
1.5 * k
1.5 * size
이다. (size는 설정되지 않은 경우 10이다.)similarity
query_vector_builder
GET index/_search
{
"size" : 10,
"query" : {
"bool" : {
"must" : {
"knn": {
"field": "image-vector",
"query_vector": [-5, 9, -12],
"k": 3,
"num_candidates": 100
}
}
}
}
}
위처럼 검색하면 텍스트를 백터로 변환하여 쿼리에 넣어 검색할 수 있고
옵션중 query_vector_builder
을 사용하면 백터값을 넣지 않고 검색쿼리에서 모델링을 해서 백터검색을 할 수 있다.
GET my_index_name/_search
{
"knn": [
{
"field": "chunk-vector",
"k": 5,
"num_candidates": 10,
"similarity": 0.8
"query_vector_builder": {
"text_embedding": {
"model_id": "my_model_id",
"model_text": "how to semantic search"
}
} }
위는 model_id
에 입력된 my_model_id 모델을 사용해 model_text
에 입력된 "how to semantic search"를 백터로 변환하여 검색하는 방법이다.
백터차원이 800 또는 1000과 같이 길어지면 검색쿼리 또한 복잡해지는데,
이때 query_vector_builder
를 활용하면 더 간단하고 직관적인 쿼리로 검색할 수 있을꺼 같다.
현재까지 테스트해본 바로는 매핑 설정 시 index_options
의 m
과 ef_construction
그리고 knn쿼리의 num_candidates
옵션을 통해 결과가 변경되어 적절한 값을 찾는게 중요해 보인다.
https://www.elastic.co/search-labs/blog/elasticsearch-knn-and-num-candidates-strategies
이 블로그에서 "How to choose the best k and num_candidates for kNN search" 라는 주제로 얘기하고 있다.
[참고]
dense_vector : https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html
knn query : https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-knn-query.html