Google Search API บางครั้งส่งคืนผลลัพธ์แรกบางครั้งผลลัพธ์ที่สองเมื่อเปรียบเทียบกับเว็บอินเตอร์เฟส

ประการแรกสิ่งนี้ไม่ซ้ำกับ: เหตุใดการค้นหาของ Google ผ่าน Google API จึงส่งผลลัพธ์ที่แตกต่างให้กับการค้นหาในหน้าเว็บ หรือคำถาม "Google Search API อื่น ๆ ที่ส่งคืนผลลัพธ์ที่ไม่คาดคิด" ใด ๆ ที่ฉันสามารถทำได้ หา.

ฉันกำลังเขียนโปรแกรมจาวาสคริปต์ขนาดเล็กซึ่งใช้ Google Websearch API ฉันกำลังสร้างลิงก์แบบกำหนดเองสำหรับหน้าสถานที่ซื้อของฉัน ซึ่งควรจะนำผู้ใช้ไปยังหน้าที่ถูกต้องบนไซต์ตัวแทนจำหน่ายของเราเพื่อซื้อผลิตภัณฑ์ที่พวกเขาดูครั้งล่าสุดเมื่อคลิก "สถานที่ซื้อ" ฉันใช้วิธีการจาวาสคริปต์ของ document.referrer จากนั้นแยกวิเคราะห์ URL เพื่อพิจารณาว่าหน้าใดในไซต์ของฉันที่ผู้ใช้เข้าชมครั้งล่าสุด

จากนั้น ฉันสร้างสตริงการสืบค้นที่เหมาะสม จำกัดไซต์ไว้เฉพาะตัวแทนจำหน่ายรายใดรายหนึ่ง บอก Google ให้ส่งคืนผลลัพธ์เพียงรายการเดียว จากนั้นจึงเรียกใช้การสืบค้น จากนั้นฉันใช้ URL เพื่อเขียน HTML ใหม่ใน div href นั้นไปยังผลการค้นหาแรก (และเท่านั้น) โดยพื้นฐานแล้วฉันกำลังเลียนแบบฟังก์ชั่นของปุ่ม "ฉันรู้สึกโชคดี" ที่ Google เคยมี แต่จัดโครงสร้างข้อความค้นหาในลักษณะที่ฉันได้ผลลัพธ์ที่ต้องการอย่างแน่นอน

โอเค เมื่อคุณรู้แล้วว่าฉันกำลังทำอะไรอยู่และทำไมฉันถึงทำอย่างนั้น ต่อไปนี้คือสิ่งที่แปลกไป: ผลลัพธ์ส่วนใหญ่ที่ฉันได้ทำงานได้อย่างสมบูรณ์แบบ พวกเขาส่งคืนผลการค้นหาแรก บางส่วน (และเหมือนกันเสมอ) ส่งคืนผลการค้นหาที่สอง

นี่คือโค้ดที่คุณสามารถคัดลอกและวางลงใน Code Playground ตัวคุณเองเพื่อดูปัญหาที่ฉันอ้างอิงด้วย:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>

    <title>Google AJAX Search API Sample</title>
    <script src="http://www.google.com/jsapi?key=AIzaSyA5m1Nc8ws2BbmPRwKu5gFradvD_hgq6G0" type="text/javascript"></script>
    <script type="text/javascript">
google.load('search', '1');   
var SearchVariables = [
      ["alto","altomusic.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/altomusic-button.png","wp-image-6343"],
      ["acme","www.acmelectronics.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/acme-button.png","wp-image-6344"],
      ["bhphoto","www.bhphotovideo.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/bh-button3.png","wp-image-6345"],
      ["frontend","www.frontendaudio.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/frontend-button.png","wp-image-6346"],
      ["fullcompass","www.fullcompass.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/fullcompass-button3.png","wp-image-6347"],
      ["performance","www.performanceaudio.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/performance-audio-button.png","wp-image-6348"],
      ["proaudio","www.proaudiosuperstore.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/ProAudioSolutions-button.png","wp-image-6349"],
      ["rmc","www.rmcaudiodirect.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/rmc-button1.png","wp-image-6350"],
      ["sweetwater","www.sweetwater.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/sweetwater-button3.png","wp-image-6351"],
      ["vintageking","www.vintageking.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/vintageking-button3.png","wp-image-6352"]
    ];  
