סקירה כללית
נתוני מיקום רגילים יכולים להגיד לכם מה יש בסביבה, אבל הם לרוב לא יכולים לענות על השאלה החשובה יותר: "עד כמה האזור הזה טוב בשבילי?" הצרכים של המשתמשים שלכם מורכבים. למשפחה עם ילדים קטנים יש סדרי עדיפויות שונים בהשוואה לאיש מקצוע צעיר עם כלב. כדי לעזור להם לקבל החלטות מושכלות, אתם צריכים לספק תובנות שמשקפות את הצרכים הספציפיים האלה. ציון מותאם אישית של מיקום הוא כלי יעיל להעברת הערך הזה וליצירת חוויית משתמש ייחודית ומשמעותית.
במאמר הזה נסביר איך ליצור ציוני מיקום מותאמים אישית עם היבטים רבים באמצעות מערך הנתונים Places Insights ב-BigQuery. הפיכת נתוני נקודות עניין למדדים משמעותיים מאפשרת להעשיר את האפליקציות שלכם בתחומי הנדל"ן, הקמעונאות או התיירות, ולספק למשתמשים את המידע הרלוונטי שהם צריכים. אנחנו גם מספקים אפשרות להשתמש ב-Gemini Developer API כדרך יעילה לחישוב ציוני המיקום.
הגדלת הערך העסקי באמצעות ציונים מותאמים
בדוגמאות הבאות מוסבר איך אפשר לתרגם נתוני מיקום גולמיים למדדים עוצמתיים שממוקדים במשתמשים, כדי לשפר את האפליקציה.
- מפתחי נדל "ן יכולים ליצור 'דירוג ידידותי למשפחות' או'דירוג מושלם לנוסעים' כדי לעזור לקונים ולשוכרים לבחור את השכונה המושלמת שתתאים לאורח החיים שלהם. כך הם יכולים להגדיל את רמת המעורבות של המשתמשים, להשיג לידים איכותיים יותר ולהגדיל את קצב ההמרות.
- מהנדסים בתחום התיירות והאירוח יכולים ליצור 'דירוג חיי הלילה' או 'דירוג גן עדן למטיילים' כדי לעזור למטיילים לבחור מלון שמתאים לסגנון החופשה שלהם, וכך להגדיל את שיעורי ההזמנות ואת שביעות רצון הלקוחות
- אנליסטים בתחום הקמעונאות יכולים ליצור 'ציון כושר ובריאות' כדי לזהות את המיקום האופטימלי לחדר כושר חדש או לחנות מזון בריאות, על סמך עסקים משלימים בקרבת מקום, וכך למקסם את הפוטנציאל לטרגט את הדמוגרפיה הנכונה של המשתמשים.
במדריך הזה תלמדו על מתודולוגיה גמישה בת שלושה חלקים ליצירת ניקוד מותאם אישית למיקום כלשהו באמצעות נתונים של 'מקומות' ישירות ב-BigQuery. כדי להמחיש את התבנית הזו, ניצור שתי דוגמאות שונות של ניקוד: ניקוד של מקום ידידותי למשפחות וניקוד של מקום מושלם לבעלי חיות מחמד. הגישה הזו מאפשרת לכם להשתמש במאפיינים העשירים והמפורטים במערך הנתונים של תובנות לגבי מקומות, ולא רק בספירת המקומות. אתם יכולים להשתמש במידע כמו שעות הפתיחה של העסק, אם המקום מתאים לילדים או אם מותר להכניס אליו כלבים, כדי ליצור מדדים מתוחכמים ומשמעותיים למשתמשים שלכם.
תהליך העבודה של הפתרון

