টেক্সট সার্চ (নতুন) একটি টেক্সট কোয়েরি নেয় এবং মিলে যাওয়া জায়গার তালিকা ফেরত দেয়।
টেক্সট সার্চ (নতুন) স্ট্রিংয়ের উপর ভিত্তি করে এক সেট জায়গা সম্পর্কে তথ্য প্রদান করে — যেমন, "নিউ ইয়র্কে পিৎজা" বা "অটোয়ার কাছাকাছি জুতোর দোকান" বা "১২৩ মেইন স্ট্রিট"। পরিষেবাটি টেক্সট স্ট্রিং এবং সেট করা যেকোনও লোকেশন বায়াসের সাথে মেলে এমন জায়গার তালিকা সহ উত্তর দেয়। টেক্সট সার্চ (নতুন) আপনাকে ধরন অনুযায়ী জায়গা সার্চ করতে, ব্যবসার সময় ও রেটিংয়ের মতো নির্ণায়ক ব্যবহার করে ফিল্টার করতে এবং নির্দিষ্ট লোকেশনে ফলাফল সীমাবদ্ধ বা বায়াস করতে দেয়।
টেক্সট সার্চ (নতুন) ব্যবহার করতে, আপনার Google Cloud প্রোজেক্টে "Places API (নতুন)" চালু করতে হবে। আরও বিবরণের জন্য শুরু করা যাক দেখুন।
টেক্সট কোয়েরি ব্যবহার করে জায়গা খুঁজুন
টেক্সট কোয়েরি বা ফোন নম্বর থেকে জায়গার তালিকা পেতে searchByText কল করুন।
অনুরোধ ব্যবহার করে সার্চ প্যারামিটার নির্দিষ্ট করুন এবং তারপরে searchByText() কল করুন। ফলাফল
Place অবজেক্টের তালিকা হিসেবে দেখানো হয়, যেখান থেকে আপনি
জায়গার বিবরণ পেতে পারেন। নিচের
স্নিপেট থেকে searchByText-এ অনুরোধ ও কল করার উদাহরণ দেখানো হয়েছে:
TypeScript
const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationRestriction: map.getBounds(), isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request);
জাভাস্ক্রিপ্ট
const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationRestriction: map.getBounds(), isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request);
textQueryপ্যারামিটার দিয়ে সার্চ করার জন্য টেক্সট কোয়েরি বা ফোন নম্বর উল্লেখ করুন।- ক্যামেল কেসে এক বা একাধিক ডেটা ফিল্ডের কমা দিয়ে আলাদা করা তালিকা নির্দিষ্ট করতে
fieldsপ্যারামিটার (প্রয়োজনীয়) ব্যবহার করুন। আপনি যে ফিল্ডের জন্য অনুরোধ করেন সেটি অনুরোধের দাম সেট করে। ডেটা ফিল্ড বেছে নিন বিকল্প দেখুন। - শুধুমাত্র নির্দিষ্ট ধরনের ফলাফল পেতে
includedTypeপ্যারামিটার ব্যবহার করুন। - আপনার টেক্সট সার্চ ফলাফল কোনও নির্দিষ্ট অঞ্চলে সীমাবদ্ধ বা পক্ষপাতিত্ব করতে
locationBiasবাlocationRestrictionব্যবহার করুন।
কোয়েরিতে ফোন নম্বর থাকলে, অঞ্চল প্যারামিটার সেট করতে হবে। যেমন, আপনি যদি
জাপানের কোনও জায়গা সার্চ করার জন্য ফোন নম্বর ব্যবহার করেন এবং অনুরোধকারী ডোমেন jp হয়,
তাহলে আপনাকে অবশ্যই region প্যারামিটার 'jp' হিসেবে সেট করতে হবে। অনুরোধে region বাদ দেওয়া হলে, API ডিফল্ট হিসেবে মার্কিন যুক্তরাষ্ট্র ('us') অঞ্চল সেট করবে।
Place অবজেক্টের তালিকা হিসেবে দেখানো হয়, যেখান থেকে আপনি
জায়গার বিবরণ পেতে পারেন।
উদাহরণ
নিম্নলিখিত উদাহরণে, প্রদত্ত কোয়েরি টেক্সট সহ searchByText কল করা হয় এবং
তারপর ফলাফল দেখানোর জন্য ক্লিক করা যায় এমন মার্কার সহ ম্যাপে তথ্য দেখানো হয়।
TypeScript
let map: google.maps.Map; let markers: Record<string, google.maps.marker.AdvancedMarkerElement> = {}; let infoWindow: google.maps.InfoWindow; async function init() { const [{ Map, InfoWindow }, { ControlPosition }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('core'), ]); const center = { lat: 37.4161493, lng: -122.0812166 }; map = new Map(document.getElementById('map')!, { center, zoom: 11, mapTypeControl: false, mapId: 'DEMO_MAP_ID', }); const textInput = document.getElementById('text-input') as HTMLInputElement; const textInputButton = document.getElementById( 'text-input-button' ) as HTMLButtonElement; const card = document.getElementById('text-input-card')!; map.controls[ControlPosition.TOP_LEFT].push(card); textInputButton.addEventListener('click', () => { void findPlaces(textInput.value); }); textInput.addEventListener('keydown', (event) => { if (event.key === 'Enter') { void findPlaces(textInput.value); } }); infoWindow = new InfoWindow(); } async function findPlaces(query: string) { const [{ Place }, { AdvancedMarkerElement }] = await Promise.all([ google.maps.importLibrary('places'), google.maps.importLibrary('marker'), ]); const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationRestriction: map.getBounds(), isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request); if (places.length) { const { LatLngBounds } = await google.maps.importLibrary('core'); const bounds = new LatLngBounds(); // First remove all existing markers. for (const id in markers) { markers[id].map = null; } markers = {}; // Loop through and get all the results. places.forEach((place: google.maps.places.Place) => { const marker = new AdvancedMarkerElement({ map, position: place.location, title: place.displayName, gmpClickable: true, }); markers[place.id] = marker; marker.addEventListener('gmp-click', () => { map.panTo(place.location!); updateInfoWindow(place.displayName!, place.id, marker); }); if (place.location != null) { bounds.extend(place.location); } }); map.fitBounds(bounds); } else { console.log('No results'); } } // Helper function to create an info window. function updateInfoWindow( title: string | Element | null, content: string | Element | null, anchor: google.maps.marker.AdvancedMarkerElement ) { infoWindow.setContent(content); infoWindow.setHeaderContent(title); infoWindow.open({ map, anchor, shouldFocus: false, }); } void init();
জাভাস্ক্রিপ্ট
let map; let markers = {}; let infoWindow; async function init() { const [{ Map, InfoWindow }, { ControlPosition }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('core'), ]); const center = { lat: 37.4161493, lng: -122.0812166 }; map = new Map(document.getElementById('map'), { center, zoom: 11, mapTypeControl: false, mapId: 'DEMO_MAP_ID', }); const textInput = document.getElementById('text-input'); const textInputButton = document.getElementById('text-input-button'); const card = document.getElementById('text-input-card'); map.controls[ControlPosition.TOP_LEFT].push(card); textInputButton.addEventListener('click', () => { void findPlaces(textInput.value); }); textInput.addEventListener('keydown', (event) => { if (event.key === 'Enter') { void findPlaces(textInput.value); } }); infoWindow = new InfoWindow(); } async function findPlaces(query) { const [{ Place }, { AdvancedMarkerElement }] = await Promise.all([ google.maps.importLibrary('places'), google.maps.importLibrary('marker'), ]); const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationRestriction: map.getBounds(), isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request); if (places.length) { const { LatLngBounds } = await google.maps.importLibrary('core'); const bounds = new LatLngBounds(); // First remove all existing markers. for (const id in markers) { markers[id].map = null; } markers = {}; // Loop through and get all the results. places.forEach((place) => { const marker = new AdvancedMarkerElement({ map, position: place.location, title: place.displayName, gmpClickable: true, }); markers[place.id] = marker; marker.addEventListener('gmp-click', () => { map.panTo(place.location); updateInfoWindow(place.displayName, place.id, marker); }); if (place.location != null) { bounds.extend(place.location); } }); map.fitBounds(bounds); } else { console.log('No results'); } } // Helper function to create an info window. function updateInfoWindow(title, content, anchor) { infoWindow.setContent(content); infoWindow.setHeaderContent(title); infoWindow.open({ map, anchor, shouldFocus: false, }); } void init();
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; } #text-input-card { width: 25%; background-color: #fff; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px; margin: 10px; padding: 5px; font-family: Roboto, sans-serif; font-size: large; font-weight: bold; } #text-input { width: 100%; padding: 10px; margin: 0; box-sizing: border-box; } #text-input-button { display: inline-block; margin-top: 0.5rem; width: auto; padding: 0.6rem 0.75rem; font-size: 0.875rem; font-weight: 500; color: #fff; background-color: #2563eb; border: none; border-radius: 0.375rem; cursor: pointer; transition: background-color 0.15s ease-in-out; text-align: center; }
HTML
<html>
<head>
<title>Text Search</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
<script>
// prettier-ignore
(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({
key: "GOOGLE_MAPS_API_KEY"
});
</script>
</head>
<body>
<div id="text-input-card">
<input
type="text"
id="text-input"
placeholder="Search for a place" />
<input type="button" id="text-input-button" value="Search" />
</div>
<div id="map"></div>
</body>
</html>ডেটা ফিল্ড বেছে নিন
আপনি যেসব ফিল্ডের জন্য অনুরোধ করেন, সেগুলি প্রতিটি সার্চ অনুরোধের দাম সেট করে। অনুরোধের জন্য
একবার বিল করা হয়,
অনুরোধ করা ফিল্ডের মধ্যে
সর্বোচ্চ SKU-তে। যেমন,
fields-এর
সাথে
reviews
যোগ করলে, সম্পূর্ণ অনুরোধের জন্য টেক্সট সার্চ এন্টারপ্রাইজ + অ্যাটমোস্ফিয়ার হিসেবে বিল করা হয়।
Text Search Pro-তে সার্চের অনুরোধ রাখতে, শুধুমাত্র সেইসব ফিল্ডের জন্য অনুরোধ করুন
যেগুলি আপনার সার্চ ফলাফলে দেখানো হয়, যেমন
id,
displayName,
formattedAddress,
এবং
location।
কোনও ব্যবহারকারী কোনও জায়গা বেছে নিলে,
fetchFields()
কল করুন
সেই জায়গায় যাতে
reviews,
nationalPhoneNumber,
বা
websiteURI-এর মতো ফিল্ড পাওয়া যায়।
প্রতিটি fetchFields()
কল হল একটি পৃথক জায়গার বিবরণ সংক্রান্ত অনুরোধ, যা অনুরোধ করা ফিল্ডগুলির মধ্যে
সর্বোচ্চ SKU-তে বিল করা হয়। এই পদ্ধতি টাকা সাশ্রয় করে কিনা তা নির্ভর করে আপনার ব্যবহারকারীরা কতগুলি
জায়গা খোলেন তার উপর।
প্রতিটি SKU ট্রিগার করে এমন ফিল্ড
নিম্নলিখিত ফিল্ডগুলি টেক্সট সার্চ এসেনশিয়াল (শুধু আইডি) SKU ট্রিগার করে:
idনিম্নলিখিত ফিল্ডগুলি Text Search Pro SKU ট্রিগার করে:
accessibilityOptions
addressComponents
adrFormatAddress
businessStatus
displayName
formattedAddress
googleMapsUri
iconBackgroundColor
location
photos
plusCode
svgIconMaskURI
types
utcOffsetMinutes
viewportনিম্নলিখিত ফিল্ডগুলি Text Search Enterprise SKU ট্রিগার করে:
internationalPhoneNumber
nationalPhoneNumber
priceLevel
rating
regularOpeningHours
userRatingCount
websiteURIনিম্নলিখিত ফিল্ডগুলি Text Search Enterprise + Atmosphere SKU ট্রিগার করে:
allowsDogs
editorialSummary
evChargeOptions
fuelOptions
hasCurbsidePickup
hasDelivery
hasDineIn
hasLiveMusic
hasMenuForChildren
hasOutdoorSeating
hasRestroom
hasTakeout
hasWifi
isGoodForChildren
isGoodForGroups
isGoodForWatchingSports
isReservable
parkingOptions
paymentOptions
reviews
servesBeer
servesBreakfast
servesBrunch
servesCocktails
servesCoffee
servesDessert
servesDinner
servesLunch
servesVegetarianFood
servesWine
প্রতিটি ফিল্ডের SKU-এর জন্য, জায়গা ক্লাস ডেটা ফিল্ড দেখুন।