동적 필드
컬렉션의 스키마에 정의된 모든 필드는 삽입할 엔티티에 포함되어야 합니다. 일부 필드를 선택 사항으로 사용하려면 동적 필드를 활성화하는 것이 좋습니다. 이 항목에서는 동적 필드를 활성화하고 사용하는 방법에 대해 설명합니다.
개요
Milvus에서는 컬렉션의 각 필드에 대한 이름과 데이터 유형을 설정하여 컬렉션 스키마를 만들 수 있습니다. 스키마에 필드를 추가할 때 이 필드가 삽입하려는 엔티티에 포함되어 있는지 확인하세요. 일부 필드를 선택 사항으로 사용하려는 경우 동적 필드를 활성화하는 것도 한 가지 옵션입니다.
동적 필드는 $meta라는 이름의 예약된 필드이며 JSON(JavaScript 객체 표기법) 유형입니다. 스키마에 정의되지 않은 엔티티의 모든 필드는 이 예약된 JSON 필드에 키-값 쌍으로 저장됩니다.
동적 필드가 활성화된 컬렉션의 경우 스키마에 명시적으로 정의된 필드와 마찬가지로 동적 필드의 키를 스칼라 필터링에 사용할 수 있습니다.
동적 필드 활성화
사용자 지정 설정으로 컬렉션을 만들 때 동적 필드를 수동으로 활성화할 수 있습니다.
from pymilvus import MilvusClient
client= MilvusClient(uri="http://localhost:19530")
client.create_collection(
collection_name="my_collection",
dimension=5,
# highlight-next-line
enable_dynamic_field=True
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()
.collectionName("my_collection")
.dimension(5)
// highlight-next-line
.enableDynamicField(true)
.build()
client.createCollection(createCollectionReq);
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const client = new Client({
address: 'http://localhost:19530'
});
await client.createCollection({
collection_name: "customized_setup_2",
schema: schema,
// highlight-next-line
enable_dynamic_field: true
});
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v2/column"
"github.com/milvus-io/milvus/client/v2/entity"
"github.com/milvus-io/milvus/client/v2/index"
"github.com/milvus-io/milvus/client/v2/milvusclient"
)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
cli, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
Address: "localhost:19530",
})
if err != nil {
fmt.Println(err.Error())
// handle err
}
defer client.Close(ctx)
err = client.CreateCollection(ctx, milvusclient.SimpleCreateCollectionOptions("my_collection", 5).
WithAutoID(false).
WithDynamicSchema(true))
if err != nil {
fmt.Println(err.Error())
}
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "my_collection",
"dimension": 5,
"enableDynamicField": true
}'
동적 필드 사용
컬렉션에서 동적 필드를 사용하도록 설정하면 스키마에 정의되지 않은 모든 필드와 해당 값이 동적 필드에 키-값 쌍으로 저장됩니다.
예를 들어 컬렉션 스키마에 동적 필드가 활성화된 상태에서 id 및 vector 이라는 두 개의 필드만 정의되어 있다고 가정해 보겠습니다. 이제 이 컬렉션에 다음 데이터 집합을 삽입합니다.
[
{id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},
{id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},
{id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},
{id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},
{id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},
{id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},
{id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},
{id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},
{id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},
{id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}
]
위의 데이터 집합에는 각각 id, vector, color 필드를 포함한 10개의 엔티티가 포함되어 있습니다. 여기서 color 필드는 스키마에 정의되어 있지 않습니다. 컬렉션에 동적 필드가 활성화되어 있으므로 color 필드는 동적 필드 내에 키-값 쌍으로 저장됩니다.
데이터 삽입
다음 코드는 이 데이터 집합을 컬렉션에 삽입하는 방법을 보여줍니다.
data=[
{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},
{"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},
{"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},
{"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},
{"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},
{"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},
{"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},
{"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
{"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},
{"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}
]
res = client.insert(
collection_name="my_collection",
data=data
)
print(res)
# Output
# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import io.milvus.v2.service.vector.request.InsertReq;
import io.milvus.v2.service.vector.response.InsertResp;
Gson gson = new Gson();
List<JsonObject> data = Arrays.asList(
gson.fromJson("{\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"}", JsonObject.class),
gson.fromJson("{\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"}", JsonObject.class),
gson.fromJson("{\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"}", JsonObject.class),
gson.fromJson("{\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"}", JsonObject.class),
gson.fromJson("{\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"}", JsonObject.class),
gson.fromJson("{\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"}", JsonObject.class),
gson.fromJson("{\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"}", JsonObject.class),
gson.fromJson("{\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"}", JsonObject.class),
gson.fromJson("{\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"}", JsonObject.class),
gson.fromJson("{\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}", JsonObject.class)
);
InsertReq insertReq = InsertReq.builder()
.collectionName("my_collection")
.data(data)
.build();
InsertResp insertResp = client.insert(insertReq);
System.out.println(insertResp);
// Output:
//
// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
const { DataType } = require("@zilliz/milvus2-sdk-node")
// 3. Insert some data
const data = [
{id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},
{id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},
{id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},
{id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},
{id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},
{id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},
{id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},
{id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},
{id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},
{id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}
]
const res = await client.insert({
collection_name: "quick_setup",
data: data,
})
console.log(res.insert_cnt)
// Output
//
// 10
//
dynamicColumn := column.NewColumnString("color", []string{
"pink_8682", "red_7025", "orange_6781", "pink_9298", "red_4794", "yellow_4222", "red_9392", "grey_8510", "white_9381", "purple_4976",
})
_, err = client.Insert(ctx, milvusclient.NewColumnBasedInsertOption("my_collection").
WithInt64Column("id", []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}).
WithFloatVectorColumn("vector", 5, [][]float32{
{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592},
{0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104},
{0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592},
{0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345},
{0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106},
{0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955},
{0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987},
{-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052},
{0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336},
{0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608},
}).
WithColumns(dynamicColumn),
)
if err != nil {
fmt.Println(err.Error())
// handle err
}
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
"data": [
{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},
{"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},
{"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},
{"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},
{"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},
{"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},
{"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},
{"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
{"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},
{"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}
],
"collectionName": "my_collection"
}'
# {
# "code": 0,
# "data": {
# "insertCount": 10,
# "insertIds": [
# 0,
# 1,
# 2,
# 3,
# 4,
# 5,
# 6,
# 7,
# 8,
# 9
# ]
# }
# }
동적 필드에서 스칼라 필드 인덱싱하기
동적 필드를 활성화하면 정의되지 않은 모든 스칼라 필드가 JSON 형식의 키-값 쌍으로 저장됩니다. Milvus는 이러한 정의되지 않은 스칼라 필드에 대한 인덱스 생성을 지원하며, JSON 경로 인덱스를 효과적으로 구축할 수 있습니다. 작동 방식은 다음과 같습니다:
색인하려는동적 필드 키를 선택합니다. 예를 들어, 위의 예에서는
"color".해당 키에서 찾은 값에 대한형 변환 유형을 결정합니다. Milvus는 동적 필드를 파싱하여 지정된 키 아래의 값을 추출한 다음 사용자가 구성한 유형으로 캐스팅합니다.
지원되는
json_cast_type값은bool(또는BOOL),double(또는DOUBLE),varchar(또는VARCHAR)입니다.구문 분석 또는 형 변환에 실패하면(예: 문자열을 이중으로 구문 분석하려고 시도하는 경우) 해당 행은 인덱스에서 건너뜁니다.
해당 키의JSON 경로를
json_path로지정합니다. 동적 필드는 JSON으로 저장되므로"color"와 같이 지정하거나 중첩된 구조가 있는 경우 더 깊은 경로(예:my_json["field"]["subfield"])를 지정할 수 있습니다.INVERTED 인덱스를 생성합니다. 현재 JSON 경로 인덱싱에는
INVERTED유형만 지원됩니다.
매개변수 및 고려 사항에 대한 자세한 내용은 JSON 필드 색인하기를 참조하세요.
다음은 "color" 필드에 인덱스를 생성하는 방법의 예입니다:
# Prepare index parameters
index_params = client.prepare_index_params()
index_params.add_index(
field_name="color", # Name of the "column" you see in queries (the dynamic key).
index_type="INVERTED", # Currently only "INVERTED" is supported for indexing JSON fields.
index_name="color_index", # Assign a name to this index.
params={
"json_path": "color", # JSON path to the key you want to index.
"json_cast_type": "varchar" # Type to which Milvus will cast the extracted values.
}
)
# Create the index
client.create_index(
collection_name="my_collection",
index_params=index_params
)
import io.milvus.v2.common.IndexParam;
List<IndexParam> indexes = new ArrayList<>();
Map<String,Object> extraParams = new HashMap<>();
extraParams.put("json_path", "color");
extraParams.put("json_cast_type", "varchar");
indexes.add(IndexParam.builder()
.fieldName("color")
.indexName("color_index")
.indexType(IndexParam.IndexType.INVERTED)
.extraParams(extraParams)
.build());
client.createIndex(CreateIndexReq.builder()
.collectionName("my_collection")
.indexParams(indexes)
.build());
indexTask, err := client.CreateIndex(ctx, milvusclient.NewCreateIndexOption("my_collection", "color",
index.NewJSONPathIndex(index.Inverted, "varchar", "color")))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = indexTask.Await(ctx)
if err != nil {
fmt.Println(err.Error())
// handler err
}
const index_params = {
field_name: "color", // Name of the "column" you see in queries (the dynamic key).
index_type: "INVERTED", // Currently only "INVERTED" is supported for indexing JSON fields.
index_name: "color_index", // Assign a name to this index.
params:{
"json_path": "color", // JSON path to the key you want to index.
"json_cast_type": "varchar" // Type to which Milvus will cast the extracted values.
}
}
// Create the index
await client.create_index({
collection_name: "my_collection",
index_params: index_params
});
# restful
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/indexes/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "my_collection",
"indexParams": [
{
"fieldName": "color",
"indexName": "color_index",
"indexType": "INVERTED",
"params": {
"json_path": "color",
"json_cast_type": "varchar"
}
}
]
}'
동적 필드로 쿼리 및 검색
Milvus는 쿼리 및 검색 중에 필터 표현식 사용을 지원하여 결과에 포함할 필드를 지정할 수 있습니다. 다음 예제는 스키마에 정의되어 있지 않은 color 필드를 동적 필드를 사용하여 쿼리 및 검색을 수행하는 방법을 보여줍니다.
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
res = client.search(
collection_name="my_collection",
data=[query_vector],
limit=5,
# highlight-start
filter='color like "red%"',
output_fields=["color"]
# highlight-end
)
print(res)
# Output
# data: ["[{'id': 1, 'distance': 0.6290165185928345, 'entity': {'color': 'red_7025'}}, {'id': 4, 'distance': 0.5975797176361084, 'entity': {'color': 'red_4794'}}, {'id': 6, 'distance': -0.24996188282966614, 'entity': {'color': 'red_9392'}}]"]
import io.milvus.v2.service.vector.request.SearchReq
import io.milvus.v2.service.vector.request.data.FloatVec;
import io.milvus.v2.service.vector.response.SearchResp
FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});
SearchResp resp = client.search(SearchReq.builder()
.collectionName("my_collection")
.annsField("vector")
.data(Collections.singletonList(queryVector))
.outputFields(Collections.singletonList("color"))
.filter("color like \"red%\"")
.topK(5)
.consistencyLevel(ConsistencyLevel.STRONG)
.build());
System.out.println(resp.getSearchResults());
// Output
//
// [[
// SearchResp.SearchResult(entity={color=red_7025}, score=0.6290165, id=1),
// SearchResp.SearchResult(entity={color=red_4794}, score=0.5975797, id=4),
// SearchResp.SearchResult(entity={color=red_9392}, score=-0.24996188, id=6)
//]]
const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
const res = await client.search({
collection_name: "quick_setup",
data: [query_vector],
limit: 5,
// highlight-start
filters: "color like \"red%\"",
output_fields: ["color"]
// highlight-end
});
queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}
resultSets, err := client.Search(ctx, milvusclient.NewSearchOption(
"my_collection", // collectionName
5, // limit
[]entity.Vector{entity.FloatVector(queryVector)},
).WithFilter("color like \"red%\"").
WithANNSField("vector").
WithOutputFields("color"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
for _, resultSet := range resultSets {
fmt.Println("IDs: ", resultSet.IDs.FieldData().GetScalars())
fmt.Println("Scores: ", resultSet.Scores)
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
}
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "my_collection",
"data": [
[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
],
"annsField": "vector",
"filter": "color like \"red%\"",
"limit": 3,
"outputFields": ["color"]
}'
# {"code":0,"cost":0,"data":[{"color":"red_7025","distance":0.6290165,"id":1},{"color":"red_4794","distance":0.5975797,"id":4},{"color":"red_9392","distance":-0.24996185,"id":6}]}
위의 코드 예제에서 사용된 필터 표현식 color like "red%" and likes > 50 에서 조건은 color 필드의 값이 "red"로 시작해야 한다고 지정합니다. 샘플 데이터에서 이 조건을 충족하는 엔티티는 두 개뿐입니다. 따라서 limit (topK)가 3 이하로 설정되면 이 두 엔티티가 모두 반환됩니다.
[
{
"id": 1,
"distance": 0.6290165,
"entity": {
"color": "red_7025"
}
},
{
"id": 4,
"distance": 0.5975797,
"entity": {
"color": "red_4794"
}
},
{
"id": 6,
"distance": -0.24996188,
"entity": {
"color": "red_9392"
}
},
]