تعرض ميزة "البحث النصي (الجديد)" معلومات عن مجموعة من الأماكن استنادًا إلى سلسلة نصية (مثل "بيتزا في القاهرة" أو "متاجر أحذية بالقرب من الإسكندرية" أو "شارع 123 الرئيسي"). تعرض الخدمة قائمة بالأماكن التي تطابق السلسلة النصية وأي تحيّز للموقع الجغرافي تم ضبطه.
بالإضافة إلى المعلمات المطلوبة، تتيح ميزة "البحث النصي (الجديد)" تحسين طلبات البحث باستخدام معلمات اختيارية للحصول على نتائج أفضل.
الحصول على قائمة بالأماكن من خلال البحث النصي
يمكنك إجراء طلب بحث نصي من خلال استدعاء 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(في Objective-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ضمن رمز التخزين التعريفي البيانات الأساسية. ويتم تحصيل رسوم باقي ساعات العمل ضمن رمز التخزين التعريفي "تفاصيل المكان - إصدار المؤسسة". - إذا كان كائن
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الخصائص التي تحدّد حقول البيانات المطلوب عرضها. إذا حذفت قناع الحقل ، سيعرض الطلب خطأً.تُعدّ قوائم الحقول من أفضل ممارسات التصميم لضمان عدم طلب بيانات غير ضرورية، ما يساعد في تجنُّب وقت المعالجة و رسوم الفوترة غير الضرورية.
حدِّد حقلًا واحدًا أو أكثر من الحقول التالية:
تؤدي الحقول التالية إلى تفعيل رمز التخزين التعريفي "البحث النصي - الإصدار الأساسي - رقم التعريف فقط":
GMSPlacePropertyPlaceIDتؤدي الحقول التالية إلى تفعيل رمز التخزين التعريفي "البحث النصي - الإصدار الاحترافي":
GMSPlacePropertyAddressComponents
GMSPlacePropertyBusinessStatus
GMSPlacePropertyCoordinate
GMSPlacePropertyFormattedAddress
GMSPlacePropertyIconBackgroundColor
GMSPlacePropertyIconImageURL
GMSPlacePropertyName
GMSPlacePropertyPhotos
GMSPlacePropertyPlusCode
GMSPlacePropertyTypes
GMSPlacePropertyUTCOffsetMinutes
GMSPlacePropertyViewport
GMSPlacePropertyWheelchairAccessibleEntranceتؤدي الحقول التالية إلى تفعيل رمز التخزين التعريفي "البحث النصي - إصدار المؤسسة":
GMSPlacePropertyCurrentOpeningHours
GMSPlacePropertySecondaryOpeningHours
GMSPlacePropertyPhoneNumber
GMSPlacePropertyPriceLevel
GMSPlacePropertyRating
GMSPlacePropertyOpeningHours
GMSPlacePropertyUserRatingsTotal
GMSPlacePropertyWebsiteتؤدي الحقول التالية إلى تفعيل رمز التخزين التعريفي "البحث النصي - إصدار المؤسسة Plus":
GMSPlacePropertyCurbsidePickup
GMSPlacePropertyDelivery
GMSPlacePropertyDineIn
GMSPlacePropertyEditorialSummary
GMSPlacePropertyReservable
GMSPlacePropertyReviews
GMSPlacePropertyServesBeer
GMSPlacePropertyServesBreakfast
GMSPlacePropertyServesBrunch
GMSPlacePropertyServesDinner
GMSPlacePropertyServesLunch
GMSPlacePropertyServesVegetarianFood
GMSPlacePropertyServesWine
GMSPlacePropertyTakeout
-
textQuery
السلسلة النصية المطلوب البحث عنها، على سبيل المثال: "مطعم" أو "شارع 123 الرئيسي" أو "أفضل مكان للزيارة في القاهرة".
المعلمات الاختيارية
استخدِم كائن GMSPlaceSearchByTextRequest لتحديد المعلمات الاختيارية للبحث.
includedType
يقتصر عرض النتائج على الأماكن التي تطابق النوع المحدّد في الجدول "أ". يمكن تحديد نوع واحد فقط. على سبيل المثال:
let request = SearchByTextRequest()
request.includedType = "bar"let request = SearchByTextRequest()
request.includedType = "pharmacy"
isOpenNow
إذا كانت القيمة
true، يتم عرض الأماكن المفتوحة في وقت إرسال طلب البحث فقط. إذا كانت القيمةfalse، يتم عرض جميع المؤسسات بغض النظر عن حالة الفتح. يتم عرض الأماكن التي لا تحدّد ساعات العمل في قاعدة بيانات "أماكن Google" إذا ضبطت هذه المَعلمة علىfalse.isStrictTypeFiltering
يتم استخدام هذه المَعلمة مع المَعلمة
includeType. عند ضبطها علىtrue، يتم عرض الأماكن التي تطابق الأنواع المحدّدة فيincludeTypeفقط. عند ضبطها على `false` (وهو الإعداد التلقائي)، يمكن أن تحتوي الاستجابة على أماكن لا تطابق الأنواع المحدّدة.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(ترتيب النتائج حسب المسافة). - بالنسبة إلى طلب بحث غير فئوي، مثل "Mountain View, CA"، ننصحك بترك
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 على إسنادات وإسنادات للمؤلف.
إذا عرضت المراجعة في تطبيقك، عليك أيضًا عرض أي إسناد أو إسناد للمؤلف.
لمزيد من المعلومات، يُرجى الاطّلاع على المستندات حول الإسنادات.