ফিল্টার

Qdrant দিয়ে, আপনি বিভিন্ন গুণাবলী দিয়ে সন্ধান বা পয়েন্ট পেতে বা প্রাপ্ত করতে পারবেন, যা ভেক্টরের সাদৃশ্য সন্ধানের সাথে সাথে আবদ্ধতা শর্তগুলি সেট করতে পারবেন, SQL where শর্ত গুলির মত। উদাহরণস্বরূপ, আপনি পয়েন্টের payload এবং id এর জন্য শর্ত সেট করতে পারবেন।

একজন ব্যবসায়িক চাহিদা নির্ভরসূত্র যেমন মালামালের স্থিতিশূণ্যতা, ব্যবহারকারীর অবস্থান, বা প্রত্যাশিত মূল্য ব্যাপারে, এরকম বিভিন্ন ব্যাবসায়িক প্রয়োজনীয়তা পূরণ করার জন্য অতি গুরুত্বপূর্ণ।

ফিল্টারের শর্ত

Qdrant আপনাকে ক্লস গুলিতে শর্ত গুলির সমন্বয় করতে অনুমতি দেয়। ক্লস গুলি বিভিন্ন লজিকাল অপারেশন, যেমন OR, AND, এবং NOT এর মধ্যে বিভাজিত হতে পারে। ক্লস একে অপরের মধ্যে নির্বাচনগুলি পুনরাবৃত্তি করতে পারে, এবং তাই আপনি যেকোনো বুলিয়ান অভুক্তি পুনরাবৃত্তি করতে পারবেন।

আসুন Qdrant এ বিভিন্ন ক্লস গুলি চিন্তা করা যাক।

ধরা যাক আমাদের বিভিন্ন payload সহ পয়েন্ট গুলি আছে:

[
  { "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 ব্যবহার করার সময়, শর্ত একমাত্র সত্য হবে যদি প্রত্যেক শর্ত 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" }
]

যদি ব্যবহার করার সময়, শর্ত সত্য হবে যদি অন্তত একটি শর্ত যদি এ উল্লঙ্ঘন করা হয়। এই দৃষ্টিভঙ্গিতে, যদি অবশ্যই OR অপারেটরের সমান।

must_not

উদাহরণ:

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" }
]

must_not ব্যবহার করার সময়, উপ-ক্লসটি মাত্র সত্য হবে যদি কোনও একটি শর্ত must_not এ উল্লঙ্ঘন না করা হয়। এই দৃষ্টিভঙ্গিতে, must_not অবশ্যই একটি অভিব্যক্তি (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
  }
}

সবচেয়ে সহজ শর্তটি যে স্টোর ভ্যালুটি দেওয়া মানের সাথে সমতুল্য কি না তা চেক করে। যদিপ্র ভ্যালু বেশিক্ষণা থাকে, তাহলে তার মধ্যে অধিকতম একটি শর্ত পূরণ করা উচিত। এটি কীওয়ার্ড, ইন্টিজার, এবং বুলিয়ান পেইলোয়ের অধীনে প্রয়োগ করা যেতে পারে।

কোন ম্যাচ

ভার্সন v1.1.0 থেকে উপলব্ধ

আপনি যদি চেক করতে চান যে স্টোর ভ্যালুটি একাধিক মানের মধ্যে কোন একটি আছে নাকি, তাহলে আপনি কোন ম্যাচ শর্তটি ব্যবহার করতে পারেন। অনুমান্য ম্যাচ প্রদান করে দেওয়া মানের কে যৌক্তিক OR অপারেশন হিসেবে বিবেচিত। এটি ছত্রাকারিতা অপারেটর IN হিসেবে বর্ণনা করা যেতে পারে।

আপনি এটি কীওয়ার্ড এবং ইন্টিজার পেইলোয়ে প্রয়োগ করতে পারেন।

উদাহরণ:

{
  "key": "color",
  "match": {
    "any": ["black", "yellow"]
  }
}

এই উদাহরণে, যদি স্টোর ভ্যালুটি black বা yellow হয়, তাহলে শর্ত পূরণ হবে।

যদি স্টোর ভ্যালু একটি অ্যারে হয়, তবে সেটা অন্তত একটি মান প্রয়োগক্ষম করতে হবে যোখোন সেই দেওয়া মানগুলির মধ্যে কোনও একটি ম্যাচ করে। উদাহরণস্বরূপ, যদি স্টোর ভ্যালু ["black", "green"] হয়, তাহলে শর্ত পূরণ হবে কারণ "black" ["black", "yellow"] এ আছে।

বাদ দেওয়া ম্যাচ

ভার্সন v1.2.0 থেকে উপলব্ধ