var Search = new Array(SearchVariables.length);
function searchComplete() {


  for(var i = 0; i < Search.length; i++){
    if (Search[i].results && Search[i].results.length > 0) {
       var contentDiv = document.getElementById(Search[i].ed[0]);
       var curURL = Search[i].results[0].unescapedUrl;
       var newImage = ' <a href="/th'+curURL+'"><img class="alignleft size-full '+Search[i].ed[2]+'" title="'+Search[i].ed[0]+'" src="'+Search[i].ed[1]+'" alt=" " width="235" height="94" /></a>';
       contentDiv.innerHTML = newImage;
    }
  }     
} 
function parseURLString(inString)
{
    var OutString = 'earthworks';
        inString = inString.replace(/-/g,' ');
        inString = inString.replace('zdt','');
    var MicVsPre=['preamps','microphones'];
    var idx = [];
        for(var j=0;j<MicVsPre.length;j++)
        {
          if(inString.search(MicVsPre[j])>=0)
          {
            OutString = OutString+' '+MicVsPre[j];
                  for(var i=inString.length;i>0;i--)
                  {
                    if(inString[i]=='/')
                    {
                      idx.push(i);
                    }
                  }
            OutString = OutString+' '+inString.substring(idx[0],idx[1]+1);
          }
        }
return OutString;
}

function OnLoad() {
      var String_To_Parse = 'http://www.earthworksaudio.com/microphones/qtc-series-2/qtc40/';     
      var query = parseURLString(String_To_Parse);

       var testloc = document.getElementById('vardiv');
       testloc.innerHTML = query;

      for(var i = 0; i < SearchVariables.length; i++)
      {
        Search[i] = new google.search.WebSearch();
        Search[i].setNoHtmlGeneration();
        Search[i].setResultSetSize(1);
        Search[i].setUserDefinedLabel([SearchVariables[i][0],SearchVariables[i][2],SearchVariables[i][3]]);
        Search[i].setSiteRestriction(SearchVariables[i][1]);
        Search[i].setSearchCompleteCallback(this, searchComplete,null);
        Search[i].execute(query);
      }
}
google.setOnLoadCallback(OnLoad);

    </script>
  </head>
  <body style="font-family: Arial;border: 0 none;">
    <div id="vardiv">Testing</div>
    <div id='acme'></div>
    <div id='alto'></div>
    <div id='bhphoto'></div>
    <div id='fullcompass'></div>
    <div id='frontend'></div>
    <div id='performance'></div>
    <div id='proaudio'></div>
    <div id='rmc'></div>
    <div id='sweetwater'></div>
    <div id='vintageking'></div>
  </body>
</html>​ 

ฉันได้รวม URL หน้าผลิตภัณฑ์ตัวอย่างแทนที่จะใช้วิธีการ document.referrer (เนื่องจากเห็นได้ชัดว่าคุณไม่ได้สำรวจเว็บไซต์ของฉันในขณะนี้) เพื่อสาธิตสิ่งที่เกิดขึ้น ฉันยังได้สร้างแท็ก div พิเศษที่ด้านบนซึ่งแสดงว่ากำลังค้นหาอะไรอยู่

