Search Server 2008 RecordClick - 如何实现?

时间:2009-08-06 19:59:06

标签: c# web-services search-engine

设置Microsoft Search Server 2008并通过webservice(Search.asmx)将搜索功能公开给DotNetNuke,但我们希望记录点击次数,以便通过创建新的最佳匹配等来定制搜索结果.web服务具有一个方法“RecordClick”应该提供该功能......问题是我找不到它的文档...我发现的最好的是:http://msdn.microsoft.com/en-us/library/dd905815.aspx

我将尝试使用上面链接中的信息手工构建虚假请求,但如果有其他人有这方面的经验并且可以提供更多有用的信息,我会非常感激。

3 个答案:

答案 0 :(得分:1)

RecordClick的XML参数是一个序列化的QueryInfo对象(Microsoft.Office.Server.Search.Query.QueryInfo),它是一个公共密封类。您可以使用反射器进一步调查该类。

从目前为止我收集的内容中,从Microsoft.Office.Server.Search.WebControls.SearchResultsBaseWebPart调用RecordClick方法,该方法用于呈现搜索结果。

当加载SearchResultsBaseWebPart呈现的页面时,会为ID与RegExp过滤器匹配的所有HTML链接元素的onlick事件注册一个函数。页面的卸载事件也被注册为向搜索Web服务RecordClick方法发送soap请求。

您应该能够使用Reflector和Sharepoint搜索网站来计算剩余的魔法。

我希望这会有所帮助。

答案 1 :(得分:0)

经过对该主题的大量研究后,我终于遇到了一些微软的API文档,这些文档说“只供内部使用”。无论如何,我挑战了这一点,并试图去做;我使用Fiddler来分解请求,弄清楚它在做什么,每个数据对请求有什么意义等等,然后尝试复制它。

我学到了以下内容:


请求打破


属性:

两个测试查询中的

a = false 两个测试查询中d = false g =网站指南 两个查询中h = 0 m =十六进制字符串,后跟一个逗号和一个数字......不确定它是什么; n =变数;第一次99,第二次131 ......可能是数字或结果?第三次测试时0,所以可能不是数字结果;后来的研究表明,这是“高信心结果”的数量 p =网站标题(搜索网站的名称) q =我们使用的查询 t =搜索时间或点击UTC u =点击的网址(也许总是只使用“http://[YOURSITE]/results.aspx”?) v =两个测试查询中当前为0 x =可能是最好的选择?它在非最佳投注上显示0,在最佳投注查询上显示1

内部xml(这些是...标签的内部xml元素) 两个查询中f = false 两个查询中r = 1 s =使用的范围(例如,所有站点) c =链接实际点击(例如,http://[somelink]) 如果您点击最佳投注(即,MyBestBet),则=最佳投注标题

长话短说...因为我无法弄清楚如何生成“m”属性并且所有回发到服务器的尝试都没有记录实际点击我确定“m”肯定是必需的领域。我有没有想法如何生成它但它特定于搜索实例而不是每个URL。由于MS明确表示不使用它,我猜它们的确意味着它。

答案 2 :(得分:0)

我还没有对此进行过测试,但似乎BestLeoN已经找到了如何在Search Server 2010中调用RecordClick:TechNet Blogs > BestLeoN

他的代码:

using (SPSite site = new SPSite("http://mysite"))
{    
    SPServiceContext serviceContext = SPServiceContext.GetContext(site);
    SearchServiceApplicationProxy searchAppProxy = ((SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(serviceContext));

    for (int i = 0; i < 6; i++)         // You need at least 6 here to make a query popular
    {
        string queryStr = "testme";
        string queryId = Guid.NewGuid().ToString();
        string sessionId = Guid.NewGuid().ToString();
        string clickedUrl = "http://mysite/Shared%20Documents/testme.txt";

        QueryInfo info = new QueryInfo();
        info.QueryGuid = queryId;
        info.SiteGuid = site.ID.ToString();
        info.SessionId = sessionId;
        info.UserName = System.Threading.Thread.CurrentPrincipal.Identity.Name;
        info.QueryString = queryStr;
        info.StartItem = 1;
        info.ClickTime = DateTime.Now;
        info.ClickedUrl = clickedUrl;
        info.ResultsUrl = "http://mysite/fast/Pages/results.aspx?k=testme";
        info.ClientType = QueryLogClientType.ObjectModel;
        info.SearchTime = DateTime.Now;      

        // Send a Click QueryInfo
        info.LogType = QueryLogType.Click;
        searchAppProxy.RecordClick(info);    

        // Send a Query QueryInfo
        info.LogType = QueryLogType.Query;
        searchAppProxy.RecordClick(info);   
     }
} 

另请参阅此blog,其中包含有关此主题的重要信息:http://sharepointfieldnotes.blogspot.nl/2011/06/life-and-times-of-sharepoint-search.html