במדריך הזה נשתמש בשאילתת SQL אחת ועוצמתית כדי ליצור ניקוד מותאם אישית שאפשר להתאים לכל תרחיש שימוש. כדי להסביר את התהליך הזה, נשתמש בשני ציונים לדוגמה עבור קבוצה היפותטית של מודעות להשכרת דירות.
דרישות מוקדמות
לפני שמתחילים, צריך לפעול בהתאם להוראות האלה כדי להגדיר את התובנות לגבי מקומות.
1. הנחת בסיס: המיקומים שיכולים לעניין את המשתמשים
כדי ליצור ציונים, צריך רשימה של המיקומים שרוצים לנתח. השלב הראשון הוא לוודא שהנתונים האלה קיימים כטבלה ב-BigQuery.
העיקר הוא שיהיה מזהה ייחודי לכל מיקום וGEOGRAPHYעמודה שבה מאוחסנות הקואורדינטות שלו.
אתם יכולים ליצור טבלה של מיקומים ולמלא אותה באמצעות שאילתה כמו זו:
CREATE OR REPLACE TABLE `your_project.your_dataset.apartment_listings`
(
id INT64,
name STRING,
location GEOGRAPHY
);
INSERT INTO `your_project.your_dataset.apartment_listings` VALUES
(1, 'The Downtowner', ST_GEOGPOINT(-74.0077, 40.7093)),
(2, 'Suburban Oasis', ST_GEOGPOINT(-73.9825, 40.7507)),
(3, 'Riverside Lofts', ST_GEOGPOINT(-73.9470, 40.8079))
-- More rows can be added here
. . . ;
הפעולה SELECT * על נתוני המיקום תיראה בערך כך.

2. פיתוח הלוגיקה המרכזית: שאילתת הניקוד
אחרי שמגדירים את המיקומים, השלב הבא הוא למצוא, לסנן ולספור את המקומות הסמוכים שרלוונטיים לציון המותאם אישית. הכול מתבצע בהצהרת SELECT אחת.
חיפוש מקומות בסביבה באמצעות חיפוש גיאוספציאלי
קודם כל, צריך למצוא את כל המקומות ממערך הנתונים של תובנות לגבי מקומות שנמצאים במרחק מסוים מכל אחד מהמיקומים שלכם. הפונקציה ST_DWITHIN של BigQuery מתאימה בדיוק למטרה הזו. נבצע JOIN בין הטבלה apartment_listings לבין הטבלה places_insights כדי למצוא את כל המקומות ברדיוס של 800 מטרים. הוספת LEFT JOIN מבטיחה שכל המיקומים המקוריים שלכם ייכללו בתוצאות, גם אם לא נמצאו מקומות תואמים בקרבת מקום.
סינון לפי רלוונטיות באמצעות מאפיינים מתקדמים
כאן מתרגמים את הרעיון המופשט של ציון למסנני נתונים קונקרטיים. בדוגמה שלנו, הקריטריונים שונים עבור שני הציונים:
- בדירוג 'מתאים למשפחות', אנחנו מתייחסים לפארקים, למוזיאונים ולמסעדות שמתאימים במיוחד לילדים.
- בחישוב הציון 'גן עדן לבעלי חיות מחמד' אנחנו מתייחסים לפארקים, למרפאות וטרינריות, לחנויות לחיות מחמד ולכל מסעדה או בית קפה שמאפשרים כניסה עם כלבים.
אפשר לסנן לפי המאפיינים הספציפיים האלה ישירות בסעיף WHERE של השאילתה.
צבירת התובנות לכל מיקום
לבסוף, צריך לספור כמה מקומות רלוונטיים מצאתם לכל דירה. הפסקה GROUP BY מסכמת את התוצאות, והפונקציה COUNTIF סופרת את המקומות שתואמים לקריטריונים הספציפיים של כל אחד מהציונים.
השאילתה הבאה משלבת את שלושת השלבים האלה ומחשבת את הספירות הגולמיות של שני הציונים במעבר אחד:
-- This Common Table Expression (CTE) will hold the raw counts for each score component.
WITH insight_counts AS (
SELECT WITH AGGREGATION_THRESHOLD -- Correctly includes the mandatory aggregation threshold
apartments.id,
apartments.name,
COUNTIF(places.primary_type = 'park') AS park_count,
COUNTIF(places.primary_type = 'museum') AS museum_count,
COUNTIF(places.primary_type = 'restaurant' AND places.good_for_children = TRUE) AS family_restaurant_count,
COUNTIF(places.primary_type IN ('veterinary_care', 'pet_store')) AS pet_service_count,
COUNTIF(places.allows_dogs = TRUE) AS dog_friendly_place_count
FROM
`your_project.your_dataset.apartment_listings` AS apartments
LEFT JOIN
`your-project.places_insights___us.places` AS places -- Corrected table name for the US dataset
ON ST_DWITHIN(apartments.location, places.point, 800) -- Find places within 800 meters
GROUP BY
apartments.id, apartments.name
)
SELECT * FROM insight_counts;
התוצאה של השאילתה הזו תהיה דומה לזו.