สังเกตว่าอันสุดท้ายในรายการ (vintage king หรือที่สี่ถึงสุดท้ายในโซลูชัน proaudio) ดึง URL สำหรับผลการค้นหา SECOND ลงมา หากคุณค้นหาแบบเดียวกันทั้งหมดด้วยตัวเอง อย่างไรก็ตาม ส่วนใหญ่ดึงผลการค้นหา FIRST ได้อย่างถูกต้อง (เช่น sweetwater, b&h, full Compass) สิ่งนี้เกิดขึ้นกับการค้นหาเกือบทุกครั้งที่ฉันทำบนเว็บไซต์เหล่านั้น ฉันรู้ว่าสิ่งนี้ไม่เกี่ยวข้องกับสิ่งใดที่เกี่ยวข้องกับเบราว์เซอร์ของฉัน และการตั้งค่าที่เก็บไว้ของฉันตั้งแต่ฉันได้ลองใช้โหมดไม่ระบุตัวตนนี้ บนคอมพิวเตอร์เครื่องอื่น ในเบราว์เซอร์ที่แตกต่างกัน ฯลฯ มีใครทราบบ้างว่าเกิดอะไรขึ้นที่นี่ เหตุใดฉันจึงไม่สามารถรับผลการค้นหาแรกจากการค้นหาทางเว็บของ Google ให้เป็น URL ที่ส่งคืนได้เสมอไป


person dynamphorous    schedule 04.09.2012    source แหล่งที่มา
comment
คุณแน่ใจหรือไม่ว่าคุณกำลังใช้ API การค้นหาเว็บ เลิกใช้ไปหลายปีแล้ว...   -  person Alex Churchill    schedule 04.09.2012
comment
ฉันทราบถึงสถานะของมัน แต่จากข้อมูลของ Google มันควรจะทำงานต่อไปในอนาคตอันใกล้โดยมีข้อ จำกัด เพียงอย่างเดียวในการร้องขอต่อวัน และจะไม่มีการอัปเดตเช่นกันที่อาจทำให้ฟังก์ชันการทำงานของโปรแกรมของฉันเสียหายได้ ด้วยลักษณะที่เรียบง่ายของสิ่งที่ฉันใช้เพื่อ ฉันไม่เห็นปัญหาที่จะทำให้ฉันต้องการย้ายไปที่ API การค้นหาที่กำหนดเองของพวกเขา เนื่องจากเป็นการยากที่จะบรรลุสิ่งที่ฉันพยายามทำ   -  person dynamphorous    schedule 04.09.2012
comment
อืม... ฉันคุ้นเคยกับ CSE api มากขึ้น แต่อาจยังคงเกิดจากปัญหาเดียวกันกับคำถามอื่น ๆ ที่คุณอ้างถึง: บางทีภาษาที่ตรวจพบอาจแตกต่างออกไป พารามิเตอร์อื่น ๆ อาจมีค่าเริ่มต้นที่แตกต่างกัน บางที API อาจไม่ใช่ เหมือนกับที่ Google ใช้สำหรับผลลัพธ์ทางเว็บทุกประการ (ท้ายที่สุดแล้วคือ API ที่เลิกใช้แล้ว บางทีผลลัพธ์ของ Google อาจต้องผ่านการประมวลผลอื่น ๆ ที่อื่น)   -  person Alex Churchill    schedule 04.09.2012
comment
นอกจากนี้ โดยทั่วไปแล้ว API การค้นหาจะให้ผลลัพธ์ที่คล้ายกันแต่ต่างกันในเวลาที่ต่างกันสำหรับแต่ละคน มันอาจจะง่ายกว่าถ้าคุณคิดทบทวนแนวทางแก้ไขปัญหาของคุณใหม่ หากคุณต้องการทำสิ่งนี้ การใช้อุปกรณ์ปลายทางบนมือถือและแยกวิเคราะห์ HTML (ฉันรู้ว่ามันห่วย - ฉันต้องทำเพียงครั้งเดียวสำหรับ Gmail) อาจเป็นวิธีเดียว   -  person Alex Churchill    schedule 04.09.2012
comment
ถ้ามันไม่ได้เป็นปัญหาเฉพาะเจาะจงและมันจะเหมือนเดิมทุกครั้ง มันเป็นผลการค้นหา #2 เสมอ และมักจะค้นหาเว็บไซต์ตัวแทนจำหน่ายเหล่านั้นเสมอ และมันเป็นผลลัพธ์ที่ดีที่สุดเป็นอันดับสองเสมอไปใช่หรือไม่ คุณถูกต้องอย่างแน่นอนเกี่ยวกับสิ่งหนึ่ง หากมันเป็นเรื่องของ API และมีปัญหากับ API นั้น ฉันไม่เคยสามารถแก้ไขได้ ฉันหวังว่าจะมีคนสามารถบอกฉันว่ามีอะไรผิดปกติกับรหัสเฉพาะของฉันที่พวกเขาเห็นได้ สิ่งที่ฉันกำลังมองหาจริงๆ คือพารามิเตอร์บางตัวที่จะปิดการใช้งานการปรับให้เหมาะสมที่อาจขัดขวางการค้นหา   -  person dynamphorous    schedule 05.09.2012
comment
อาจมีสิ่งหนึ่งที่ฉันไม่รู้ API การค้นหาของ Google ยังไม่สมบูรณ์หรือเข้าถึงได้   -  person Alex Churchill    schedule 05.09.2012
comment
คุณสามารถพูดอีกครั้งได้ เทคนิคบางอย่างที่ฉันใช้ที่นี่เพื่อส่งตัวแปรไปยังฟังก์ชันเรียกกลับของฉัน ฉันสามารถรู้ได้โดยใช้ firebug และตรวจสอบ DOM ของฉันเพื่อกำหนดตัวแปรที่ฉันกำลังตั้งค่า เอกสารยังไม่ครบถ้วนมากนัก ฉันหวังว่าจะมีวิธีบางอย่างที่ฉันสามารถแทนที่เพื่อแก้ไขปัญหานี้ใน API ได้ นั่นจะทำให้ฉันเป็นผู้เขียนโค้ดคนหนึ่งที่มีความสุข!   -  person dynamphorous    schedule 05.09.2012


