جستجوی متن (جدید) اطلاعاتی درباره مجموعهای از مکانها بر اساس یک رشته (مثلاً «پیتزا در نیویورک» یا «کفشفروشیهای نزدیک اتاوا» یا «خیابان اصلی ۱۲۳») برمیگرداند. این سرویس با فهرستی از مکانهایی که با رشته متن مطابقت دارند و هرگونه سوگیری مکانی که تنظیم شده است، پاسخ میدهد.
علاوه بر پارامترهای مورد نیاز ، جستجوی متن (جدید) از اصلاح پرسوجوها با استفاده از پارامترهای اختیاری برای نتایج بهتر پشتیبانی میکند.
دریافت فهرست مکانها از طریق جستجوی متنی
با فراخوانی GMSPlacesClient searchByTextWithRequest: یک درخواست جستجوی متن ایجاد کنید و یک شیء GMSPlaceSearchByTextRequest که پارامترهای درخواست و یک متد callback از نوع GMSPlaceSearchByTextResultCallback را برای مدیریت پاسخ تعریف میکند، ارسال کنید.
شیء GMSPlaceSearchByTextRequest تمام پارامترهای مورد نیاز و اختیاری برای درخواست را مشخص میکند. پارامترهای مورد نیاز عبارتند از:
- فهرست فیلدهایی که باید در شیء
GMSPlaceبرگردانده شوند، که به آن field mask نیز گفته میشود، همانطور که توسطGMSPlacePropertyتعریف شده است. اگر حداقل یک فیلد را در فهرست فیلدها مشخص نکنید، یا اگر فهرست فیلدها را حذف کنید، فراخوانی خطا میدهد. - پرس و جوی متنی .
این نمونه درخواست جستجوی متن مشخص میکند که اشیاء GMSPlace پاسخ، شامل نام مکان و شناسه مکان برای هر شیء GMSPlace در نتایج جستجو هستند. همچنین پاسخ را فیلتر میکند تا فقط مکانهایی از نوع "رستوران" را برگرداند.
مکانهای Swift SDK
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 }
سویفت
// 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)
هدف-سی
// 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; } } } ];
پاسخهای جستجوی متن
API جستجوی متن، آرایهای از تطابقها را به شکل اشیاء GMSPlace برمیگرداند، که در هر مکان تطابق، یک شیء GMSPlace وجود دارد.
دریافت وضعیت باز بودن
شیء GMSPlacesClient حاوی یک تابع عضو به نام isOpenWithRequest ( isOpenRequest در Swift و isPlaceOpenRequest در GooglePlacesSwift) است که بر اساس زمان مشخص شده در فراخوانی، پاسخی را برمیگرداند که نشان میدهد آیا مکان در حال حاضر باز است یا خیر.
این متد یک آرگومان واحد از نوع GMSPlaceIsOpenWithRequest دریافت میکند که شامل موارد زیر است:
- یک شیء
GMSPlaceیا رشتهای که شناسه مکان را مشخص میکند. برای اطلاعات بیشتر در مورد ایجاد شیء Place با فیلدهای لازم، به جزئیات Place مراجعه کنید. - یک شیء اختیاری
NSDate(Obj-C) یاDate(Swift) که زمان مورد نظر برای بررسی را مشخص میکند. اگر زمانی مشخص نشود، مقدار پیشفرض now است. - یک متد
GMSPlaceOpenStatusResponseCallbackبرای مدیریت پاسخ. >
متد GMSPlaceIsOpenWithRequest نیاز دارد که فیلدهای زیر در شیء GMSPlace تنظیم شوند:
-
GMSPlacePropertyUTCOffsetMinutes -
GMSPlacePropertyBusinessStatus -
GMSPlacePropertyOpeningHours -
GMSPlacePropertyCurrentOpeningHours -
GMSPlacePropertySecondaryOpeningHours
اگر این فیلدها در شیء Place ارائه نشده باشند، یا اگر یک شناسه مکان ارسال کنید، متد GMSPlacesClient GMSFetchPlaceRequest: برای دریافت آنها استفاده میکند.
پاسخ isOpenWithRequest
isOpenWithRequest یک شیء GMSPlaceIsOpenResponse برمیگرداند که حاوی یک مقدار بولی به نام status است که نشان میدهد آیا کسبوکار باز، بسته یا وضعیت آن نامشخص است.
| زبان | مقدار در صورت باز بودن | ارزش در صورت بسته بودن | مقدار اگر وضعیت نامشخص باشد |
|---|---|---|---|
| مکانهای سویفت | true | false | nil |
| سویفت | .open | .closed | .unknown |
| هدف-سی | GMSPlaceOpenStatusOpen | GMSPlaceOpenStatusClosed | GMSPlaceOpenStatusUnknown |
صدور صورتحساب برای isOpenWithRequest
- فیلدهای
GMSPlacePropertyUTCOffsetMinutesوGMSPlacePropertyBusinessStatusتحت SKU دادههای پایه (Basic Data SKU) محاسبه میشوند. بقیهی ساعات کاری تحت SKU جزئیات مکان (Place Details Enterprise SKU) محاسبه میشوند. - اگر شیء
GMSPlaceشما از قبل این فیلدها را از درخواست قبلی داشته باشد، دیگر هزینهای از شما دریافت نخواهد شد.
مثال: یک درخواست GMSPlaceIsOpenWithRequest ایجاد کنید
مثال زیر نحوه مقداردهی اولیه یک GMSPlaceIsOpenWithRequest را درون یک شیء GMSPlace موجود نشان میدهد. مکانهای Swift SDK
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 }
سویفت
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 } }
هدف-سی
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() برای بارگذاری آن استفاده کنید.
مثال زیر نحوه بررسی وجود صفحه بعدی و سپس بارگذاری صفحه را نشان میدهد.
سویفت
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") }
هدف-سی
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 ID Only SKU) را فعال میکنند:
GMSPlacePropertyPlaceIDفیلدهای زیر SKU مربوط به Text Search Pro را فعال میکنند:
GMSPlacePropertyAddressComponents
GMSPlacePropertyBusinessStatus
GMSPlacePropertyCoordinate
GMSPlacePropertyFormattedAddress
GMSPlacePropertyIconBackgroundColor
GMSPlacePropertyIconImageURL
GMSPlacePropertyName
GMSPlacePropertyPhotos
GMSPlacePropertyPlusCode
GMSPlacePropertyTypes
GMSPlacePropertyUTCOffsetMinutes
GMSPlacePropertyViewport
GMSPlacePropertyWheelchairAccessibleEntranceفیلدهای زیر SKU مربوط به جستجوی متنی Enterprise را فعال میکنند:
GMSPlacePropertyCurrentOpeningHours
GMSPlacePropertySecondaryOpeningHours
GMSPlacePropertyPhoneNumber
GMSPlacePropertyPriceLevel
GMSPlacePropertyRating
GMSPlacePropertyOpeningHours
GMSPlacePropertyUserRatingsTotal
GMSPlacePropertyWebsiteفیلدهای زیر SKU مربوط به Text Search Enterprise Plus را فعال میکنند:
GMSPlacePropertyCurbsidePickup
GMSPlacePropertyDelivery
GMSPlacePropertyDineIn
GMSPlacePropertyEditorialSummary
GMSPlacePropertyReservable
GMSPlacePropertyReviews
GMSPlacePropertyServesBeer
GMSPlacePropertyServesBreakfast
GMSPlacePropertyServesBrunch
GMSPlacePropertyServesDinner
GMSPlacePropertyServesLunch
GMSPlacePropertyServesVegetarianFood
GMSPlacePropertyServesWine
GMSPlacePropertyTakeout
پرس و جوی متنی
رشته متنی که باید جستجو شود، برای مثال: "رستوران"، "خیابان اصلی ۱۲۳" یا "بهترین مکان برای بازدید در سانفرانسیسکو".
پارامترهای اختیاری
از شیء GMSPlaceSearchByTextRequest برای تعیین پارامترهای اختیاری جستجو استفاده کنید.
شاملنوع
نتایج را به مکانهایی که با نوع مشخصشدهی تعریفشده در جدول الف مطابقت دارند، محدود میکند. فقط یک نوع میتواند مشخص شود. برای مثال:
-
let request = SearchByTextRequest()
request.includedType = "bar" -
let request = SearchByTextRequest()
request.includedType = "pharmacy"
-
اکنون باز است
اگر
true، فقط مکانهایی را برمیگرداند که در زمان ارسال پرسوجو باز هستند. اگر مقدار آنfalse، همه مکانهای کسبوکار را صرف نظر از وضعیت باز بودنشان برمیگرداند. مکانهایی که ساعات کاری مشخصی در پایگاه داده Google Places ندارند، در صورت تنظیم این پارامتر رویfalse، بازگردانده میشوند.فیلترینگ نوع سختگیرانه
با پارامتر
includeTypeاستفاده میشود. وقتی رویtrueتنظیم شود، فقط مکانهایی که با انواع مشخصشده توسطincludeTypeمطابقت دارند، برگردانده میشوند. وقتی false باشد، پیشفرض این است که پاسخ میتواند شامل مکانهایی باشد که با انواع مشخصشده مطابقت ندارند.موقعیت مکانی
یک منطقه برای جستجو مشخص میکند. این مکان به عنوان یک بایاس عمل میکند، به این معنی که نتایج اطراف مکان مشخص شده، از جمله نتایج خارج از منطقه مشخص شده، میتوانند بازگردانده شوند.
شما میتوانید
locationRestrictionیاlocationBiasرا مشخص کنید، اما نمیتوانید هر دو را با هم داشته باشید.locationRestrictionرا به عنوان مشخصکنندهی ناحیهای که نتایج باید درون آن باشند، وlocationBiasبه عنوان مشخصکنندهی ناحیهای که نتایج باید نزدیک به آن باشند اما میتوانند خارج از آن ناحیه باشند، در نظر بگیرید.منطقه را به عنوان یک نمای مستطیلی یا به عنوان یک دایره مشخص کنید.
یک دایره با نقطه مرکز و شعاع بر حسب متر تعریف میشود. شعاع باید بین 0.0 تا 50000.0 باشد. شعاع پیشفرض 0.0 است. برای مثال:
let request = SearchByTextRequest() request.locationBias = GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0)
مستطیل، یک نمای طول و عرض جغرافیایی است که به صورت دو نقطه پایین و بالا که به صورت مورب روبروی هم قرار دارند، نمایش داده میشود. نقطه پایین، گوشه جنوب غربی مستطیل و نقطه بالا، گوشه شمال شرقی مستطیل را نشان میدهد.
یک منظره یاب یک منطقه بسته در نظر گرفته میشود، به این معنی که مرز خود را شامل میشود. محدوده عرض جغرافیایی باید بین ۹۰- تا ۹۰ درجه و محدوده طول جغرافیایی باید بین ۱۸۰- تا ۱۸۰ درجه باشد:
- اگر
low=high، نمای دید از آن نقطه واحد تشکیل شده است. - اگر
low.longitude>high.longitude، محدوده طول جغرافیایی معکوس میشود (صفحه نمایش از خط طول جغرافیایی ۱۸۰ درجه عبور میکند). - اگر
low.longitude= -180 درجه وhigh.longitude= 180 درجه باشد، صفحه نمایش شامل تمام طولهای جغرافیایی میشود. - اگر
low.longitude= 180 درجه وhigh.longitude= -180 درجه باشد، محدوده طول جغرافیایی خالی است. - اگر
low.latitude>high.latitude، محدوده عرض جغرافیایی خالی است.
- اگر
محدودیت مکانی
ناحیهای را برای جستجو مشخص میکند. نتایج خارج از ناحیه مشخص شده بازگردانده نمیشوند. ناحیه را به عنوان یک Viewport مستطیلی مشخص کنید. برای اطلاعات بیشتر در مورد تعریف Viewport به توضیحات
locationBiasمراجعه کنید.شما میتوانید
locationRestrictionیاlocationBiasرا مشخص کنید، اما نمیتوانید هر دو را با هم داشته باشید.locationRestrictionرا به عنوان مشخصکنندهی ناحیهای که نتایج باید درون آن باشند، وlocationBiasبه عنوان مشخصکنندهی ناحیهای که نتایج باید نزدیک به آن باشند اما میتوانند خارج از آن ناحیه باشند، در نظر بگیرید.حداکثر تعداد نتیجه
حداکثر تعداد نتایج مکانی را که باید برگردانده شود، مشخص میکند. باید بین ۱ تا ۲۰ (پیشفرض) باشد.
دقیقه رتبهبندی
نتایج را فقط به مواردی محدود میکند که میانگین امتیاز کاربران آنها بزرگتر یا مساوی این حد باشد. مقادیر باید بین 0.0 تا 5.0 (شامل) با گامهای 0.5 باشند. برای مثال: 0، 0.5، 1.0، ...، 5.0 (شامل). مقادیر به نزدیکترین عدد 0.5 به بالا گرد میشوند. برای مثال، مقدار 0.6 تمام نتایج با امتیاز کمتر از 1.0 را حذف میکند.
قیمتها
جستجو را به مکانهایی که در سطوح قیمت خاصی علامتگذاری شدهاند محدود کنید. پیشفرض این است که همه سطوح قیمت را انتخاب کنید.
آرایهای از یک یا چند مقدار تعریف شده توسط
PriceLevelرا مشخص کنید.برای مثال:
let request = SearchByTextRequest() request.priceLevels = [GMSPlacesPriceLevel.moderate.rawValue, GMSPlacesPriceLevel.cheap.rawValue]
رتبه بندی
نحوه رتبهبندی نتایج در پاسخ را بر اساس نوع پرسوجو مشخص میکند:
- برای یک عبارت جستجوی دستهبندیشده مانند «رستورانها در شهر نیویورک»، مقدار پیشفرض
.relevance(رتبهبندی نتایج بر اساس ارتباط جستجو) است. میتوانیدrankPreferenceروی.relevanceیا.distance(رتبهبندی نتایج بر اساس فاصله) تنظیم کنید. - برای یک عبارت جستجوی غیر دستهبندیشده مانند «مانتین ویو، کالیفرنیا»، توصیه میکنیم
rankPreferenceبدون تنظیم رها کنید.
- برای یک عبارت جستجوی دستهبندیشده مانند «رستورانها در شهر نیویورک»، مقدار پیشفرض
کد منطقه
کد منطقهای مورد استفاده برای قالببندی پاسخ، که به عنوان یک مقدار کد CLDR دو کاراکتری مشخص شده است. این پارامتر همچنین میتواند تأثیر جانبدارانهای بر نتایج جستجو داشته باشد. مقدار پیشفرضی وجود ندارد.
اگر نام کشور فیلد آدرس در پاسخ با کد منطقه مطابقت داشته باشد، کد کشور از آدرس حذف میشود.
بیشتر کدهای CLDR با کدهای ISO 3166-1 یکسان هستند، به جز برخی استثنائات قابل توجه. برای مثال، ccTLD بریتانیا "uk" (.co.uk) است در حالی که کد ISO 3166-1 آن "gb" است (از نظر فنی برای موجودیت "پادشاهی متحده بریتانیای کبیر و ایرلند شمالی"). این پارامتر میتواند بر اساس قانون مربوطه بر نتایج تأثیر بگذارد.
shouldIncludePureServiceAreaBusinesses
اگر
true، کسبوکارهای صرفاً دارای حوزه خدماتی را در نتایج جستجو برمیگرداند. کسبوکار صرفاً دارای حوزه خدماتی، کسبوکاری است که مستقیماً از مشتریان بازدید میکند یا به آنها کالا ارسال میکند، اما به مشتریان در آدرس کسبوکارشان خدمات ارائه نمیدهد.برای مثال:
مکانهای Swift SDK
let request = SearchByTextRequest() request.shouldIncludePureServiceAreaBusinesses = true
سویفت
let request = SearchByTextRequest() request.shouldIncludePureServiceAreaBusinesses: true
هدف-سی
GMSPlaceSearchByTextRequest *request = [[GMSPlaceSearchByTextRequest alloc] initWithTextQuery:@"pizza in New York" placeProperties:@[GMSPlacePropertyAll]]; request.shouldIncludePureServiceAreaBusinesses = YES;
نمایش انتسابها در برنامه شما
وقتی برنامه شما اطلاعات به دست آمده از GMSPlacesClient ، مانند عکسها و نظرات را نمایش میدهد، باید ویژگیهای مورد نیاز را نیز نمایش دهد.
برای مثال، ویژگی reviews از شیء GMSPlacesClient شامل آرایهای از حداکثر پنج شیء GMSPlaceReview است. هر شیء GMSPlaceReview میتواند شامل ویژگیها و ویژگی نویسندگان باشد. اگر نقد و بررسی را در برنامه خود نمایش میدهید، باید هرگونه ویژگی یا ویژگی نویسنده را نیز نمایش دهید.
برای اطلاعات بیشتر، به مستندات مربوط به انتسابها مراجعه کنید.