בסעיף הבא נתבסס על התוצאות האלה.
3. יצירת הניקוד
עכשיו יש לכם את מספר המקומות ואת המשקל של כל סוג מקום בכל מיקום, ואתם יכולים ליצור את ציון המיקום המותאם אישית. בקטע הזה נסביר על שתי אפשרויות: שימוש בחישוב מותאם אישית משלכם ב-BigQuery או שימוש ב-Gemini Developer API.
אפשרות 1: שימוש בחישוב מותאם אישית משלכם ב-BigQuery
הספירות הגולמיות מהשלב הקודם מספקות תובנות, אבל המטרה היא לקבל ניקוד יחיד וידידותי למשתמש. השלב האחרון הוא לשלב את הספירות האלה באמצעות משקלים, ואז לנרמל את התוצאה לסולם של 0 עד 10.
החלת משקלים מותאמים אישית בחירת המשקלים היא גם אומנות וגם מדע. הם צריכים לשקף את העדיפויות העסקיות שלכם או את מה שלדעתכם הכי חשוב למשתמשים. לדוגמה, כדי לקבל ציון של 'מתאים למשפחות', יכול להיות שתחליטו שפארק חשוב פי שניים ממוזיאון. מתחילים עם ההנחות הכי טובות שלכם ומשפרים אותן על סמך המשוב מהמשתמשים שלנו.
נרמול הניקוד בשאילתה שלמטה נעשה שימוש בשני ביטויי טבלה נפוצים (CTE): הראשון מחשב את הספירות הגולמיות כמו קודם, והשני מחשב את הניקוד המשוקלל. ההצהרה הסופית SELECT מבצעת נורמליזציה של min-max
בציונים המשוקללים. הפלט של העמודה location בטבלת הדוגמה apartment_listings מאפשר להציג את הנתונים במפה.
WITH
-- CTE 1: Count nearby amenities of interest for each apartment listing.
insight_counts AS (
SELECT WITH AGGREGATION_THRESHOLD
apartments.id,
apartments.name,
COUNTIF(places.primary_type = 'park') AS park_count,
COUNTIF(places.primary_type = 'museum') AS museum_count,
COUNTIF(places.primary_type = 'restaurant' AND places.good_for_children = TRUE) AS family_restaurant_count,
COUNTIF(places.primary_type IN ('veterinary_care', 'pet_store')) AS pet_service_count,
COUNTIF(places.allows_dogs = TRUE) AS dog_friendly_place_count
FROM
`your_project.your_dataset.apartment_listings` AS apartments
LEFT JOIN
`your-project.places_insights___us.places` AS places
ON ST_DWITHIN(apartments.location, places.point, 800)
GROUP BY
apartments.id,
apartments.name
),
-- CTE 2: Apply custom weighting to the amenity counts to generate raw scores.
raw_scores AS (
SELECT
id,
name,
(park_count * 3.0) + (museum_count * 1.5) + (family_restaurant_count * 2.5) AS family_friendliness_score,
(park_count * 2.0) + (pet_service_count * 3.5) + (dog_friendly_place_count * 2.5) AS pet_paradise_score
FROM
insight_counts
)
-- Final Step: Normalize scores to a 0-10 scale and rejoin to retrieve the location geometry.
SELECT
raw_scores.id,
raw_scores.name,
apartments.location,
raw_scores.family_friendliness_score,
raw_scores.pet_paradise_score,
-- Normalize Family Score using a MIN/MAX window function.
ROUND(
COALESCE(
SAFE_DIVIDE(
(raw_scores.family_friendliness_score - MIN(raw_scores.family_friendliness_score) OVER ()),
(MAX(raw_scores.family_friendliness_score) OVER () - MIN(raw_scores.family_friendliness_score) OVER ())
) * 10,
0
),
2
) AS normalized_family_score,
-- Normalize Pet Score using a MIN/MAX window function.
ROUND(
COALESCE(
SAFE_DIVIDE(
(raw_scores.pet_paradise_score - MIN(raw_scores.pet_paradise_score) OVER ()),
(MAX(raw_scores.pet_paradise_score) OVER () - MIN(raw_scores.pet_paradise_score) OVER ())
) * 10,
0
),
2
) AS normalized_pet_score
FROM
raw_scores
JOIN
`your_project.your_dataset.apartment_listings` AS apartments
ON raw_scores.id = apartments.id;
תוצאות השאילתה יהיו דומות לתוצאות שמופיעות בהמשך. שתי העמודות האחרונות הן הציונים המנורמלים.

