# البحث عن وثائق متجر المتجهات حسب التشابه الدلالي

{% openapi src="<https://4065521171-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKV4TZLzR1jCpM5coRezn%2Fuploads%2Fgit-blob-77b6137eeb641262ec8e531c78123c02b825b865%2Frememberizer_openapi.yml?alt=media&token=5e84eb03-c48b-4980-9792-73172ea64dd4>" path="/vector-stores/{vector-store-id}/documents/search" method="get" %}
[rememberizer\_openapi.yml](https://4065521171-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKV4TZLzR1jCpM5coRezn%2Fuploads%2Fgit-blob-77b6137eeb641262ec8e531c78123c02b825b865%2Frememberizer_openapi.yml?alt=media\&token=5e84eb03-c48b-4980-9792-73172ea64dd4)
{% endopenapi %}

## طلبات مثال

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X GET \
  "https://api.rememberizer.ai/api/v1/vector-stores/vs_abc123/documents/search?q=كيف%20نقوم%20بدمج%20منتجنا%20مع%20أنظمة%20طرف%20ثالث&n=5&prev_chunks=1&next_chunks=1" \
  -H "x-api-key: YOUR_API_KEY"
```

{% hint style="info" %}
استبدل `YOUR_API_KEY` بمفتاح واجهة برمجة التطبيقات الخاص بك لـ Vector Store و `vs_abc123` بمعرف Vector Store الخاص بك.
{% endhint %}
{% endtab %}

{% tab title="JavaScript" %}

```javascript
const searchVectorStore = async (vectorStoreId, query, numResults = 5, prevChunks = 1, nextChunks = 1) => {
  const url = new URL(`https://api.rememberizer.ai/api/v1/vector-stores/${vectorStoreId}/documents/search`);
  url.searchParams.append('q', query);
  url.searchParams.append('n', numResults);
  url.searchParams.append('prev_chunks', prevChunks);
  url.searchParams.append('next_chunks', nextChunks);
  
  const response = await fetch(url.toString(), {
    method: 'GET',
    headers: {
      'x-api-key': 'YOUR_API_KEY'
    }
  });
  
  const data = await response.json();
  console.log(data);
};

searchVectorStore(
  'vs_abc123',
  'كيف نقوم بدمج منتجنا مع أنظمة طرف ثالث',
  5,
  1,
  1
);
```

{% hint style="info" %}
استبدل `YOUR_API_KEY` بمفتاح واجهة برمجة التطبيقات الخاص بك لـ Vector Store و `vs_abc123` بمعرف Vector Store الخاص بك.
{% endhint %}
{% endtab %}

{% tab title="Python" %}

```python
import requests

def search_vector_store(vector_store_id, query, num_results=5, prev_chunks=1, next_chunks=1):
    headers = {
        "x-api-key": "YOUR_API_KEY"
    }
    
    params = {
        "q": query,
        "n": num_results,
        "prev_chunks": prev_chunks,
        "next_chunks": next_chunks
    }
    
    response = requests.get(
        f"https://api.rememberizer.ai/api/v1/vector-stores/{vector_store_id}/documents/search",
        headers=headers,
        params=params
    )
    
    data = response.json()
    print(data)

search_vector_store(
    'vs_abc123',
    'كيف نقوم بدمج منتجنا مع أنظمة طرف ثالث',
    5,
    1,
    1
)
```

{% hint style="info" %}
استبدل `YOUR_API_KEY` بمفتاح واجهة برمجة التطبيقات الخاص بك لـ Vector Store و `vs_abc123` بمعرف Vector Store الخاص بك.
{% endhint %}
{% endtab %}

{% tab title="Ruby" %}

```ruby
require 'net/http'
require 'uri'
require 'json'

def search_vector_store(vector_store_id, query, num_results=5, prev_chunks=1, next_chunks=1)
  uri = URI("https://api.rememberizer.ai/api/v1/vector-stores/#{vector_store_id}/documents/search")
  params = {
    q: query,
    n: num_results,
    prev_chunks: prev_chunks,
    next_chunks: next_chunks
  }
  
  uri.query = URI.encode_www_form(params)
  
  request = Net::HTTP::Get.new(uri)
  request['x-api-key'] = 'YOUR_API_KEY'
  
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  
  response = http.request(request)
  data = JSON.parse(response.body)
  puts data
end

search_vector_store(
  'vs_abc123',
  'كيف نقوم بدمج منتجنا مع أنظمة طرف ثالث',
  5,
  1,
  1
)
```

{% hint style="info" %}
استبدل `YOUR_API_KEY` بمفتاح واجهة برمجة التطبيقات الخاص بك لـ Vector Store و `vs_abc123` بمعرف Vector Store الخاص بك.
{% endhint %}
{% endtab %}
{% endtabs %}

## معلمات المسار

| المعلمة         | النوع | الوصف                                              |
| --------------- | ----- | -------------------------------------------------- |
| vector-store-id | سلسلة | **مطلوب.** معرف متجر المتجهات الذي سيتم البحث فيه. |

## معلمات الاستعلام

| المعلمة      | النوع    | الوصف                                                |
| ------------ | -------- | ---------------------------------------------------- |
| q            | سلسلة    | **مطلوب.** نص استعلام البحث.                         |
| n            | عدد صحيح | عدد النتائج التي سيتم إرجاعها. الافتراضي: 10.        |
| t            | رقم      | عتبة المطابقة. الافتراضي: 0.7.                       |
| prev\_chunks | عدد صحيح | عدد الأجزاء قبل الجزء المطابق لتضمينه. الافتراضي: 0. |
| next\_chunks | عدد صحيح | عدد الأجزاء بعد الجزء المطابق لتضمينه. الافتراضي: 0. |

## تنسيق الاستجابة

```json
{
  "vector_store": {
    "id": "vs_abc123",
    "name": "وثائق المنتج"
  },
  "matched_chunks": [
    {
      "document": {
        "id": 1234,
        "name": "دليل التكامل.pdf",
        "type": "application/pdf",
        "size": 250000,
        "indexed_on": "2023-06-15T10:30:00Z",
        "vector_store": "vs_abc123",
        "created": "2023-06-15T10:15:00Z",
        "modified": "2023-06-15T10:30:00Z"
      },
      "matched_content": "يقدم منتجنا عدة خيارات للتكامل مع أنظمة الطرف الثالث. الطريقة الأساسية هي من خلال واجهة برمجة التطبيقات RESTful الخاصة بنا، التي تدعم مصادقة OAuth2. بالإضافة إلى ذلك، يمكنك استخدام مجموعة أدوات التطوير المتاحة بلغة بايثون، وجافا سكريبت، وجافا.",
      "distance": 0.123
    },
    // ... المزيد من الأجزاء المتطابقة
  ]
}
```

## المصادقة

تتطلب هذه النقطة النهائية المصادقة باستخدام مفتاح API في رأس `x-api-key`.

## استجابات الخطأ

| رمز الحالة | الوصف                                                 |
| ---------- | ----------------------------------------------------- |
| 400        | طلب غير صالح - معلمات مطلوبة مفقودة أو تنسيق غير صالح |
| 401        | غير مصرح - مفتاح API غير صالح أو مفقود                |
| 404        | غير موجود - لم يتم العثور على متجر المتجهات           |
| 500        | خطأ في الخادم الداخلي                                 |

## نصائح تحسين البحث

### نوافذ السياق

استخدم معلمات `prev_chunks` و `next_chunks` للتحكم في مقدار السياق المضمن مع كل تطابق:

* اضبط كلاهما على 0 للحصول على تطابقات دقيقة بدون سياق
* اضبط كلاهما على 1-2 للحصول على تطابقات مع سياق ضئيل
* اضبط كلاهما على 3-5 للحصول على تطابقات مع سياق كبير

### عتبة المطابقة

يتحكم معلم `t` في مدى دقة تصفية المطابقات:

* القيم الأعلى (مثل 0.9) تعيد فقط المطابقات القريبة جدًا
* القيم الأدنى (مثل 0.5) تعيد المزيد من المطابقات بتنوع أكبر
* القيمة الافتراضية (0.7) توفر نهجًا متوازنًا

## العمليات الجماعية

لتطبيقات عالية الإنتاجية، يدعم Rememberizer عمليات جماعية فعالة على مخازن المتجهات. تعمل هذه الطرق على تحسين الأداء عند معالجة استعلامات بحث متعددة.

### تنفيذ البحث الجماعي

{% tabs %}
{% tab title="Python" %}

```python
import requests
import time
import concurrent.futures

def batch_search_vector_store(vector_store_id, queries, num_results=5, batch_size=10):
    """
    إجراء عمليات بحث جماعية ضد مخزن المتجهات
    
    Args:
        vector_store_id: معرف مخزن المتجهات للبحث
        queries: قائمة بسلاسل استعلام البحث
        num_results: عدد النتائج لكل استعلام
        batch_size: عدد الطلبات المتوازية
        
    Returns:
        قائمة بنتائج البحث
    """
    headers = {
        "x-api-key": "YOUR_API_KEY"
    }
    
    results = []
    
    # المعالجة في دفعات لتجنب إغراق واجهة برمجة التطبيقات
    for i in range(0, len(queries), batch_size):
        batch_queries = queries[i:i+batch_size]
        
        with concurrent.futures.ThreadPoolExecutor(max_workers=batch_size) as executor:
            futures = []
            
            for query in batch_queries:
                params = {
                    "q": query,
                    "n": num_results,
                    "prev_chunks": 1,
                    "next_chunks": 1
                }
                
                # إرسال الطلب إلى مجموعة الخيوط
                future = executor.submit(
                    requests.get,
                    f"https://api.rememberizer.ai/api/v1/vector-stores/{vector_store_id}/documents/search",
                    headers=headers,
                    params=params
                )
                futures.append(future)
            
            # جمع النتائج من جميع المستقبلات
            for future in futures:
                response = future.result()
                if response.status_code == 200:
                    results.append(response.json())
                else:
                    results.append({"error": f"فشل مع رمز الحالة: {response.status_code}"})
        
        # إضافة تأخير بين الدفعات لتجنب تحديد المعدل
        if i + batch_size < len(queries):
            time.sleep(1)
    
    return results

# مثال على الاستخدام
queries = [
    "التكامل مع واجهات برمجة التطبيقات REST",
    "بروتوكولات المصادقة",
    "كيفية النشر في الإنتاج",
    "تقنيات تحسين الأداء",
    "أفضل الممارسات في معالجة الأخطاء"
]

search_results = batch_search_vector_store("vs_abc123", queries, num_results=3, batch_size=5)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
/**
 * إجراء عمليات بحث جماعية ضد مخزن المتجهات
 * 
 * @param {string} vectorStoreId - معرف مخزن المتجهات
 * @param {string[]} queries - قائمة استعلامات البحث
 * @param {Object} options - خيارات التكوين
 * @returns {Promise<Array>} - قائمة نتائج البحث
 */
async function batchSearchVectorStore(vectorStoreId, queries, options = {}) {
  const {
    numResults = 5,
    batchSize = 10,
    delayBetweenBatches = 1000,
    prevChunks = 1,
    nextChunks = 1,
    distanceThreshold = 0.7
  } = options;
  
  const results = [];
  const apiKey = 'YOUR_API_KEY';
  
  // المعالجة في دفعات لإدارة تحميل واجهة برمجة التطبيقات
  for (let i = 0; i < queries.length; i += batchSize) {
    const batchQueries = queries.slice(i, i + batchSize);
    
    // إنشاء مصفوفة من الوعود للطلبات المتوازية
    const batchPromises = batchQueries.map(query => {
      const url = new URL(`https://api.rememberizer.ai/api/v1/vector-stores/${vectorStoreId}/documents/search`);
      url.searchParams.append('q', query);
      url.searchParams.append('n', numResults);
      url.searchParams.append('prev_chunks', prevChunks);
      url.searchParams.append('next_chunks', nextChunks);
      url.searchParams.append('t', distanceThreshold);
      
      return fetch(url.toString(), {
        method: 'GET',
        headers: {
          'x-api-key': apiKey
        }
      })
      .then(response => {
        if (response.ok) {
          return response.json();
        } else {
          return { error: `فشل مع الحالة: ${response.status}` };
        }
      })
      .catch(error => {
        return { error: error.message };
      });
    });
    
    // الانتظار حتى تكتمل جميع الطلبات في الدفعة
    const batchResults = await Promise.all(batchPromises);
    results.push(...batchResults);
    
    // إضافة تأخير بين الدفعات لتجنب تحديد المعدل
    if (i + batchSize < queries.length) {
      await new Promise(resolve => setTimeout(resolve, delayBetweenBatches));
    }
  }
  
  return results;
}

// مثال على الاستخدام
const queries = [
  "التكامل مع واجهات برمجة التطبيقات REST",
  "بروتوكولات المصادقة",
  "كيفية النشر في الإنتاج",
  "تقنيات تحسين الأداء",
  "أفضل الممارسات في معالجة الأخطاء"
];

const options = {
  numResults: 3,
  batchSize: 5,
  delayBetweenBatches: 1000,
  prevChunks: 1,
  nextChunks: 1
};

batchSearchVectorStore("vs_abc123", queries, options)
  .then(results => console.log(results))
  .catch(error => console.error("فشل البحث الجماعي:", error));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require 'net/http'
require 'uri'
require 'json'
require 'concurrent'

# إجراء عمليات بحث جماعية ضد مخزن المتجهات
#
# @param vector_store_id [String] معرف متجر المتجهات
# @param queries [Array<String>] قائمة استعلامات البحث
# @param num_results [Integer] عدد النتائج لكل استعلام
# @param batch_size [Integer] عدد الطلبات المتوازية
# @param delay_between_batches [Float] ثوانٍ للانتظار بين الدفعات
# @return [Array] نتائج البحث لكل استعلام
def batch_search_vector_store(vector_store_id, queries, num_results: 5, batch_size: 10, delay_between_batches: 1.0)
  results = []
  api_key = 'YOUR_API_KEY'
  
  # المعالجة على دفعات
  queries.each_slice(batch_size).with_index do |batch_queries, batch_index|
    # إنشاء مجموعة خيوط للتنفيذ المتزامن
    pool = Concurrent::FixedThreadPool.new(batch_size)
    futures = []
    
    batch_queries.each do |query|
      # إرسال كل طلب إلى مجموعة الخيوط
      futures << Concurrent::Future.execute(executor: pool) do
        uri = URI("https://api.rememberizer.ai/api/v1/vector-stores/#{vector_store_id}/documents/search")
        params = {
          q: query,
          n: num_results,
          prev_chunks: 1,
          next_chunks: 1
        }
        
        uri.query = URI.encode_www_form(params)
        
        request = Net::HTTP::Get.new(uri)
        request['x-api-key'] = api_key
        
        http = Net::HTTP.new(uri.host, uri.port)
        http.use_ssl = true
        
        begin
          response = http.request(request)
          
          if response.code.to_i == 200
            JSON.parse(response.body)
          else
            { "error" => "فشل مع رمز الحالة: #{response.code}" }
          end
        rescue => e
          { "error" => e.message }
        end
      end
    end
    
    # جمع النتائج من جميع المستقبلات
    batch_results = futures.map(&:value)
    results.concat(batch_results)
    
    # إضافة تأخير بين الدفعات
    if batch_index < (queries.length / batch_size.to_f).ceil - 1
      sleep(delay_between_batches)
    end
  end
  
  pool.shutdown
  results
end

# مثال على الاستخدام
queries = [
  "التكامل مع واجهات برمجة التطبيقات REST",
  "بروتوكولات المصادقة",
  "كيفية النشر في الإنتاج", 
  "تقنيات تحسين الأداء",
  "أفضل الممارسات في التعامل مع الأخطاء"
]

results = batch_search_vector_store(
  "vs_abc123", 
  queries, 
  num_results: 3, 
  batch_size: 5
)

puts results
```

{% endtab %}
{% endtabs %}

### تحسين الأداء لعمليات الدفعات

عند تنفيذ عمليات الدفعات لعمليات بحث متجر المتجهات، ضع في اعتبارك هذه الممارسات الجيدة:

1. **حجم الدفعة الأمثل**: بالنسبة لمعظم التطبيقات، فإن معالجة 5-10 استفسارات في وقت واحد توفر توازنًا جيدًا بين الإنتاجية واستخدام الموارد.
2. **الوعي بتحديد المعدل**: قم بتضمين آليات تأخير بين الدفعات (عادةً 1-2 ثانية) لتجنب الوصول إلى حدود معدل واجهة برمجة التطبيقات.
3. **معالجة الأخطاء**: نفذ معالجة أخطاء قوية للاستفسارات الفردية التي قد تفشل ضمن دفعة.
4. **إدارة الاتصالات**: بالنسبة للتطبيقات ذات الحجم الكبير، نفذ تجميع الاتصالات لتقليل التكاليف.
5. **تكوين المهلة**: قم بتعيين مهلات مناسبة لكل طلب لمنع الاستفسارات التي تستغرق وقتًا طويلاً من حظر الدفعة بأكملها.
6. **معالجة النتائج**: ضع في اعتبارك معالجة النتائج بشكل غير متزامن عند توفرها بدلاً من الانتظار للحصول على جميع النتائج.
7. **المراقبة**: تتبع مقاييس الأداء مثل متوسط وقت الاستجابة ومعدلات النجاح لتحديد فرص التحسين.

بالنسبة للتطبيقات الإنتاجية ذات أحجام الاستفسارات العالية جدًا، ضع في اعتبارك تنفيذ نظام قائمة انتظار مع عمليات عمال لإدارة الدفعات الكبيرة بكفاءة.

تتيح لك هذه النقطة البحث في متجر المتجهات الخاص بك باستخدام التشابه الدلالي. إنها تعيد المستندات التي ترتبط مفهوميًا باستفسارك، حتى لو لم تحتوي على الكلمات الرئيسية الدقيقة. وهذا يجعلها قوية بشكل خاص لاستفسارات اللغة الطبيعية والإجابة على الأسئلة.
