สร้างอินเทอร์เฟซการค้นหาด้วย Query API

Query API มีวิธีการค้นหาและแนะนำสำหรับการสร้างการค้นหา อินเทอร์เฟซหรือการฝังผลการค้นหาในแอปพลิเคชัน

สำหรับเว็บแอปพลิเคชันที่มีความต้องการขั้นต่ำ ให้ลองใช้วิดเจ็ต Search สำหรับข้อมูลเพิ่มเติม โปรดดู สร้างอินเทอร์เฟซการค้นหาด้วยวิดเจ็ต Search

สร้างอินเทอร์เฟซการค้นหา

การสร้างอินเทอร์เฟซการค้นหาที่เรียบง่ายมีขั้นตอนหลายขั้นตอนดังนี้

  1. กำหนดค่าแอปพลิเคชันการค้นหา
  2. สร้างข้อมูลเข้าสู่ระบบ OAuth สำหรับแอปพลิเคชัน
  3. ค้นหาดัชนี
  4. แสดงผลการค้นหา

คุณสามารถเพิ่มประสิทธิภาพอินเทอร์เฟซการค้นหาได้เพิ่มเติมด้วยฟีเจอร์ต่างๆ เช่น การแบ่งหน้า การจัดเรียง การกรอง ข้อมูลประกอบ และการแนะนำอัตโนมัติ

กำหนดค่าแอปพลิเคชันการค้นหา

คุณต้องสร้างแอปพลิเคชันการค้นหาอย่างน้อย 1 รายการเพื่อเชื่อมโยงกับแต่ละรายการ ของอินเทอร์เฟซการค้นหาที่คุณสร้าง แอปพลิเคชันการค้นหาจะมีค่าเริ่มต้น พารามิเตอร์สำหรับการค้นหา เช่น แหล่งข้อมูลที่จะใช้ ลำดับการจัดเรียง และข้อมูลประกอบที่จะขอได้ คุณลบล้างพารามิเตอร์เหล่านี้ได้ หากจำเป็น โดยใช้ API การค้นหา

หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับแอปพลิเคชันการค้นหา โปรดไปที่ ปรับแต่งประสบการณ์การค้นหาใน Cloud Search

สร้างข้อมูลเข้าสู่ระบบ OAuth สำหรับแอปพลิเคชัน

นอกเหนือจากขั้นตอนใน กำหนดค่าการเข้าถึง Google Cloud Search API คุณต้องสร้างข้อมูลเข้าสู่ระบบ OAuth สำหรับเว็บแอปพลิเคชันด้วย ประเภท ของข้อมูลเข้าสู่ระบบที่คุณสร้างจะขึ้นอยู่กับบริบทที่ใช้ API

ใช้ข้อมูลเข้าสู่ระบบเพื่อส่งคำขอให้สิทธิ์ในนามของผู้ใช้ ใช้เมนู ขอบเขต https://www.googleapis.com/auth/cloud_search.query เมื่อส่งคำขอ การกันวงเงิน

โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือก OAuth และไลบรารีของไคลเอ็นต์ได้ที่ [Google Identity Platform](https://developers.google.com/identity/choose-auth{: .external target="_blank"}

ค้นหาดัชนี

ใช้search ในการค้นหาดัชนี

คำขอทุกรายการต้องมีข้อมูล 2 รายการ ได้แก่ ข้อความ query เพื่อจับคู่รายการกับ searchApplicationId ที่ระบุรหัสสำหรับ แอปพลิเคชันการค้นหาที่จะใช้

ตัวอย่างต่อไปนี้แสดงคำค้นหาแหล่งข้อมูลภาพยนตร์ของภาพยนตร์เรื่อง Titanic

{
  "query": "titanic",
  "requestOptions": {
    "searchApplicationId": "searchapplications/<search_app_id>"
  },
}

แสดงผลการค้นหา

อย่างน้อยที่สุด อินเทอร์เฟซการค้นหาควรแสดงรายการ title เป็น และลิงก์ไปยังรายการต้นฉบับ คุณสามารถเพิ่มประสิทธิภาพการแสดง ผลการค้นหาโดยใช้ประโยชน์จากข้อมูลเพิ่มเติมที่ปรากฏในผลการค้นหา เช่น ข้อมูลโค้ดและข้อมูลเมตา

จัดการผลลัพธ์เสริม

โดยค่าเริ่มต้น Cloud Search จะแสดงผลลัพธ์เสริมเมื่อมี ผลลัพธ์ไม่เพียงพอสำหรับการค้นหาของผู้ใช้ queryInterpretation ในการตอบกลับจะระบุเมื่อมีการแสดงผลลัพธ์เสริม หากเพียง ระบบแสดงผลผลลัพธ์เสริม โดยตั้งค่า InterpretationType เป็น REPLACE ถ้า ผลลัพธ์บางรายการสำหรับการค้นหาเดิมจะแสดงขึ้นพร้อมกับผลลัพธ์เสริม ผลลัพธ์ InterpretationType ได้รับการตั้งค่าเป็น BLEND ไม่ว่าจะเป็นกรณีใด QueryInterpretation.Reason = NOT_ENOUGH_RESULTS_FOUND_FOR_USER_QUERY

เมื่อมีการแสดงผลการค้นหาเสริมบางรายการ ให้ลองระบุข้อความ เพื่อระบุว่ามีการส่งกลับผลลัพธ์เสริม ตัวอย่างเช่น ในกรณีของ REPLACE คุณอาจแสดงสตริง "การค้นหาเดิมของคุณแสดง ไม่ตรงกับผลการค้นหาใดๆ กำลังแสดงผลการค้นหาสำหรับคำค้นหาที่คล้ายกัน"

ในกรณีของ BLEND คุณอาจแสดงสตริง "การค้นหาของคุณสำหรับ ข้อความค้นหาเดิมไม่ตรงกับผลการค้นหาที่เพียงพอ รวมผลการค้นหาสำหรับ การค้นหา"

จัดการผลการค้นหาบุคคล

Cloud Search จะแสดง "ผลการค้นหาบุคคล" 2 ประเภท ได้แก่ เอกสารที่เกี่ยวข้องกับ บุคคลที่มีชื่อในข้อความค้นหาและข้อมูลพนักงานสำหรับบุคคลหนึ่งๆ ที่ใช้ชื่อในการค้นหา ผลลัพธ์ประเภทหลังคือฟังก์ชันของระบบคลาวด์ คุณลักษณะการค้นหาบุคคลของ Search และผลลัพธ์สำหรับคำค้นหาดังกล่าวจะปรากฏใน เวลา structuredResults ของการตอบกลับ API การค้นหา

{
  "results": [...],
  "structuredResults": [{
    "person": {...}
  }]
}

การจับคู่ผู้ใต้บังคับบัญชา

การจับคู่รายงานโดยตรง คือฟีเจอร์การค้นหาบุคคลของ Cloud Search ซึ่งช่วยให้ ผู้ใช้จะเห็นผู้ใต้บังคับบัญชาของผู้ใช้ในองค์กรโดยตรง ผลลัพธ์จะอยู่ในช่อง structuredResults

สำหรับคำถามเกี่ยวกับผู้จัดการหรือผู้ใต้บังคับบัญชาของบุคคล คำตอบจะมี assistCardProtoHolder ภายใน structuredResults assistCardProtoHolder มีฟิลด์ชื่อ cardType ซึ่งเท่ากับ RELATED_PEOPLE_ANSWER_CARD assistCardProtoHolder มีบัตร ที่เรียกว่า relatedPeopleAnswerCard ซึ่งมีคำตอบจริง ข้อความนี้มี subject (บุคคลที่รวมอยู่ในการค้นหา) และ relatedPeople ซึ่งเป็นกลุ่มบุคคลที่เกี่ยวข้องกับเรื่องดังกล่าว ช่อง relationType แสดงผลค่า MANAGER หรือ DIRECT_REPORTS

โค้ดต่อไปนี้แสดงตัวอย่างการตอบกลับสำหรับการรายงานโดยตรงที่ตรงกัน ข้อความค้นหา:

{
  "results": [],
  "structuredResults": [{
    "assistCardProtoHolder": {
      "extensions": {
        "@type": "type.googleapis.com/enterprise.topaz.sidekick.AssistCardProto",
        "cardMetadata": {
          "cardCategory": "ANSWER"
        },
        "cardType": "RELATED_PEOPLE_ANSWER_CARD",
        "relatedPeopleAnswerCard": {
          "subject": {
            "email": "AdamStanford@psincs-test01.newjnj.com",
            "displayName": "Adam Stanford"
            "manager": {
              "email": "simonsais@psincs-test01.newjnj.com"
            }
          },
          "relatedPeople": [{
            "email": "EdgarMountainRamirez@psincs-test01.newjnj.com",
            "displayName": "Edgar Mountain Ramirez"
          }, {
            "email": "FranciscoJoseMartinez@psincs-test01.newjnj.com",
            "displayName": "Francisco Jose Martinez"
          }],
          "relationType": "DIRECT_REPORTS",
        }
      }
    }
  }]
}

ปิดการเพิ่มประสิทธิภาพ รวมถึงผลลัพธ์เสริม

โดยค่าเริ่มต้น ระบบจะเปิดใช้การเพิ่มประสิทธิภาพ เช่น ผลลัพธ์เสริม คุณสามารถ แต่ปิดการเพิ่มประสิทธิภาพทั้งหมด หรือปิดเฉพาะผลลัพธ์เสริมที่ แอปพลิเคชันการค้นหาและระดับข้อความค้นหา:

  • หากต้องการปิดการเพิ่มประสิทธิภาพทั้งหมดในระดับแอปพลิเคชันการค้นหา รวมถึง เช่น ผลลัพธ์เสริม คำพ้องความหมาย และการแก้ไขตัวสะกด QueryInterpretationConfig.force_verbatim_mode true ในแอปพลิเคชันการค้นหา

  • หากต้องการปิดการเพิ่มประสิทธิภาพทั้งหมดในระดับคำค้นหา รวมถึง ผลลัพธ์เสริม คำพ้องความหมาย และการแก้ไขตัวสะกด QueryInterpretationOptions.enableVerbatimMode true ในคำค้นหา

  • หากต้องการปิดผลการค้นหาเสริมที่ระดับแอปพลิเคชันการค้นหา ให้ตั้งค่า QueryInterpretationOptions.forceDisableSupplementalResults true ในคำค้นหา

  • หากต้องการปิดผลการค้นหาเสริมที่ระดับคำค้นหา ให้ตั้งค่า QueryInterpretationOptions.disableSupplementalResults true ในคำค้นหา

ตัวอย่างไฮไลต์

สำหรับรายการที่ส่งคืนซึ่งมีข้อความที่จัดทำดัชนีหรือเนื้อหา HTML ข้อมูลโค้ด ของเนื้อหานั้น เนื้อหานี้ช่วยให้ผู้ใช้ทราบว่า ความเกี่ยวข้องของสินค้าที่ส่งคืน

หากมีข้อความค้นหาในข้อมูลโค้ด ช่วงการจับคู่อย่างน้อย 1 ช่วงที่ระบุ จะแสดงตำแหน่งของคำนั้นด้วย

ใช้ matchRanges เพื่อไฮไลต์ข้อความที่ตรงกันเมื่อแสดงผล ผลลัพธ์ ตัวอย่าง JavaScript ต่อไปนี้จะแปลงข้อมูลโค้ดเป็น มาร์กอัป HTML ที่มีช่วงที่ตรงกันแต่ละช่วงซึ่งรวมไว้ในแท็ก <span>

function highlightSnippet(snippet) {
  let text = snippet.snippet;
  let formattedText = text;
  if (snippet.matchRanges) {
    let parts = [];
    let index = 0;
    for (let match of snippet.matchRanges) {
      let start = match.start || 0; // Default to 0 if omitted
      let end = match.end;
      if (index < start) { // Include any leading text before/between ranges
        parts.push(text.slice(index, start));
      }
      parts.push('<span class="highlight">');
      parts.push(text.slice(start, end));
      parts.push('</span>');
      index = end;
    }
    parts.push(text.slice(index)); // Include any trailing text after last range
    formattedText = parts.join('');
  }
  return formattedText;
}

ให้ตัวอย่างข้อมูล:

{
  "snippet": "This is an example snippet...",
  "matchRanges": [
    {
      "start": 11,
      "end": 18
    }
  ]
}

สตริง HTML ที่ได้คือ

This is an <span class="highlight">example</span> snippet...

ข้อมูลเมตาที่แสดงผล

ใช้metadata เพื่อแสดงข้อมูลเพิ่มเติมเกี่ยวกับสินค้าที่ส่งคืนซึ่งอาจเกี่ยวข้อง ให้แก่ผู้ใช้ ฟิลด์ metadata ประกอบด้วย createTime และ updateTime ของสินค้ารวมถึง Structured Data ทั้งหมดที่ส่งคืนได้ซึ่งเชื่อมโยงกับ กับสินค้านั้น

หากต้องการแสดงข้อมูลที่มีโครงสร้าง ให้ใช้displayOptions ด้วย ช่อง displayOptions มีป้ายกำกับที่แสดงสำหรับประเภทออบเจ็กต์ และชุดของ metalines ข้อมูลเมตาแต่ละรายการคืออาร์เรย์ของป้ายกำกับที่แสดงและ คู่ของค่าตามที่กําหนดค่าไว้ในสคีมา

เรียกดูผลลัพธ์เพิ่มเติม

หากต้องการดึงผลลัพธ์เพิ่มเติม ให้ตั้งค่าstart ในคำขอกับออฟเซ็ตที่ต้องการ คุณสามารถปรับขนาด ของแต่ละหน้าด้วย pageSize ด้วย

หากต้องการแสดงจำนวนรายการที่ส่งคืนหรือเพื่อแสดงการควบคุมการแบ่งหน้าสำหรับ ผ่านรายการส่งคืน ให้ใช้ resultCount ด้วย ทั้งค่าจริงหรือค่าจริง หรือขึ้นอยู่กับขนาดของชุดผลลัพธ์ มีการระบุมูลค่าโดยประมาณ

จัดเรียงผลลัพธ์

ใช้sortOptions เพื่อระบุลำดับของสินค้าที่ส่งคืน ค่า sortOptions เป็นออบเจ็กต์ที่มี 2 ฟิลด์ ได้แก่

  • operatorName — โอเปอเรเตอร์สำหรับพร็อพเพอร์ตี้ข้อมูลที่มีโครงสร้างที่จะจัดเรียง สำหรับพร็อพเพอร์ตี้ที่มีโอเปอเรเตอร์หลายรายการ คุณจะจัดเรียงได้โดยใช้ความเทียบเท่าหลักเท่านั้น
  • sortOrder — ทิศทางการจัดเรียง ไม่ว่าจะเป็น ASCENDING หรือ DESCENDING

ความเกี่ยวข้องยังใช้เป็นคีย์การจัดเรียงรองด้วย หากไม่ได้ระบุลำดับการจัดเรียง ในข้อความค้นหา ระบบจะจัดอันดับผลการค้นหาตามความเกี่ยวข้องเท่านั้น

"sortOptions": {
  "operatorName": "priority",
  "sortOrder": "DESCENDING"
}

เพิ่มตัวกรอง

นอกจากนิพจน์คำค้นหาแล้ว คุณสามารถจำกัดผลลัพธ์เพิ่มเติมได้โดยใช้ ตัวกรอง คุณสามารถระบุตัวกรองได้ทั้งในส่วน แอปพลิเคชันการค้นหา และในคำขอการค้นหา

หากต้องการเพิ่มตัวกรองในคำขอหรือแอปพลิเคชันการค้นหา ให้เพิ่มตัวกรองใน dataSourceRestrictions.filterOptions[]

การกรองแหล่งข้อมูลเพิ่มเติมมี 2 วิธีหลักดังนี้

  • ตัวกรองออบเจ็กต์ผ่านพร็อพเพอร์ตี้ filterOptions[].objectType - จำกัด การจับคู่รายการกับประเภทที่ระบุตามที่ระบุไว้ในสคีมาที่กำหนดเอง
  • ตัวกรองค่า — จำกัดรายการที่ตรงกันตาม โอเปอเรเตอร์การค้นหา และค่าที่ระบุ

ตัวกรองแบบผสม ช่วยให้รวมตัวกรองค่าหลายค่าไว้ในนิพจน์เชิงตรรกะได้สำหรับ ที่ซับซ้อนขึ้น

ในตัวอย่างสคีมาภาพยนตร์ คุณสามารถใช้ข้อจำกัดอายุตาม ผู้ใช้ปัจจุบัน และจำกัดภาพยนตร์ที่พร้อมให้บริการตามการจัดประเภทของ MPAA

{
  "query": "adventure",
  "requestOptions": {
    "searchApplicationId": "<search_app_id>"
  },
  "dataSourceRestrictions": [
    {
      "source": {
        "name": "datasources/<data_source_id>"
      },
      "filterOptions": [
        {
          "objectType": "movie",
          "filter": {
            "compositeFilter": {
              "logicOperator": "AND"
              "subFilters": [
                {
                  "compositeFilter": {
                  "logicOperator": "OR"
                  "subFilters": [
                    {
                      "valueFilter": {
                        "operatorName": "rated",
                        "value": {
                          "stringValue": "G"
                        }
                      }
                    },
                    {
                      "valueFilter": {
                        "operatorName": "rated",
                        "value": {
                          "stringValue": "PG"
                        }
                      }
                    }
                  ]
                }
              ]
            }
          }
        }
      ]
    }
  ]
}

ปรับแต่งผลการค้นหาด้วยข้อมูลประกอบ

ข้อมูลประกอบคือพร็อพเพอร์ตี้ที่มีการจัดทำดัชนีซึ่งแสดงหมวดหมู่ของการปรับแต่งการค้นหา ผลลัพธ์ ใช้ข้อมูลประกอบเพื่อช่วยให้ผู้ใช้ปรับแต่งข้อความค้นหาได้แบบอินเทอร์แอกทีฟ และค้นหา รายการที่เกี่ยวข้องได้เร็วขึ้น

คุณสามารถกำหนดข้อมูลประกอบได้ใน แอปพลิเคชันการค้นหา และถูกลบล้างโดยการตั้งค่า ในการค้นหาของคุณ

เมื่อส่งคำขอข้อมูลประกอบ Cloud Search จะคำนวณค่าที่พบมากที่สุดสำหรับ พร็อพเพอร์ตี้ที่ขอในบรรดารายการที่ตรงกัน เหล่านี้ แสดงในคำตอบ ใช้ค่าเหล่านี้เพื่อสร้างตัวกรอง ซึ่งทำให้ผลลัพธ์ในคำค้นหาที่ตามมาแคบลง

รูปแบบการโต้ตอบกับข้อมูลประกอบโดยทั่วไปมีดังนี้

  1. สร้างการค้นหาเริ่มต้นโดยระบุพร็อพเพอร์ตี้ที่จะรวมไว้ในข้อมูลประกอบ ผลลัพธ์
  2. แสดงผลการค้นหาและข้อมูลประกอบ
  3. ผู้ใช้เลือกค่าข้อมูลประกอบอย่างน้อยหนึ่งค่าเพื่อปรับแต่งผลลัพธ์
  4. ค้นหาซ้ำโดยใช้ตัวกรองตามค่าที่เลือก

ตัวอย่างเช่น เพื่อให้สามารถปรับแต่งการค้นหาภาพยนตร์ตามปีและการจัดประเภท MPAA ใส่พร็อพเพอร์ตี้ facetOptions ในการค้นหา

"facetOptions": [
  {
    "sourceName": "datasources/<data_source_id>",
    "operatorName": "year"
  },
  {
    "sourceName": "datasources/<data_source_id>",
    "operatorName": "rated"
  }
]

ผลลัพธ์ข้อมูลประกอบที่มีฟิลด์แบบจำนวนเต็ม

นอกจากนี้คุณยังสามารถขอข้อมูลประกอบที่มีฟิลด์แบบจำนวนเต็มได้ ตัวอย่างเช่น คุณสามารถ อาจทำเครื่องหมายคุณสมบัติจำนวนเต็มที่เรียกว่า book_pages เป็น Facetable เพื่อปรับแต่ง ผลลัพธ์สำหรับการค้นหาเกี่ยวกับหนังสือที่มีคำว่า "100-200"

เมื่อคุณตั้งค่าสคีมาฟิลด์พร็อพเพอร์ตี้จำนวนเต็ม ให้ตั้งค่า isFacetable ลงใน true และเพิ่มตัวเลือกการเก็บบันทึกที่เกี่ยวข้องลงในไฟล์ integerPropertyOptions วิธีนี้ช่วยให้มั่นใจว่าพร็อพเพอร์ตี้ที่เป็นจำนวนเต็มทุกรายการมีที่เก็บข้อมูลเริ่มต้น ตัวเลือกที่กำหนดไว้

เมื่อกำหนดตรรกะตัวเลือกที่เก็บข้อมูล ให้ระบุอาร์เรย์ของค่าที่เพิ่มขึ้น เป็นช่วงที่มีความหมาย ตัวอย่างเช่น หากผู้ใช้ปลายทางระบุช่วงเป็น 2, 5, 10, 100 จากนั้นข้อมูลประกอบสำหรับ <2, [2-5), [5-10), [10-100), >=100 มาคำนวณได้

คุณสามารถลบล้างข้อมูลประกอบที่อิงตามจำนวนเต็มได้ด้วยการกำหนดตัวเลือกการเก็บข้อมูลเดียวกันเป็น facetOptions ในคำขอ หากจำเป็น Cloud Search จะใช้ตัวเลือกที่เก็บข้อมูลที่ระบุไว้ใน สคีมาเมื่อทั้งแอปพลิเคชันการค้นหาและคำขอข้อความค้นหาไม่มีข้อมูลประกอบ ตัวเลือกที่กำหนดไว้ ข้อมูลประกอบที่กำหนดไว้ในคำค้นหามีความสำคัญเหนือกว่าข้อมูลประกอบที่กำหนด ในแอปพลิเคชันการค้นหา และข้อมูลประกอบที่กำหนดไว้ในแอปพลิเคชันการค้นหาจะ มีลำดับความสำคัญเหนือกว่าข้อมูลประกอบที่กำหนดไว้ในสคีมา

ผลลัพธ์ข้อมูลประกอบตามขนาดหรือวันที่ของเอกสาร

คุณสามารถใช้ โอเปอเรเตอร์ที่จองไว้ เพื่อปรับแต่งผลการค้นหาตามขนาดไฟล์ของเอกสาร วัดเป็นไบต์ หรือตามเวลา มีการสร้างหรือแก้ไขเอกสาร คุณไม่จำเป็นต้องกำหนดสคีมาที่กำหนดเอง แต่คุณต้องระบุค่า operatorName ในองค์ประกอบ FacetOptions

  • สำหรับการดูข้อมูลประกอบตามขนาดเอกสาร ให้ใช้ itemsize และกำหนดตัวเลือกที่เก็บข้อมูล
  • สำหรับการดูข้อมูลประกอบตามวันที่สร้างเอกสาร ให้ใช้ createddatetimestamp
  • สำหรับการดูข้อมูลประกอบตามวันที่แก้ไขเอกสาร ให้ใช้ lastmodified

การตีความที่เก็บข้อมูลประกอบ

facetResults ในการตอบคำถามของคำค้นหาจะรวมคำขอตัวกรองที่ตรงทั้งหมดของผู้ใช้ ในฟิลด์ filter สำหรับแต่ละรายการ bucket

สำหรับข้อมูลประกอบที่ไม่ได้อิงตามจำนวนเต็ม facetResults จะมีรายการสำหรับ แต่ละพร็อพเพอร์ตี้ที่ขอ สำหรับแต่ละพร็อพเพอร์ตี้ มีรายการค่าหรือช่วงที่เรียกว่า มีการระบุ buckets โดยค่าที่เกิดขึ้นบ่อยที่สุดจะแสดงก่อน

เมื่อผู้ใช้เลือกค่าที่จะกรองอย่างน้อย 1 ค่า ให้สร้างคำค้นหาใหม่ด้วย ตัวกรองที่เลือกและค้นหา API อีกครั้ง

เพิ่มคำแนะนำ

ใช้ suggest API เพื่อเติมข้อความอัตโนมัติให้กับข้อความค้นหาตามข้อมูลส่วนบุคคลของผู้ใช้ ประวัติการค้นหาและที่อยู่ติดต่อ และข้อมูลของเอกสาร

ตัวอย่างเช่น การเรียกต่อไปนี้จะให้ข้อเสนอแนะสำหรับ วลี jo

{
  "query": "jo",
  "requestOptions": {
    "searchApplicationId": "<search_app_id>",
    "peoplePhotoOptions": {
      "peoplePhotoUrlSizeInPx": 32
    },
    "timeZone": "America/Denver"
  }
}

จากนั้น คุณสามารถแสดงคำแนะนำที่ได้ตามความเหมาะสมสำหรับ แอปพลิเคชัน