فلٹر
Qdrant کے ساتھ، آپ نقطوں کو تلاش یا حاصل کرنے کے لئے شرائط کا تعین کر سکتے ہیں، جس کا مطلب ہے کہ آپ ویکٹر کی مماثلت کی تلاش کے علاوہ خصوصیت کے لحاظ سے فلٹر کرسکتے ہیں، جیسے ایس کی 'where' شرائط کو سیٹ کرنا۔ مثال کے طور پر، آپ مواد اور نقطے کی 'id' کے لئے شرائط سیٹ کرسکتے ہیں۔
جب نقطے کی تصوری صفات کو ایک ایمبیڈنگ میں ظاہر کرنا ممکن نہ ہوتا ہے تو اضافی شرائط سیٹ کرنا اہم ہوتا ہے۔ مثال کے طور پر، انوینٹری دستیابی، صارف کی جگہ یا متوقع قیمت کے رینج وغیرہ جیسے مختلف کاروباری ضروریات۔
فلٹر شرائط
Qdrant آپ کو کلوز میں شرائط کا مجموعہ کرنے کی اجازت دیتا ہے۔ کلوز مختلف منطقی عملیات ہیں، مثلاً OR
، AND
، اور NOT
۔ کلوز دوسرے کے اندر تسلسل میں نیسٹ ہوسکتے ہیں، لہذا آپ کسی بھی بولین ایکسپریشن کو دوبارہ بنا سکتے ہیں۔
آئیے دیکھتے ہیں کہ Qdrant میں کون کونسے کلوزز کا عمل ہوتا ہے۔
فرض کریں ہمارے پاس پیمانوں کا ایک سیٹ ہے جس میں پیماؤں کے پیمانے ہیں:
[
{ "id": 1, "city": "London", "color": "green" },
{ "id": 2, "city": "London", "color": "red" },
{ "id": 3, "city": "London", "color": "blue" },
{ "id": 4, "city": "Berlin", "color": "red" },
{ "id": 5, "city": "Moscow", "color": "green" },
{ "id": 6, "city": "Moscow", "color": "blue" }
]
ضروری
مثال:
POST /collections/{collection_name}/points/scroll
{
"filter": {
"must": [
{ "key": "city", "match": { "value": "London" } },
{ "key": "color", "match": { "value": "red" } }
]
}
...
}
فلٹر شدہ نقطے یہ ہوں گے:
[{ "id": 2, "city": "London", "color": "red" }]
must
کا استعمال کرتے وقت کلوز صرف اس صورت میں true
ہوتا ہے جب ہر ایک شرط جو must
میں فہرست کی گئی ہو وہ پوری ہو۔ اس معنی میں must
AND
آپریٹر کے مترادف ہے۔
کرسکتا ہے
شولڈ
SQL کے OR
آپریٹر کے مترادف ہے۔
مثال:
POST /collections/{collection_name}/points/scroll
{
"filter": {
"should": [
{ "key": "city", "match": { "value": "London" } },
{ "key": "color", "match": { "value": "red" } }
]
}
...
}
فلٹر شدہ نقطے یہ ہوں گے:
[
{ "id": 1, "city": "London", "color": "green" },
{ "id": 2, "city": "London", "color": "red" },
{ "id": 3, "city": "London", "color": "blue" },
{ "id": 4, "city": "Berlin", "color": "red" }
]
شولڈ
کا استعمال کرتے وقت کلوز صرف اس صورت میں true
ہوتا ہے جب کم سے کم ایک شرط جو شولڈ
میں فہرست کی گئی ہو وہ پوری ہو۔ اس معنی میں شولڈ
OR
آپریٹر کے مترادف ہوتا ہے۔
مسٹ_ناٹ
مثال:
POST /collections/{collection_name}/points/scroll
{
"filter": {
"must_not": [
{ "key": "city", "match": { "value": "London" } },
{ "key": "color", "match": { "value": "red" } }
]
}
...
}
فلٹر شدہ نقطے یہ ہوں گے:
[
{ "id": 5, "city": "Moscow", "color": "green" },
{ "id": 6, "city": "Moscow", "color": "blue" }
]
مسٹ_ناٹ
کا استعمال کرنے وقت سب کچھ صرف اس صورت میں true
ہوتا ہے جب کوئی بھی شرط جو مسٹ_ناٹ
میں فہرست کی گئی ہو وہ پوری نہ ہو۔ اس معنی میں مسٹ_ناٹ
(NOT A) AND (NOT B) AND (NOT C)
کے مترادف ہوتا ہے۔
شرائط کا مجموعہ
ایک ساتھ مختلف شرائط استعمال کرنا ممکن ہے۔
POST /collections/{collection_name}/points/scroll
{
"filter": {
"must": [
{ "key": "city", "match": { "value": "London" } }
],
"must_not": [
{ "key": "color", "match": { "value": "red" } }
]
}
...
}
فلٹر کردہ نقطے درج ذیل ہوں گے:
[
{ "id": 1, "city": "London", "color": "green" },
{ "id": 3, "city": "London", "color": "blue" }
]
اس صورت میں، شرائط AND
استعمال کرکے ملاتی ہیں۔
علاوہ ازیں، شرائط کو تسلسل سے گنجائش دی جا سکتی ہے۔ مثال کے طور پر:
POST /collections/{collection_name}/points/scroll
{
"filter": {
"must_not": [
{
"must": [
{ "key": "city", "match": { "value": "London" } },
{ "key": "color", "match": { "value": "red" } }
]
}
]
}
...
}
فلٹر کردہ نقطے درج ذیل ہوں گے:
[
{ "id": 1, "city": "London", "color": "green" },
{ "id": 3, "city": "London", "color": "blue" },
{ "id": 4, "city": "Berlin", "color": "red" },
{ "id": 5, "city": "Moscow", "color": "green" },
{ "id": 6, "city": "Moscow", "color": "blue" }
]
شرطی فلٹرنگ
پیمانے میں، مختلف قسم کی قیمتیں ان کے لیے مختلف قسم کی شرائطوں کا استعمال کیا جا سکتا ہے۔ چلیں موجودہ شرطی انوکھے انداز اور ان کے استعمالی ڈیٹا ٹائپس کو دیکھیں۔
میچنگ
{
"key": "color",
"match": {
"value": "red"
}
}
دوسری قسموں کے لیے بھی، میچنگ شرائط بالکل ایسے ہی دکھائی دیتی ہیں، صرف مختلف قسم استعمال ہوتی ہے:
{
"key": "count",
"match": {
"value": 0
}
}
سب سے سادہ شرط یہ دیکھتی ہے کہ محفوظ شدہ قیمت دی گئی قیمت کے برابر ہے یا نہیں۔ اگر محفوظ شدہ قیمتوں میں سے کئی ہیں، تو کم از کم ایک ان شرائط کو پورا کرنا چاہئے۔ یہ کیوورڈ، عدد صحیح، اور بولیں ڈیٹا پر لاگو کیا جا سکتا ہے۔
کسی بھی میچ
وی. 1.1.0 کے بعد دستیاب
اگر آپ چاہتے ہیں کہ چیک کریں کہ محفوظ شدہ قیمت میں سے ایک سے زیادہ قیمتوں میں سے کوئی ایک ہے، تو آپ کسی بھی میچ شرط کا استعمال کرسکتے ہیں۔ کسی بھی میچ محفوظ شدہ قیمت کو منطقی یا عملی OR
عمل کی طرح دیتا ہے۔ اسے IN
آپریٹر بھی کہا جا سکتا ہے۔
آپ اسے کیوورڈ اور عدد صحیح ڈیٹا پر لاگو کرسکتے ہیں۔
مثال:
{
"key": "color",
"match": {
"any": ["black", "yellow"]
}
}
اس مثال میں، اگر محفوظ شدہ قیمت black
یا yellow
ہوتی ہے، تو شرط پوری ہو جائے گی۔
اگر محفوظ شدہ قیمت ایک ایرے ہوتی ہے، تو کم از کم ایک قیمت کو ہونا چاہئے جو دی گئی قیمتوں میں سے کسی ایک سے میل رہی ہو۔ مثال کے طور پر، اگر محفوظ قیمت ["black", "green"]
ہوتی ہے، تو شرط پوری ہو جائے گی کیونکہ "black"
["black", "yellow"]
میں ہے۔
مستثنی میچ
وی. 1.2.0 کے بعد دستیاب
اگر آپ چاہتے ہیں کہ چیک کریں کہ محفوظ شدہ قیمت کسی بھی مختلف قیمتوں میں سے کوئی ایک نہیں ہے، تو آپ مستثنی میچ شرط کا استعمال کرسکتے ہیں۔ مستثنی میچ محفوظ شدہ قیمت کو منطقی یا NOR
عمل کی طرح دیتا ہے۔ اسے NOT IN
آپریٹر بھی کہا جا سکتا ہے۔
آپ اسے کیوورڈ اور عدد صحیح ڈیٹا پر لاگو کرسکتے ہیں۔
مثال:
{
"key": "color",
"match": {
"except": ["black", "yellow"]
}
}
اس مثال میں، اگر محفوظ شدہ قیمت نہ تو black
ہوتی ہے اور نہ ہی yellow
ہوتی ہے، تو شرط پوری ہو جائے گی۔
اگر محفوظ شدہ قیمت ایک ایرے ہوتی ہے، تو کم از کم ایک قیمت کو ہونا چاہئے جو دی گئی قیمتوں میں سے کسی ایک سے میل نہ کررہی ہو۔ مثال کے طور پر، اگر محفوظ قیمت ["black", "green"]
ہوتی ہے، تو شرط پوری ہو جائے گی کیونکہ "green"
"black"
یا "yellow"
کے ساتھ میل نہ کررہی ہے۔
نسٹڈ کلیدز
v1.1.0 کے بعد دستیاب
جیسے ہی پیمانے کو ایک انتخابی JSON شے بنایا گیا ہوتا ہے تو آپ کو نسٹڈ فیلڈز کو فلٹر کرنے کی ضرورت ہو سکتی ہے۔
ہم آسانی سے Jq پروجیکٹ کی طرح کے ایک سائنٹیکس کا استعمال کرتے ہیں۔
تصور کریں ہمارے پاس مندرجہ ذیل پیمانے والے نقطے ہیں:
[
{
"id": 1,
"country": {
"name": "Germany",
"cities": [
{
"name": "Berlin",
"population": 3.7,
"sightseeing": ["Brandenburg Gate", "Reichstag"]
},
{
"name": "Munich",
"population": 1.5,
"sightseeing": ["Marienplatz", "Olympiapark"]
}
]
}
},
{
"id": 2,
"country": {
"name": "Japan",
"cities": [
{
"name": "Tokyo",
"population": 9.3,
"sightseeing": ["Tokyo Tower", "Tokyo Skytree"]
},
{
"name": "Osaka",
"population": 2.7,
"sightseeing": ["Osaka Castle", "Universal Studios Japan"]
}
]
}
}
]
آپ نسٹڈ فیلڈز کو تلاش کرنے کے لئے ڈاٹ نوٹیشن استعمال کر سکتے ہیں۔
POST /collections/{collection_name}/points/scroll
{
"filter": {
"should": [
{
"key": "country.name",
"match": {
"value": "Germany"
}
}
]
}
}
آپ [ ]
سائنٹیکس بھی استعمال کر سکتے ہیں تاکہ آپ اندر کے قیمتوں کو نمایاں کرکے ایک اردوفہم بنا سکیں۔
POST /collections/{collection_name}/points/scroll
{
"filter": {
"should": [
{
"key": "country.cities[].population",
"range": {
"gte": 9.0,
}
}
]
}
}
اس کوئیری میں صرف پوائنٹ جو معرفت 2 کے ساتھ ہیں ہیں، کیونکہ صرف جاپان میں ایک شہر ہے جس کی آبادی 9.0 سے زیادہ ہے۔
نسٹڈ فیلڈز ایک سے زیادہ ارے بھی ہو سکتے ہیں۔
POST /collections/{collection_name}/points/scroll
{
"filter": {
"should": [
{
"key": "country.cities[].sightseeing",
"match": {
"value": "Osaka Castle"
}
}
]
}
}
اس کوئیری میں صرف پوائنٹ جو معرف 2 کے ساتھ ہیں، کیونکہ صرف جاپان میں ایک شہر ہے جس میں دیدار کا مقام "Osaka Castle" شامل ہے۔
نسٹڈ آبجیکٹ فلٹرنگ
ورژن 1.2.0 سے دستیاب
پہلے سے طے شدہ طور پر، شرائط نقطہ کے پوری پیمانے کو مد نظر میں لیتے ہیں۔
مثال کے طور پر، مندرجہ ذیل پیمانے میں دی گئی دو نقطوں کے موازنہ کا تصور کریں۔
[
{
"id": 1,
"dinosaur": "t-rex",
"diet": [
{ "food": "leaves", "likes": false},
{ "food": "meat", "likes": true}
]
},
{
"id": 2,
"dinosaur": "diplodocus",
"diet": [
{ "food": "leaves", "likes": true},
{ "food": "meat", "likes": false}
]
}
]
مندرجہ ذیل کوئری ان دو نقطوں کو ملا دینے کے لیے ہو گی:
POST /collections/{collection_name}/points/scroll
{
"filter": {
"must": [
{
"key": "diet[].food",
"match": {
"value": "meat"
}
},
{
"key": "diet[].likes",
"match": {
"value": true
}
}
]
}
}
مذکورہ بالا دو نقطوں کو متماثل قرار دینے کا وجہ یہ ہے کہ ان دونوں نقطوں نے مندرجہ بالا دو شرائط کو پورا کیا ہے:
- "t-rex" نے "diet[1].food" کو مٹن کے ساتھ پرتا (food = meat) اور "diet[1].likes" کو (likes = true) پرتا ہے
- "diplodocus" نے "diet[1].food" کو مٹن کے ساتھ پرتا (food = meat) اور "diet[0].likes" کو (likes = true) پرتا ہے
صرف وہ نقطے حاصل کرنے کے لیے جو ارائے شدہ معیاروں کو مطمئن کرتے ہیں، مثال کے طور پر اس مثال میں نقطہ نمبر 1، کے لیے نسٹڈ آبجیکٹ فلٹر استعمال کرنا ضروری ہے۔
نسٹڈ آبجیکٹ فلٹرز، آبجیکٹ ارایہ کو الگ الگ پوچھتے ہیں۔
اس کو حاصل کرنے کے لیے nested
حالت کا استعمال کرتے ہیں جو payload key of interest اور لگانے والے فلٹر سے مشتمل ہے۔
اس کی کلید آبجیکٹ ارایہ کو اشارہ کرنا چاہئے اور اختیاری طور پر چکر کی علامت استعمال کر سکتی ہے ("data" یا "data[]")۔
POST /collections/{collection_name}/points/scroll
{
"filter": {
"must": [
"nested": {
{
"key": "diet",
"filter": {
"must": [
{
"key": "food",
"match": {
"value": "meat"
}
},
{
"key": "likes",
"match": {
"value": true
}
}
]
}
}
}
]
}
}
موازنہ منطق کو ترتیب دی جاتی ہے تا کے پیدا مثبت کو وصول کرنے والے جلدی میں payload میں موجود آبجیکٹ کی سطح پر عمل کرے۔
نسٹڈ فلٹر، جب ایک آرے کے ایک عنصر پر نسٹ فلٹر لگایا جاتا ہے تو وہی طریقہ کام کرتا ہے۔ جب تک آرے کے کم سے کم ایک عنصر کونے فلٹر سے مطابقت ہوتی ہے، والد کا معیار مطمئن کرنے کے لیے قرار دیتا ہے۔
محدودیت
نسٹڈ آبجیکٹ فلٹرز has_id
حالت کا پشتیبانی نہیں کرتے۔ اگر آپ اس کا استعمال کرنا چاہتے ہیں، تو اسے مجاور must
clause میں رکھیں۔
POST /collections/{collection_name}/points/scroll
{
"filter": {
"must": [
"nested": {
{
"key": "diet",
"filter": {
"must": [
{
"key": "food",
"match": {
"value": "meat"
}
},
{
"key": "likes",
"match": {
"value": true
}
}
]
}
}
},
{ "has_id": [1] }
]
}
}
بالکل ٹیکسٹ میچنگ
ورژن 0.10.0 سے دستیاب
match
شرط کا ایک خاص مقام ٹیکسٹ میچنگ کا مقام ہے۔ یہ آپ کو ٹیکسٹ فیلڈ میں مخصوص سب سٹرنگ، ٹوکنز، یا جملوں کی تلاش کرنے کا اجازت دیتا ہے۔
اس شرط کو pur-text index کی تشکیل پر منحصر ہوتا ہے۔ یہ تشکیل پوری-ٹیکسٹ انڈیکس کی تشکیل کے دوران مقرر ہوتی ہے اور پوری-ٹیکسٹ انڈیکس کی بیان کی گئی ہوتی ہے۔
اگر فیلڈ میں پوری-ٹیکسٹ انڈیکس نہ ہو تو، یہ شرط بالکل سب سٹرنگ میچنگ پر بنیاد چلتا ہے۔
{
"key": "description",
"match": {
"text": "good and cheap"
}
}
اگر کوئیری میں کئی الفاظ ہوں تو، یہ شرط صرف اس وقت مطمئن ہوتی ہے جب تمام الفاظ متن میں نظر آئیں۔
{
"key": "قیمت",
"range": {
"gt": null,
"gte": 100.0,
"lt": null,
"lte": 450.0
}
}
range
شرط مخزن شدہ پیمانے کی ممکنہ رینج کو سیٹ کرتا ہے۔ اگر متعدد قیمتیں محفوظ ہوتی ہیں تو کم از کم ایک قیمت کو شرط پر پورا کرنا چاہئے۔
موجودہ موازنہ عملوں میں شامل ہیں:
-
gt
- سے زیادہ -
gte
- سے زیادہ یا اس کے برابر -
lt
- سے کم -
lte
- سے کم یا اس کے برابر
اسے فرضی نمبرز اور مکمل عددی پیمانے پر لاگو کیا جا سکتا ہے۔
جغرافیائی حدودی باکس
{
"key": "مقام",
"geo_bounding_box": {
"bottom_right": {
"lat": 52.495862,
"lon": 13.455868
},
"top_left": {
"lat": 52.520711,
"lon": 13.403683
}
}
}
یہ مقام
کو نشانہ میں موافق ریکٹینگل کے اندر میچ کرتا ہے جس کے کارکون کی تنظیم
bottom_rightپر ہوتی ہے اور
top_left` پر پتہ ہوتا ہے۔
جغرافیائی ریڈیس
{
"key": "مقام",
"geo_radius": {
"center": {
"lat": 52.520711,
"lon": 13.403683
},
"radius": 1000.0
}
}
یہ مقام
کو نشانہ میں وسط کے ساتھ کرکٹ کے اندر میچ کرتا ہے جس کا وسط
centerہوتا ہے اور ریڈیس
radius` میٹرز ہوتی ہے۔
اگر متعدد قیمتیں محفوظ ہیں تو کم از کم ایک قیمت کو شرط پر پورا کرنا چاہئے۔ یہ شرائط صرف جغرافیائی ڈیٹا فارمیٹ کو مطابق ہونے والے پیمانوں پر لاگو کی جا سکتی ہیں۔
قیمت کا حساب
صرف سیدھی قیمت کی موازنہ کے علاوہ، فلٹر کرنا بھی قیمتوں کی تعداد پر مبنی ہو سکتا ہے۔
مثال کے طور پر، مندرجہ ذیل ڈیٹا دیا گیا ہے:
[
{ "id": 1, "name": "Product A", "comments": ["Very good!", "Excellent"] },
{ "id": 2, "name": "Product B", "comments": ["Fair", "Expecting more", "Good"] }
]
ہم صرف وہ چیزیں تلاش کر سکتے ہیں جو دو سے زیادہ تبصرے رکھتی ہیں:
{
"key": "comments",
"values_count": {
"gt": 2
}
}
نتیجہ یہ ہوگا:
[{ "id": 2, "name": "Product B", "comments": ["Fair", "Expecting more", "Good"] }]
اگر محفوظ قیمت ایک ایکسٹرے ہے تو یہ فرض کیا جاتا ہے کہ قیمت کی تعداد برابر ہے۔
خالی ہے
کبھی کبھار، کچھ قیمتوں کے عدم وجود کو فلٹر کرنا مفید ہوتا ہے۔ خالی
شرط آپ کو اس مقصد کو حاصل کرنے میں مددگار ثابت ہو سکتی ہے:
{
"is_empty": {
"key": "reports"
}
}
یہ شرط ان تمام ریکارڈز کے ساتھ میچ ہوگی جہاں reports
کا فیلڈ موجود نہیں ہے یا اس کا قیمت null
یا []
ہے۔
خالی ہے عموماً must_not کے منطقی انکار کے ساتھ استعمال کرنے پر بہت مفید ہوتی ہے۔ اس صورت میں، یہ تمام غیر خالی قیمتیں منتخب کر لیں گی۔
نل
میچ کنڈیشن NULL
قیمتوں کا امتحان نہیں کرسکتی۔ ہمیں IsNull
کنڈیشن استعمال کرنی چاہئے:
{
"is_null": {
"key": "reports"
}
}
یہ شرط ان تمام ریکارڈز کے ساتھ میچ ہوگی جہاں reports
کا فیلڈ موجود ہے اور اس کی قیمت NULL
ہے۔
آئی ڈی ہے
یہ قسم کا کوئی سوال پیمانے سے متعلق نہیں ہوتا ہے مگر یہ مختلف صورتوں میں بہت مفید ہوتا ہے۔ مثال کے طور پر، صارف کو مخصوص تلاش کے نتائج کو بیک وقت تنسیق دینا چاہئے، یا ہم صرف مخصوص نقطوں کے درمیان تلاش کرنا چاہتے ہیں۔
POST /collections/{collection_name}/points/scroll
{
"filter": {
"must": [
{ "has_id": [1,3,5,7,9,11] }
]
}
...
}
فلٹر کردہ نقطے یہ ہوں گے:
[
{ "id": 1, "city": "London", "color": "green" },
{ "id": 3, "city": "London", "color": "blue" },
{ "id": 5, "city": "Moscow", "color": "green" }
]