تعرض خدمة Text Search (New) معلومات عن مجموعة من الأماكن استنادًا إلى سلسلة (على سبيل المثال، "بيتزا في نيويورك" أو "متاجر أحذية بالقرب من أوتاوا" أو "123 Main Street"). وتستجيب الخدمة بقائمة من الأماكن التي تطابق السلسلة النصية وأي انحياز للموقع الجغرافي تم ضبطه.
بالإضافة إلى المَعلمات المطلوبة، تتيح خدمة Text Search (New) تحسين طلبات البحث باستخدام مَعلمات اختيارية للحصول على نتائج أفضل.
الحصول على قائمة بالأماكن من خلال البحث النصي
يمكنك تقديم طلب "بحث نصي" من خلال استدعاء GMSPlacesClient
searchByTextWithRequest:،
وتمرير عنصر
GMSPlaceSearchByTextRequest
يحدّد مَعلمات الطلب وطريقة رد اتصال من النوع
GMSPlaceSearchByTextResultCallback،
للتعامل مع الاستجابة.
يحدّد عنصر GMSPlaceSearchByTextRequest جميع المَعلمات المطلوبة والاختيارية للطلب. تشمل المَعلمات المطلوبة ما يلي:
- قائمة الحقول المطلوب عرضها في العنصر
GMSPlace، وتُعرف أيضًا باسم قناع الحقل، كما هو محدّد فيGMSPlaceProperty. إذا لم تحدّد حقلاً واحدًا على الأقل في قائمة الحقول، أو إذا حذفت قائمة الحقول، سيعرض الطلب خطأ. - طلب البحث النصي
يحدّد مثال طلب البحث النصي هذا أنّ عناصر GMSPlace في الاستجابة تحتوي على اسم المكان ورقم تعريف المكان لكل عنصر GMSPlace في نتائج البحث. ويتم أيضًا فلترة الردّ لعرض الأماكن من النوع "مطعم" فقط.
حزمة تطوير البرامج (SDK) لـ Places Swift
let restriction = GMSPlaceRectangularLocationOption( northEast: CLLocationCoordinate2D(latitude: 20, longitude: 30), southWest: CLLocationCoordinate2D(latitude: 40, longitude: 50) ) let searchByTextRequest = SearchByTextRequest( textQuery: "pizza in New York", placeProperties: [ .name, .placeID ], locationRestriction: restriction, includedType: .restaurant, maxResultCount: 5, minRating: 3.5, priceLevels: [ .moderate, .inexpensive ], isStrictTypeFiltering: true ) switch await placesClient.searchByText(with: searchByTextRequest) { case .success(let places): // Handle places case .failure(let placesError): // Handle error }
Swift
// Create the GMSPlaceSearchByTextRequest object. let myProperties = [GMSPlaceProperty.name, GMSPlaceProperty.placeID].map {$0.rawValue} let request = GMSPlaceSearchByTextRequest(textQuery:"pizza in New York", placeProperties:myProperties) request.isOpenNow = true request.includedType = "restaurant" request.maxResultCount = 5 request.minRating = 3.5 request.rankPreference = .distance request.isStrictTypeFiltering = true request.locationBias = GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0) // Array to hold the places in the response var placeResults: [GMSPlace] = [] let callback: GMSPlaceSearchByTextResultCallback = { [weak self] results, error in guard let self, error == nil else { if let error { print(error.localizedDescription) } return } guard let results = results as? [GMSPlace] else { return } placeResults = results } GMSPlacesClient.shared().searchByText(with: request, callback: callback)
Objective-C
// Create the GMSPlaceSearchByTextRequest object. GMSPlaceSearchByTextRequest *request = [[GMSPlaceSearchByTextRequest alloc] initWithTextQuery:@"pizza in New York" placeProperties:@[GMSPlacePropertyName, GMSPlacePropertyPlaceID]]; request.isOpenNow = YES; request.includedType = @"restaurant"; request.maxResultCount = 5; request.minRating = 3.5; request.rankPreference = GMSPlaceSearchByTextRankPreferenceDistance; request.isStrictTypeFiltering = YES; request.priceLevels = @[ @(kGMSPlacesPriceLevelFree), @(kGMSPlacesPriceLevelCheap) ]; request.locationBias = GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0); // Array to hold the places in the response _placeResults = [NSArray array]; // Create the GMSPlaceSearchByTextRequest object. [_placesClient searchByTextWithRequest:request callback:^(NSArray<GMSPlace *> *_Nullable placeResults, NSError * _Nullable error) { if (error != nil) { NSLog(@"An error occurred %@", [error localizedDescription]); return; } else { if (placeResults.count > 0) { // Get list of places. _placeResults = placeResults; } } } ];
ردود البحث النصي
تعرض Text Search API مصفوفة من النتائج المطابقة على شكل عناصر GMSPlace، مع عنصر GMSPlace واحد لكل مكان مطابق.
التعرُّف على حالة الفتح
يحتوي العنصر GMSPlacesClient على دالة عضو تُسمى isOpenWithRequest (isOpenRequest في Swift وisPlaceOpenRequest في GooglePlacesSwift) تعرض ردًا يشير إلى ما إذا كان المكان مفتوحًا حاليًا، استنادًا إلى الوقت المحدّد في استدعاء الدالة.
تتطلّب هذه الطريقة وسيطة واحدة من النوع GMSPlaceIsOpenWithRequest تحتوي على ما يلي:
- عنصر
GMSPlaceأو سلسلة تحدّد رقم تعريف المكان لمزيد من المعلومات حول إنشاء عنصر "المكان" باستخدام الحقول اللازمة، يُرجى الاطّلاع على تفاصيل المكان.
- عنصر اختياري
NSDate(Obj-C) أوDate(Swift) يحدّد الوقت الذي تريد التحقّق منه. إذا لم يتم تحديد وقت، يتم ضبط الوقت التلقائي على "الآن". - طريقة
GMSPlaceOpenStatusResponseCallbackللتعامل مع الاستجابة >
تتطلّب طريقة GMSPlaceIsOpenWithRequest ضبط الحقول التالية في عنصر GMSPlace:
GMSPlacePropertyUTCOffsetMinutesGMSPlacePropertyBusinessStatusGMSPlacePropertyOpeningHoursGMSPlacePropertyCurrentOpeningHoursGMSPlacePropertySecondaryOpeningHours
إذا لم يتم توفير هذه الحقول في عنصر "المكان"، أو إذا تم تمرير رقم تعريف المكان، تستخدم الطريقة GMSPlacesClient GMSFetchPlaceRequest: لاسترجاعها.
ردّ واحد (isOpenWithRequest)
تعرض السمة isOpenWithRequest عنصر GMSPlaceIsOpenResponse يحتوي على قيمة منطقية باسم status تشير إلى ما إذا كانت المؤسسة مفتوحة أو مغلقة أو إذا كانت الحالة غير معروفة.
| اللغة | القيمة في حال كانت مفتوحة | القيمة في حال الإغلاق | القيمة في حال كانت الحالة غير معروفة |
|---|---|---|---|
| Places Swift | true |
false |
nil |
| Swift | .open |
.closed |
.unknown |
| Objective-C | GMSPlaceOpenStatusOpen |
GMSPlaceOpenStatusClosed |
GMSPlaceOpenStatusUnknown |
الفوترة لـ "isOpenWithRequest"
- يتم تحصيل رسوم الحقلَين
GMSPlacePropertyUTCOffsetMinutesوGMSPlacePropertyBusinessStatusضمن رمز تخزين البيانات الأساسية التعريفي. ويتم تحصيل رسوم بقية ساعات العمل ضمن رمز التخزين التعريفي لميزة "تفاصيل المكان" في Enterprise. - إذا كان عنصر
GMSPlaceيحتوي على هذه الحقول من طلب سابق، لن يتم تحصيل رسوم منك مرة أخرى.
مثال: تقديم طلب GMSPlaceIsOpenWithRequest
يوضّح المثال التالي كيفية إعداد GMSPlaceIsOpenWithRequest ضمن عنصر GMSPlace حالي.
حزمة تطوير البرامج (SDK) لـ Places Swift
let isOpenRequest = IsPlaceOpenRequest(place: place) switch await placesClient.isPlaceOpen(with: isOpenRequest) { case .success(let isOpenResponse): switch isOpenResponse.status { case true: // Handle open case false: // Handle closed case nil: // Handle unknown case .failure(let placesError): // Handle error }
Swift
let isOpenRequest = GMSPlaceIsOpenRequest(place: place, date: nil) GMSPlacesClient.shared().isOpen(with: isOpenRequest) { response, error in if let error = error { // Handle Error } switch response.status { case .open: // Handle open case .closed: // Handle closed case .unknown: // Handle unknown } }
Objective-C
GMSPlaceIsOpenRequest *isOpenRequest = [[GMSPlaceIsOpenRequest alloc] initWithPlace:place date:nil]; [[GMSPlacesClient sharedClient] isOpenWithRequest:isOpenRequest callback:^(GMSPlaceIsOpenResponse response, NSError *_Nullable error) { if (error) { // Handle error } switch (response.status) { case GMSPlaceOpenStatusOpen: // Handle open case GMSPlaceOpenStatusClosed: // Handle closed case GMSPlaceOpenStatusUnknown: // Handle unknown } }];
تقسيم النتائج على عدّة صفحات
توفّر خدمة "البحث النصي" عنصر تقسيم الصفحات، وهو القيمة المنطقية hasNextPage التي يتم عرضها في الردّ الأول على طلب "البحث النصي". إذا كانت الصفحة التالية متاحة، يمكنك استخدام الدالة fetchNextPage() لتحميلها.
يوضّح المثال التالي كيفية التحقّق من توفّر صفحة تالية، ثم تحميل الصفحة.
Swift
public struct PlaceSearchPagination { public var pageSize: Int public var hasNextPage: Bool public func fetchNextPage() async -> SearchByTextResponse } public struct SearchByTextResponse { public var pagination: PlaceSearchPagination? public var places: [Place]? public var error: PlaceError? } PlacesClient.swift public func searchByText(with request: SearchByTextRequest) async -> SearchByTextResponse let searchByTextRequest = SearchByTextRequest(textQuery: "restaurants", placeProperties: [PlaceProperty.displayName], locationBias: CircularCoordinateRegion(center: CLLocationCoordinate2D(latitude: 0, longitude: 0), radius: 100)) searchByTextRequest.maxResultCount = 10 var searchByTextResponse = await PlacesClient.shared.searchByText(with: searchByTextRequest) print("Found \(searchByTextResponse.places.count) places") searchByTextResponse.pagination.pageSize = 20 // Continue making requests until no more results are found in pagination object while searchByTextResponse.pagination.hasNextPage { searchByTextResponse = await searchByTextResponse.pagination.fetchNextPage() print("Found \(searchByTextResponse.places.count) places") }
Objective-C
GMSPlaceSearchByTextRequest *searchByTextRequest = [[GMSPlaceSearchByTextRequest alloc] initWithTextQuery: @"restaurants" placeProperties: @[GMSPlacePropertyAll]]; searchByTextRequest.maxResultCount = 10; __block void (^recursiveCallback)(GMSPlaceSearchByTextResponse *, NSError *); recursiveCallback = ^(GMSPlaceSearchByTextResponse * response, NSError* error) { NSLog(@"Found %d places", response.places.count); if (response.pagination.hasNextPage) { [response.pagination fetchNextPageWithCompletion:recursiveCallback]; } }; [GMSPlacesClient.sharedClient searchByTextWithRequest:searchByTextRequest completion:recursiveCallback];
المعلمات المطلوبة
استخدِم الكائن GMSPlaceSearchByTextRequest لتحديد المَعلمات المطلوبة
للبحث.
-
قائمة الحقول
حدِّد سمات بيانات الأماكن التي تريد عرضها. أدخِل قائمة بسمات
GMSPlaceالتي تحدّد حقول البيانات المطلوب عرضها. في حال حذف قناع الحقل، سيعرض الطلب خطأ.قوائم الحقول هي ممارسة تصميم جيدة لضمان عدم طلب بيانات غير ضرورية، ما يساعد في تجنُّب وقت المعالجة ورسوم الفوترة غير الضرورية.
حدِّد حقلاً واحدًا أو أكثر من الحقول التالية:
تؤدي الحقول التالية إلى تفعيل رمز التخزين التعريفي (SKU) لخدمة Text Search Essentials (المعرّف فقط):
GMSPlacePropertyPlaceIDللحصول على قائمة كاملة بالحقول ورموز التخزين التعريفية المرتبطة بها، يُرجى الاطّلاع على حقول بيانات الأماكن (الجديدة).
تؤدي الحقول التالية إلى تفعيل رمز التخزين التعريفي لميزة Text Search Pro:
GMSPlacePropertyAddressComponents
GMSPlacePropertyBusinessStatus
GMSPlacePropertyCoordinate
GMSPlacePropertyFormattedAddress
GMSPlacePropertyIconBackgroundColor
GMSPlacePropertyIconImageURL
GMSPlacePropertyName
GMSPlacePropertyPhotos
GMSPlacePropertyPlusCode
GMSPlacePropertyTypes
GMSPlacePropertyUTCOffsetMinutes
GMSPlacePropertyViewport
GMSPlacePropertyWheelchairAccessibleEntranceللحصول على قائمة كاملة بالحقول ورموز التخزين التعريفية المرتبطة بها، يُرجى الاطّلاع على حقول بيانات الأماكن (الجديدة).
تؤدي الحقول التالية إلى تفعيل رمز التخزين التعريفي لرزمة الشركات لميزة "البحث النصي":
GMSPlacePropertyCurrentOpeningHours
GMSPlacePropertySecondaryOpeningHours
GMSPlacePropertyPhoneNumber
GMSPlacePropertyPriceLevel
GMSPlacePropertyRating
GMSPlacePropertyOpeningHours
GMSPlacePropertyUserRatingsTotal
GMSPlacePropertyWebsiteللحصول على قائمة كاملة بالحقول ورموز التخزين التعريفية المرتبطة بها، يُرجى الاطّلاع على حقول بيانات الأماكن (الجديدة).
تؤدي الحقول التالية إلى تفعيل رمز التخزين التعريفي لميزة "البحث النصي" في Enterprise Plus:
GMSPlacePropertyCurbsidePickup
GMSPlacePropertyDelivery
GMSPlacePropertyDineIn
GMSPlacePropertyEditorialSummary
GMSPlacePropertyReservable
GMSPlacePropertyReviews
GMSPlacePropertyServesBeer
GMSPlacePropertyServesBreakfast
GMSPlacePropertyServesBrunch
GMSPlacePropertyServesDinner
GMSPlacePropertyServesLunch
GMSPlacePropertyServesVegetarianFood
GMSPlacePropertyServesWine
GMSPlacePropertyTakeoutللحصول على قائمة كاملة بالحقول ورموز التخزين التعريفية المرتبطة بها، يُرجى الاطّلاع على حقول بيانات الأماكن (الجديدة).
-
textQuery
تمثّل هذه المَعلمة السلسلة النصية التي يتم البحث عنها، مثل "مطعم" أو "شارع الحمراء" أو "أفضل مكان للزيارة في بيروت".
المعلمات الاختيارية
استخدِم العنصر GMSPlaceSearchByTextRequest لتحديد المَعلمات الاختيارية
للبحث.
includedType
لحصر النتائج على الأماكن التي تتطابق مع النوع المحدّد في الجدول "أ". يمكن تحديد نوع واحد فقط. على سبيل المثال:
let request = SearchByTextRequest()
request.includedType = "bar"let request = SearchByTextRequest()
request.includedType = "pharmacy"
isOpenNow
إذا كانت القيمة
true، يتم عرض الأماكن المفتوحة فقط في وقت إرسال الطلب. إذا كانت القيمةfalse، يتم عرض جميع المؤسسات بغض النظر عن حالة فتحها. يتم عرض الأماكن التي لا تحدّد ساعات العمل في قاعدة بيانات "الأماكن على Google" إذا ضبطت هذه المَعلمة علىfalse.isStrictTypeFiltering
يتم استخدامها مع المَعلمة
includeType. عند ضبطها علىtrue، يتم عرض الأماكن التي تطابق الأنواع المحدّدة فيincludeTypeفقط. عند ضبطها على "خطأ"، وهو الإعداد التلقائي، يمكن أن يحتوي الردّ على أماكن لا تتطابق مع الأنواع المحدّدة.locationBias
تحدّد هذه السمة منطقة للبحث. يُعدّ هذا الموقع الجغرافي بمثابة تحيّز، ما يعني أنّه يمكن عرض النتائج حول الموقع الجغرافي المحدّد، بما في ذلك النتائج خارج المنطقة المحدّدة.
يمكنك تحديد
locationRestrictionأوlocationBias، ولكن ليس كليهما. يمكنك اعتبارlocationRestrictionعلى أنّها تحدّد المنطقة التي يجب أن تظهر النتائج ضمنها، وlocationBiasعلى أنّها تحدّد المنطقة التي يجب أن تظهر النتائج بالقرب منها ولكن يمكن أن تكون خارجها.حدِّد المنطقة كإطار عرض مستطيل أو كدائرة.
يتم تحديد الدائرة من خلال نقطة المركز ونصف القطر بالأمتار. يجب أن يتراوح نصف القطر بين 0.0 و50000.0 (بما يشمل هذين الرقمَين). نصف القطر التلقائي هو 0.0. على سبيل المثال:
let request = SearchByTextRequest() request.locationBias = GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0)
المستطيل هو إطار عرض لخطوط الطول والعرض، ويتم تمثيله كنقطتين منخفضة ومرتفعة متقابلتين قطريًا. وتمثّل النقطة المنخفضة الزاوية الجنوبية الغربية للمستطيل، بينما تمثّل النقطة المرتفعة الزاوية الشمالية الشرقية للمستطيل.
تُعتبر منطقة العرض منطقة مغلقة، ما يعني أنّها تتضمّن حدودها. يجب أن تتراوح حدود خطوط العرض بين -90 و90 درجة، ويجب أن تتراوح حدود خطوط الطول بين -180 و180 درجة:
- إذا كان
low=high، يتكوّن إطار العرض من تلك النقطة الواحدة. - إذا كانت قيمة
low.longitudeأكبر من قيمةhigh.longitude، يتم عكس نطاق خط الطول (يعبر إطار العرض خط الطول 180 درجة). - إذا كانت قيمة
low.longitudeتساوي -180 درجة وقيمةhigh.longitudeتساوي 180 درجة، ستتضمّن إطار العرض جميع خطوط الطول. - إذا كانت قيمة
low.longitudeتساوي 180 درجة وقيمةhigh.longitudeتساوي -180 درجة، يكون نطاق خط الطول فارغًا. - إذا كانت قيمة
low.latitudeأكبر من قيمةhigh.latitude، يكون نطاق خط العرض فارغًا.
- إذا كان
locationRestriction
تحدّد هذه السمة منطقة للبحث. ولا يتم عرض النتائج خارج المنطقة المحدّدة. حدِّد المنطقة كإطار عرض مستطيل. اطّلِع على وصف
locationBiasللحصول على معلومات حول تحديد إطار العرض.يمكنك تحديد
locationRestrictionأوlocationBias، ولكن ليس كليهما. يمكنك اعتبارlocationRestrictionعلى أنّها تحدّد المنطقة التي يجب أن تظهر النتائج ضمنها، وlocationBiasعلى أنّها تحدّد المنطقة التي يجب أن تكون النتائج قريبة منها ولكن يمكن أن تظهر خارجها.-
maxResultCount
تحدّد هذه المَعلمة الحد الأقصى لعدد نتائج الأماكن التي سيتم عرضها. يجب أن تتراوح القيمة بين 1 و20 (القيمة التلقائية) (بما فيها هذان الرقمان).
minRating
يؤدي هذا إلى حصر النتائج على تلك التي يكون متوسط تقييم المستخدمين لها أكبر من هذا الحد أو مساويًا له. يجب أن تتراوح القيم بين 0.0 و5.0 (بما يشمل هذين الرقمَين) بزيادات قدرها 0.5. على سبيل المثال: 0 و0.5 و1.0 و... و5.0 ضِمنًا. يتم تقريب القيم إلى أقرب 0.5. على سبيل المثال، تؤدي القيمة 0.6 إلى استبعاد جميع النتائج التي يقل تقييمها عن 1.0.
-
priceLevels
يمكنك حصر البحث على الأماكن التي تم وضع علامة عليها بمستويات أسعار معيّنة. الإعداد التلقائي هو اختيار جميع مستويات الأسعار.
حدِّد مصفوفة من قيمة واحدة أو أكثر من القيم التي يحدّدها
PriceLevel.على سبيل المثال:
let request = SearchByTextRequest() request.priceLevels = [GMSPlacesPriceLevel.moderate.rawValue, GMSPlacesPriceLevel.cheap.rawValue]
rankPreference
تحدّد هذه السمة كيفية ترتيب النتائج في الردّ استنادًا إلى نوع طلب البحث:
- بالنسبة إلى طلب بحث فئوي مثل "مطاعم في مدينة نيويورك"،
يكون الخيار التلقائي هو
.relevance(ترتيب النتائج حسب مدى صلتها بموضوع البحث). يمكنك ضبطrankPreferenceعلى.relevanceأو.distance(ترتيب النتائج حسب المسافة). - بالنسبة إلى طلب بحث غير فئوي، مثل "الرياض، المملكة العربية السعودية"، ننصحك
بترك
rankPreferenceبدون ضبط.
- بالنسبة إلى طلب بحث فئوي مثل "مطاعم في مدينة نيويورك"،
يكون الخيار التلقائي هو
regionCode
رمز المنطقة المستخدَم لتنسيق الردّ، ويتم تحديده كقيمة رمز CLDR مكوّن من حرفَين. يمكن أن يكون لهذه المَعلمة أيضًا تأثير متحيّز في نتائج البحث. ما مِن قيمة تلقائية.
إذا كان اسم البلد في حقل العنوان في الردّ يتطابق مع رمز المنطقة، يتم حذف رمز البلد من العنوان.
تتطابق معظم رموز CLDR مع رموز ISO 3166-1، مع بعض الاستثناءات الملحوظة. على سبيل المثال، نطاق المستوى الأعلى لرمز البلد في المملكة المتحدة هو "uk" (.co.uk)، في حين أنّ رمز ISO 3166-1 هو "gb" (من الناحية الفنية لكيان "المملكة المتحدة لبريطانيا العظمى وأيرلندا الشمالية"). يمكن أن تؤثّر هذه المَعلمة في النتائج استنادًا إلى القانون الساري.
shouldIncludePureServiceAreaBusinesses
إذا كانت القيمة
true، يتم عرض المؤسسات التي تخدم مناطق معيّنة فقط في نتائج البحث. المؤسسة ضمن منطقة الخدمة فقط هي مؤسسة تقدّم خدماتها من خلال الانتقال إلى المواقع الجغرافية للعملاء أو توصيل الخدمة إليهم مباشرةً، ولكنّها لا تقدّم خدماتها لهم في عنوانها.على سبيل المثال:
حزمة تطوير البرامج (SDK) لـ Places Swift
let request = SearchByTextRequest() request.shouldIncludePureServiceAreaBusinesses = true
Swift
let request = SearchByTextRequest() request.shouldIncludePureServiceAreaBusinesses: true
Objective-C
GMSPlaceSearchByTextRequest *request = [[GMSPlaceSearchByTextRequest alloc] initWithTextQuery:@"pizza in New York" placeProperties:@[GMSPlacePropertyAll]]; request.shouldIncludePureServiceAreaBusinesses = YES;
عرض معلومات تحديد المصدر في تطبيقك
عندما يعرض تطبيقك معلومات تم الحصول عليها من
GMSPlacesClient،
مثل الصور والمراجعات، يجب أن يعرض التطبيق أيضًا معلومات تحديد المصدر المطلوبة.
على سبيل المثال، تحتوي السمة reviews للكائن GMSPlacesClient على مصفوفة تضم ما يصل إلى خمسة كائنات GMSPlaceReview. يمكن أن يحتوي كل عنصر GMSPlaceReview على معلومات المصدر ومعلومات مصدر المؤلف.
إذا عرضت المراجعة في تطبيقك، يجب أيضًا عرض أي مصدر أو مصدر مؤلف.
لمزيد من المعلومات، يمكنك الاطّلاع على المستندات حول عمليات تحديد المصدر.