הסבר על הציון הנורמלי
חשוב להבין למה שלב הנורמליזציה הסופי הזה כל כך חשוב.
הציונים הגולמיים המשוקללים יכולים לנוע בין 0 למספר גדול מאוד, בהתאם לצפיפות העירונית של המיקומים שלכם. ציון של 500 לא אומר למשתמש כלום בלי הקשר.
הנרמול הופך את המספרים המופשטים האלה לדירוג יחסי. התוצאות מוצגות בסולם של 0 עד 10, כך שקל להבין את ההשוואה בין כל מיקום למיקומים האחרים במערך הנתונים הספציפי שלכם:
- ציון של 10 מוקצה למיקום עם הציון הגולמי הכי גבוה, ומציין שהוא האפשרות הכי טובה מבין האפשרויות הנוכחיות.
- הציון 0 מוקצה למיקום עם הציון הגולמי הכי נמוך, והוא משמש כנקודת ההשוואה. זה לא אומר שבמיקום אין שירותים, אלא שהוא הכי פחות מתאים בהשוואה לאפשרויות האחרות שנבדקות.
- כל שאר הציונים ממוקמים באופן יחסי ביניהם, וכך המשתמשים יכולים להשוות בין האפשרויות שלהם במבט חטוף בצורה ברורה ואינטואיטיבית.
אפשרות 2: שימוש ב-Gemini Developer API
במקום להשתמש בנוסחה מתמטית קבועה ב-BigQuery, אפשר להשתמש ב-Gemini Developer API כדי לחשב ציוני מיקום מותאמים אישית ומדויקים.
אפשרות 1 מצוינת לדירוג כמותי בלבד שמבוסס על מספר המתקנים, אבל קשה להשתמש בה כדי לשקלל נתונים איכותיים. באמצעות Gemini, אתם יכולים לשלב את המספרים מהשאילתה שלכם ב-Places Insights עם נתונים לא מובנים, כמו תיאור הטקסט של רשימת הדירות (למשל, "המיקום הזה מתאים למשפחות והאזור שקט בלילה") או העדפות ספציפיות בפרופיל המשתמש (למשל, "המשתמש הזה מזמין חדר למשפחה ומעדיף אזור שקט במיקום מרכזי"), כדי ליצור ניקוד מדויק יותר.
הכנת הנתונים ל-Gemini
כדי להשתמש בשיטה הזו, צריך להמיר את תוצאות הצבירה ב-BigQuery (משלב 2) לפורמט Markdown ולשלב אותן עם הנתונים האיכותיים, כמו Listing Description.
בדוגמה הזו יש לנו שני כרטיסי מוצר עם מאפיינים שונים מאוד. אנחנו
גם כוללים Target User Profile כדי ש-Gemini יידע עבור מי אנחנו מדרגים את
התגובות האלה:
## Listing 1: The Downtowner
* **ID:** 1
* **Amenity Counts:**
* Parks: 70
* Museums: 34
* Family-Friendly Restaurants: 141
* **Listing Description:** A vibrant apartment in the heart of the city.
Great for nightlife, but can be noisy on weekends. Close to several
small playgrounds.
* **Target User Profile:** Young family with a toddler, looking for a
balance of activity and quiet.
---
## Listing 2: Suburban Oasis
* **ID:** 2
* **Amenity Counts:**
* Parks: 34
* Museums: 30
* Family-Friendly Restaurants: 318
* **Listing Description:** Quiet, tree-lined street. Large backyard and easy
walking distance to a major park and elementary school.
* **Target User Profile:** Young family with a toddler, looking for a
balance of activity and quiet.
הוראות מערכת
Gemini צריך הוראות מערכת כדי לדעת איך לשקלל את נקודות הנתונים השונות האלה. אתם יכולים לציין במפורש למודל עד כמה חשובים מתקנים ספציפיים, וגם להנחות אותו להתחשב בסנטימנט של תיאורי הטקסט.
You are an expert real estate analyst. Your goal is to generate a
"Family-Friendliness Score" between 0.0 and 10.0 for a list of apartment
locations.
For each location, you will be given quantitative data (amenity counts)
and qualitative data (descriptions and user profiles).
Scoring Criteria:
- High importance: Proximity to parks and a high count of family-friendly
restaurants.
- Medium importance: Proximity to museums.
- Negative modifiers: Descriptions indicating excessive noise, lack of
safe play areas, or mismatch with the user profile.
- Positive modifiers: Descriptions indicating quiet areas, safe streets,
or extra space (e.g., backyards).
Analyze the provided data and generate scores based on these criteria.
פלט מובנה
כדי להבטיח את המהימנות של שילוב AI באפליקציה, לא מומלץ להסתמך רק על הנחיות כדי לקבוע את פורמט הפלט. במקום זאת, כדאי להשתמש בתכונה פלט מובנה של Gemini. כשמספקים responseSchema, המודל מחזיר מערך JSON נקי שאפשר לנתח אותו, ועומד בדרישות המערכת המדויקות שלכם.
בדוגמה שלנו, אנחנו יכולים לאכוף את הסכימה הבאה:
{
"type": "ARRAY",
"items": {
"type": "OBJECT",
"required": ["location_id", "name", "score", "reasoning"],
"properties": {
"location_id": {"type": "STRING"},
"name": {"type": "STRING"},
"score": {
"type": "NUMBER"
},
"reasoning": {
"type": "STRING"
}
}
}
}
פלט לדוגמה
כששולחים את ההנחיה עם responseSchema, Gemini מחזיר מערך JSON מובנה שמוכן לשימוש ישירות באפליקציה.
שימו לב איך Gemini מתמודד עם הפשרות בתוצאה. למלון Downtowner יש מספר גבוה מאוד של חניות, אבל Gemini מזהה את התיאור 'רועש בסופי שבוע' כחיסרון משמעותי לילדים קטנים. לעומת זאת, הציון של 'נווה מדבר בפרברים' כמעט מושלם כי הוא משלב צפיפות מצוינת של מתקנים עם תכונות איכותיות רלוונטיות כמו 'רחוב שקט עם עצים לאורך השוליים'.
[
{
"id": 1,
"location_name": "The Downtowner",
"analysis_notes": "Excellent amenity counts (parks, restaurants, museums), fulfilling
quantitative metrics. However, the qualitative data indicates excessive weekend
noise and a strong nightlife focus, conflicting directly with the target
user's need for quiet and suitability for a toddler. This mismatch
significantly lowers the final score.",
"family_friendliness_score": 5.5
},
{
"id": 2,
"location_name": "Suburban Oasis",
"analysis_notes": "Outstanding quantitative data, especially the very high count of
family-friendly restaurants. The qualitative description (quiet, tree-lined street,
large backyard, proximity to elementary school and major park) aligns perfectly with
and exceeds the needs of the target family profile. High positive modifiers
result in a near-perfect score.",
"family_friendliness_score": 9.8
}
]
השיטה הזו מאפשרת לכם לספק ניקוד בהתאמה אישית גבוהה, שקל להבין אותו והוא מותאם לכל משתמש בנפרד.
4. הצגה ויזואלית של הציונים במפה
BigQuery Studio כולל הדמיה משולבת של מפה לכל תוצאה של שאילתה שמכילה עמודה GEOGRAPHY. מכיוון שהשאילתה שלנו מוציאה את העמודה location, אפשר לראות את התוצאות באופן מיידי.
כשלוחצים על הכרטיסייה Visualization, המפה מוצגת, ובתפריט הנפתח Data Column אפשר לבחור את ציון המיקום שרוצים להציג. בדוגמה הזו, התרשים normalized_pet_score מוצג מתוך דוגמה 1. שימו לב שבמקרה הזה נוספו עוד מיקומים לטבלה apartment_listings.