คำตอบ (1)


ฉันมีปัญหานั้นเมื่อฉันทำสิ่งที่คล้ายกัน และจากสิ่งที่ฉันพบในตอนนั้น (iirc) ผลลัพธ์ที่ส่งคืนนั้นขึ้นอยู่กับพารามิเตอร์ภาษาที่คุณส่งไปยัง google และสตริง ID ของเบราว์เซอร์

โปรดทราบว่าสิ่งนี้อาจมีการเปลี่ยนแปลง และอาจใช้เวลานาน แต่ก็คุ้มค่าที่จะตรวจสอบ

แก้ไข:

ฉันเพิ่งเห็นว่าคุณกำลังมองหาข้อพิสูจน์สำหรับคำตอบ ดังนั้นไปได้เลย: http://www.windmeadow.com/node/36 ‹-- Google ให้ผลการค้นหาที่แตกต่างกันไปตามเบราว์เซอร์ http://productforums.google.com/forum/#!topic/webmasters/7K02-AUCTVM ‹-- ผลการค้นหาที่แตกต่างกันในภาษาที่แตกต่างกัน

แก้ไข 2:

เป็นข้อบกพร่องที่ทราบใน Googles AJAX API: http://code.google.com/p/google-ajax-apis/issues/detail?id=43

person alexandernst    schedule 10.09.2012
comment
หากนี่คือปัญหา ฉันคิดว่าจะเพิ่ม Search[i].setRestriction(google.search.Search.RESTRICT_EXTENDED_ARGS,{ lr : lang_en , gl : us , cr : countryUS , filter : 1 }); ไปยังวัตถุผู้ค้นหาจะเป็นขั้นตอนแรกที่ดีที่สุดในการแก้ปัญหา แต่ดูเหมือนว่าจะให้ผลลัพธ์เหมือนเดิม มีแนวคิดใดบ้างที่ฉันจะยกเลิกอคตินี้ที่ Google ใช้ได้อย่างไร สิ่งที่ฉันคิดว่าน่ารำคาญที่สุดเกี่ยวกับเรื่องนี้ก็คือผลการค้นหาที่สองที่ส่งคืนมาเสมอ และมันจะไม่ใช่ผลลัพธ์ที่ดีที่สุดสำหรับข้อความค้นหาที่เป็นปัญหา - person dynamphorous; 10.09.2012
comment
ตาม webmasters.stackexchange.com/questions/24783/ คุณสามารถลองลบคุกกี้ได้อย่างไร นอกจากนี้ ให้ลองค้นหาด้วย ASCII ธรรมดา (สำหรับการทดสอบเท่านั้น) เพื่อให้แน่ใจว่า Google ไม่ได้ทำอะไรเลย weird - person alexandernst; 11.09.2012
comment
คุกกี้นั้นน่าสนใจ แต่สิ่งหนึ่งที่ฉันรู้ก็คือ: มันเป็นผลลัพธ์ที่สองเสมอ (ซึ่งมักจะด้อยกว่าผลการค้นหาแรกที่ควรจะส่งคืน) และมันจะเป็น URL เดียวกันกับที่ใช้ส่งคืนผลลัพธ์ที่สองเสมอ ฉันจะเชื่อว่าถ้านี่ไม่ใช่การค้นหาแบบศัลยกรรมที่น่าอัศจรรย์ขนาดนี้ (ฉันหมายถึงจริงๆ แล้วฉันกำลังมองหาหน้าเดียว บนเว็บไซต์เดียวที่ฉันรู้ URL พื้นฐานของไซต์ดังกล่าวและคำหลักอื่น ๆ ทั้งหมดที่จะอยู่ที่นั่นเพื่อให้ฉัน ONE ผลการค้นหาที่ถูกต้อง) ฉันจะให้รางวัลหากฉันไม่ได้รับคำตอบที่ดีกว่านี้ในอีกสองวันข้างหน้า... - person dynamphorous; 11.09.2012
comment
อย่างไรก็ตาม ผลลัพธ์แรกเกี่ยวข้องกับข้อความค้นหาในทางใดทางหนึ่งหรือไม่ มันมาจาก url ฐานเดียวกัน (เหมือนในเว็บไซต์เดียวกัน) หรือไม่? - person alexandernst; 12.09.2012
comment
คุณได้ลองใช้โค้ดที่ฉันโพสต์ไว้ด้านบนแล้วหรือยัง? ฉันจำกัดการค้นหาทุกครั้งไว้ที่ URL เดียวตามที่ระบุไว้ในตัวแปร: SearchVariables คอลัมน์ 2 และทั้งหมดที่ฉันทำคือค้นหาหน้าผลิตภัณฑ์ของเราเฉพาะบนไซต์ตัวแทนจำหน่ายที่ระบุ ดังนั้นการค้นหาทุกครั้งจึงมาจาก URL ฐานเดียวกัน นั่นคือสิ่งที่น่าสับสนเกี่ยวกับปัญหานี้ ... - person dynamphorous; 12.09.2012
comment
ฉันเพิ่งพบสิ่งนี้... ตาม code.google .com/p/google-ajax-apis/issues/detail?id=43 นี่เป็นข้อผิดพลาดที่ทราบ (และดูวันที่รายงานฉันไม่คิดว่ามันจะได้รับการแก้ไขเลยจริงๆ) - person alexandernst; 12.09.2012
comment
ขอบคุณ Alex ดูเหมือนว่าคุณจะพูดถูก.... โชคไม่ดีที่ Google ทำให้ API ของตัวเองยุ่งเหยิงขนาดนี้ ดูเหมือนจงใจที่จะจำกัดไม่ให้ผู้คนใช้ API และโหลดเซิร์ฟเวอร์ของพวกเขา ฉันเดานะ น่าเสียดายจริงๆ เพราะฉันชอบบริการของ Google โดยทั่วไปมาก ฉันได้ทำเครื่องหมายคำตอบของคุณเป็นคำตอบแล้ว ฉันจะแก้ไขคำตอบเดิมของคุณและรวมลิงก์สุดท้ายนี้ไว้ด้วย เพื่อให้ใครก็ตามที่สะดุดกับคำถามของฉันได้ชัดเจนว่านี่เป็นเพียงปัญหาเฉพาะถิ่นของ Google API - person dynamphorous; 12.09.2012
comment
ขอบคุณ! ฉันยินดีที่จะช่วย;) - person alexandernst; 12.09.2012