[Opensearch] Vector Search
Opensearch๋ ๋ฒกํฐ ๊ฒ์์ ์ง์ํ๋ค.
๋ค๋ง ์๊ธฐ๊ฐ ์ข ๋ฌ๋ผ์ Elasticsearch์๋ ๋
์์ ์ธ ํํ๋ก ๋ถ๊ธฐํด์ ๋ฐ์ ํดํ๊ณ ์๋ค. ๋์ด ์์ ๋ค๋ฅด๋ค.
AWS์์ ๊ด๋ฆฌํ๊ณ ์๋๋ฐ๋ค, ๋ฒกํฐ๊ฒ์์ด ์์ฆ ๊ฐ์ฅ ๋์ด ๋๋ ๋ถ๋ถ์ด๊ธฐ๋ ํด์ ๋ฐ์ ์ ์ด์ฌํ ์ํค๊ณ ์๋ค.
๋ฒกํฐ ์ธ๋ฑ์ค ๋ง๋ค๊ธฐ
์ด๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ๋ฑ์ค๋ฅผ ๋ง๋๋ ์์ ์์ ๋ฒกํฐ ์ต์ ์ ์ ์ํด์ค์ผ ํ๋ค.
###
PUT http://{{HOST}}:{{PORT}}/vector_index
Content-Type: application/json
{
"settings": {
"index.knn": true
},
"mappings": {
"properties": {
"vector": {
"type": "knn_vector",
"dimension": 256,
"space_type": "innerproduct",
"mode": "on_disk",
"method": {
"name": "hnsw"
}
}
}
}
}
###
index.knn ์ต์
์ ์ผ๊ณ , ์ฌ์ฉํ ์ ์ฌ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฒกํฐ ์ฐจ์, ์ ์ฅ ๋ฐฉ์ ๋ฑ์ ์ ํํ๋ฉด ๋๋ค.
์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ l2, ์ฝ์ฌ์ธ์ cosinesimil, ์ ๊ณฑ์ innerproduct๋ก ์ง์ ํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ dimension์ด ๋ฒกํฐ์ ๊ธธ์ด, ์ฐจ์์ด๋ค.
์ธ๋ฑ์ค๋ hnsw๊ณผ lvf ์ค์ ์ ํํ ์ ์๋ค. hnsw๊ฐ ์ข ๋ ์ผ๋ฐ์ ์ธ ์ต์ ์ด๋ค.
์์ฑํ๋ฉด ์ด๋ฐ ์์ผ๋ก ์ต์ ์ด ๋ง๋ค์ด์ง๊ณ

๋ฒกํฐ ๊ฐ ์ฝ์
๋ฒกํฐ ๊ฐ์ ๋ฃ์ ๋๋ ์ผ๋ฐ์ ์ธ ์ธ๋ฑ์ค ํ๋์ฒ๋ผ ๊ฐ์ ์ง์ด๋ฃ์ ์ ์๋ค.
๊ทธ๋ฅ ๋ฒกํฐ ๊ฐ์ ํด๋นํ๋ ์ค์ ๋ฐฐ์ด๋ก ๋ฃ์ผ๋ฉด ๋๋ค.


๋ฒกํฐ ๊ฒ์
search API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ธฐ์กด ๊ฒ์๊ณผ ๋์ผํ๋, knn ์ต์ ์ ์ฌ์ฉํ๋ค๋๊ฒ ๋ค๋ฅด๋ค.
###
POST http://{{HOST}}:{{PORT}}/vector_index/_search
Content-Type: application/json
{
"query": {
"knn": {
"๋ฒกํฐํ๋๋ช
": {
"vector": [๋ฒกํฐ๊ฐ],
"k": 2
}
}
}
}
###
vector๋ ๊ฒ์ํ ๊ธฐ์ค๊ฐ์ด ๋๋ ๋ฒกํฐ๊ณ , k๊ฐ ๊ฐ์ ธ์ฌ ์ต๋ ๊ฐ์๋ค.
์ ๋ ๊ฒ ๋ ๋ฆฌ๋ฉด
๊ฐ์ฅ ๋น์ทํ ๊ฒ 2๊ฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ผ๋ก ์๋ํ๋ค.
์ ๋ฐ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์์ด์๋ ๋ค๋ฅธ Vector DB๋ค๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
์ฐธ์กฐ
https://docs.opensearch.org/docs/latest/vector-search/creating-vector-index/
https://docs.opensearch.org/docs/latest/vector-search/searching-data/
https://docs.opensearch.org/docs/latest/field-types/supported-field-types/knn-spaces/
https://docs.opensearch.org/docs/latest/query-dsl/specialized/k-nn/index/
https://docs.opensearch.org/docs/latest/vector-search/filter-search-knn/index/
https://docs.opensearch.org/docs/latest/vector-search/filter-search-knn/efficient-knn-filtering/