আপনি যদি চেক করতে চান যে স্টোর ভ্যালুটি একাধিক মানের মধ্যে কোনোটি নেই, তাহলে আপনি বাদ দেওয়া ম্যাচ শর্তটি ব্যবহার করতে পারেন। বাদ দেওয়া ম্যাচ প্রদান করে দেওয়া মানের কে যৌক্তিক NOR অপারেশন হিসেবে বিবেচিত। এটি NOT IN অপারেটর হিসেবে বর্ণনা করা যেতে পারে।

আপনি ইটি কীওয়ার্ড এবং ইন্টিজার পেইলোয়ে প্রয়োগ করতে পারেন।

উদাহরণ:

{
  "key": "color",
  "match": {
    "except": ["black", "yellow"]
  }
}

এই উদাহরণে, যদি স্টোর ভ্যালুটি না হয় black না yellow, তাহলে শর্ত পূরণ হবে।

যদি স্টোর ভ্যালু অন্তর্ভুক্ত হয়, তবে সেটা অন্তত একটি মান প্রয়োগক্ষম করতে হবে যোখোন সেই দেওয়া মানগুলির মধ্যে কোনো মান ম্যাচ করে না। উদাহরণস্বরূপ, যদি স্টোর ভ্যালু ["black", "green"] হয়, তাহলে শর্ত পূরণ হবে কারণ "green" "black" বা "yellow" এর সাথে ম্যাচ করে না।

পার্শ্ববর্তী কী

v1.1.0 এর পরবর্তী সংস্করণ থেকে উপলব্ধ

পেলোডটি একটি যে কোন জেসন অবজেক্ট, তাই আপনার পার্শ্ববর্তী ক্ষেত্রগুলি ফিল্টার করতে হতে পারে।

সুবিধার জন্য, আমরা Jq প্রকল্পের মতো সংকেতবিধিটি ব্যবহার করি।

ধরা যাক আমাদের একটি সেট পয়েন্ট আছে যার পেলোড হল:

[
  {
    "id": 1,
    "country": {
      "name": "জার্মানি",
      "cities": [
        {
          "name": "বার্লিন",
          "population": 3.7,
          "sightseeing": ["ব্র্যান্ডেনবার্গ গেট", "রাইচস্টাগ"]
        },
        {
          "name": "মিউনিখ",
          "population": 1.5,
          "sightseeing": ["মারিয়েনপ্লাটস", "অলিম্পিয়াপার্ক"]
        }
      ]
    }
  },
  {
    "id": 2,
    "country": {
      "name": "জাপান",
      "cities": [
        {
          "name": "টোকিও",
          "population": 9.3,
          "sightseeing": ["টোকিও টাওয়ার", "টোকিও স্কাইট্রি"]
        },
        {
          "name": "ওসাকা",
          "population": 2.7,
          "sightseeing": ["ওসাকা কাসল", "ইউনিভার্সাল স্টুডিওস জাপান"]
        }
      ]
    }
  }
]

আপনি ডট স্যাক্সন ব্যবহার করে পার্শ্ববর্তী ক্ষেত্রগুলির জন্য অনুসন্ধান করতে পারেন।

POST /সংগ্রহগুলি/{collection_name}/points/scroll

{
    "filter": {
        "should": [
            {
                "key": "country.name",
                "match": {
                    "value": "জার্মানি"
                }
            }
        ]
    }
}

আপনি আবার [ ] সিনট্যাক্স ব্যবহার করতে পারেন যে অ্যারে প্রক্ষেপিত মাধ্যমে অ্যারে সঙ্গে অন্তর্ভুক্ত মানগুলি মধ্যে অনুসন্ধান করার জন্য।

POST /সংগ্রহগুলি/{collection_name}/points/scroll

{
    "filter": {
        "should": [
            {
                "key": "country.cities[].population",
                "range": {
                    "gte": 9.0,
                }
            }
        ]
    }
}

এই প্রশ্নটি শুধুমাত্র পয়েন্ট টি উত্পন্ন করে, কারণ শুধুমাত্র জাপানের একটি শহরে একটি জনসংখ্যা 9.0 এর চেয়ে বেশি আছে।

পার্শ্ববর্তী ক্ষেত্রগুলি একটি অ্যারে হওয়ার মূলক।

POST /সংগ্রহগুলি/{collection_name}/points/scroll

{
    "filter": {
        "should": [
            {
                "key": "country.cities[].sightseeing",
                "match": {
                    "value": "ওসাকা কাসল"
                }
            }
        ]
    }
}

এই জিজ্ঞাসা শুধুমাত্র পয়েন্ট টি উত্পন্ন করে, কারণ শুধুমাত্র জাপানের একটি শহরে "ওসাকা কাসল" শব্দটি অন্তর্ভুক্ত ব্যায়ামকেন্দ্র হিসেবে ধারণ করা হয়।

নেস্টেড অবজেক্ট ফিল্টারিং

সংস্করণ 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 এর সাথে খাদ্য = meat এবং diet[1].likes এর সাথে likes = true মেলে
  • "diplodocus" মিটের সাথে diet[1].food এর সাথে খাদ্য = meat এবং diet[0].likes এর সাথে likes = true মেলে