הדמיה של הנתונים מאפשרת לראות במבט חטוף את המיקומים המתאימים ביותר לציון שנוצר, כאשר עיגולים ירוקים כהים יותר מייצגים מיקומים עם normalized_pet_score גבוה יותר, במקרה הזה. אפשרויות נוספות להצגת נתונים של תובנות לגבי מקומות מפורטות במאמר הצגת תוצאות של שאילתות.
סיכום
עכשיו יש לכם מתודולוגיה חזקה וניתנת לשחזור ליצירת ציוני מיקום מדויקים. התחלתם עם המיקומים שלכם, ויצרתם שאילתת SQL אחת ב-BigQuery שמחפשת מקומות קרובים עם ST_DWITHIN, מסננת אותם לפי מאפיינים מתקדמים כמו good_for_children ו-allows_dogs, ומצטברת את התוצאות עם COUNTIF. החלת משקלים מותאמים אישית ונרמול התוצאה מאפשרים ליצור ציון יחיד ונוח לשימוש שמספק תובנות מעמיקות ופרקטיות. אתם יכולים להשתמש בדפוס הזה ישירות כדי להפוך נתוני מיקום גולמיים ליתרון תחרותי משמעותי.
הפעולות הבאות
עכשיו תורך לבנות. במדריך הזה יש תבנית. אתם יכולים להשתמש בנתונים העשירים שזמינים בסכימת Places Insights כדי ליצור את הציונים שהכי נחוצים לתרחיש השימוש שלכם. אפשר גם ליצור את המדדים הבאים:
- "ציון חיי הלילה": אפשר לשלב מסננים של
primary_type(bar,night_club),price_levelושעות פתיחה מאוחרות כדי למצוא את האזורים הכי תוססים אחרי רדת החשכה. - 'ציון כושר ובריאות': ספירת
gyms,parksו-health_food_storesבקרבת מקום, וסינון מסעדות לפי אלה עםserves_vegetarian_foodכדי לתת ציון למיקומים עבור משתמשים שמודעים לבריאות. - המדד 'הציון של חלום הנוסע': מאפשר למצוא מיקומים עם צפיפות גבוהה של מקומות
transit_stationוparkingבקרבת מקום, כדי לעזור למשתמשים שחשוב להם שתהיה גישה לתחבורה.
תורמים
Henrik Valve | DevX Engineer