শুধুমাত্র অ্যারে উপাদানগুলির জন্য শর্ত পূরণ করতে, উদাহরণরূপে, এই উদাহরণে প্রথমটির আইডি সহ পয়েন্ট পেতে, আপনাকে নেস্টেড অবজেক্ট ফিল্টার ব্যবহার করতে হবে।

নেস্টেড অবজেক্ট ফিল্টার অনুমতি দেয় প্রতিষ্ঠানভাবে অবজেক্ট অ্যারে কুয়েরী করা।

এটি পেতে ঢোকার মান ব্যবহার করা হয়, যা দায়িত্বকে নির্ধারণ করে এবং ফিল্টার প্রয়োগ করে।

মূল কীটিয়ের পরিশেষগুলি দেখার জন্য পস্থা দেয়। কোনও ফিল্টার প্রয়োগ করার সময় নেস্টেড ফিল্টার এক্সপ্লেইন্ড যাতে একটি অ্যারের একক উপাদানে নেস্টেড ফিল্টার প্রয়োগ করা হয়। কমপ্লেন্ট ডকুমেন্ট হিসাবে মেনে নেয়া হয় শর্ত পূরণ হলে এই অ্যারে মধ্যে অন্তর্নিহিত ফিল্টার মেলে যায় যতক্ষণ প্রতিটি উপাদান শর্তাবলী পূরণ করে।

সীমাবদ্ধতা

নেস্টেড অবজেক্ট ফিল্টার অধিকার করে না has_id শর্ত। যদি আপনি এটি ব্যবহার করতে চান, তবে তা একইত্থেমি must ক্লজে রাখুন।

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 থেকে উপলব্ধ

ম্যাচ শর্তের একটি বিশেষ মূলত অবিকলিত পাঠ ম্যাচিং শর্ত। এটি আপনাকে পাঠের বিশেষ সাবস্ট্রিং, টোকেন, বা ফ্রেজিতে অনুসন্ধান করতে অনুমতি দেয়।

এই শর্তে যথার্থ পাঠ কোনও পূর্ণ-পাঠ অনুসন্ধান কনফিগারেশনের উপর নির্ভর করে। এই কনফিগারেশনটি ইনডেক্স তৈরি করা হওয়ার সময় নির্ধারিত হয় এবং পূর্ণ-পাঠ ইনডেক্সের মধ্যে বর্ণিত হয়।

যদি তার কোনও পূর্ণ-পাঠ ইনডেক্স না থাকে, তাহলে এই শর্তটি বর্ণিত সাবস্ট্রিং ম্যাচিং ভিত্তিকভাবে কাজ করবে।

{
  "key": "description",
  "match": {
    "text": "good and cheap"
  }
}

যদি কোয়েরিতে কয়েকটি শব্দ থাকে, তবে এই শর্তটি কেবলমাত্র সম্মত হয় যখন সমস্ত শব্দটি পাঠে প্রকাশ করে।

ব্যাপ্তি

{
  "key": "price",
  "range": {
    "gt": null,
    "gte": 100.0,
    "lt": null,
    "lte": 450.0
  }
}

range শর্তটি সংরক্ষিত পেলোডের মানের সম্ভাব্য ব্যাপ্তিটি নির্ধারণ করে। যদি একাধিক মান সংরক্ষণ করা হয়, অন্ততপক্ষে একটি মানের সাথে শর্তটির মিল থাকা উচিত।

উপলব্ধ তুলনা অপারেশন সম্মিলিত বিষয় হল:

  • gt - চেয়েপে
  • gte - অথবা সমান
  • lt - কম
  • lte - কম অথবা সমান

এটি দশমিক সংখ্যা এবং পূর্ণ পেলোডের উপর প্রযোগ করা যেতে পারে।

ভৌগোলিক সীমা বক্স

{
  "key": "location",
  "geo_bounding_box": {
    "bottom_right": {
      "lat": 52.495862,
      "lon": 13.455868
    },
    "top_left": {
      "lat": 52.520711,
      "lon": 13.403683
    }
  }
}

এটি location এমন বৃত্তের মধ্যে মিল করে, যা bottom_right এর স্থানান্তরান্ত ঠিকানার সাথে এবং top_left এর স্থানান্তরান্ত ঠিকানার সাথে।

ভৌগোলিক ব্যাসার্ধি

{
  "key": "location",
  "geo_radius": {
    "center": {
      "lat": 52.520711,
      "lon": 13.403683
    },
    "radius": 1000.0
  }
}

এটি location এমন বৃত্তের মধ্যে মিল করে, যা কেন্দ্র হতে 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"] }]

যদি সংরক্ষিত মান একটি অ্যারে না হয়, তবে মানের গণনা সমান হওয়া মানা হয়।

খালি

কিছুসময়, নির্দিষ্ট মানগ