C# SearchServer2008RecordClick——如何实现?

C# SearchServer2008RecordClick——如何实现?,c#,web-services,search-engine,C#,Web Services,Search Engine,正在设置Microsoft Search Server 2008,并将通过Web服务(Search.asmx)向DotNetNuke公开搜索功能,但我们希望记录点击次数,以便通过创建新的最佳匹配等来定制搜索结果。Web服务有一个方法“RecordClick”,该方法应提供该功能。。。问题是我找不到它的文档。。。我发现最好的是: 我将尝试使用上面链接中的信息手工构建一个假请求,但如果其他人有此方面的经验并能提供更多有用的信息,我将不胜感激。在对该主题进行了大量研究之后,我终于看到一些Microso

正在设置Microsoft Search Server 2008,并将通过Web服务(Search.asmx)向DotNetNuke公开搜索功能,但我们希望记录点击次数,以便通过创建新的最佳匹配等来定制搜索结果。Web服务有一个方法“RecordClick”,该方法应提供该功能。。。问题是我找不到它的文档。。。我发现最好的是:


我将尝试使用上面链接中的信息手工构建一个假请求,但如果其他人有此方面的经验并能提供更多有用的信息,我将不胜感激。

在对该主题进行了大量研究之后,我终于看到一些Microsoft API文档,其中直截了当地说“仅供内部使用”。我对此提出了质疑,并尝试着去做;我使用Fiddler分解请求,找出它在做什么,每一条数据对请求意味着什么,等等,然后尝试复制它

我学到了以下几点:


请求分解


属性:

a=两个测试查询中的false d=两个测试查询中的false g=站点guid 两个查询中的h=0 m=后跟逗号和数字的十六进制字符串。。。还不确定是什么; n=可变数量;99在第一,131在第二。。。可能是数字还是结果?第三次测试为0,因此可能不会对结果进行编号;后来的研究表明,这是“高置信度结果”的数量 p=站点标题(搜索站点的名称) q=我们使用的查询 t=在UTC中搜索或单击的时间 u=从中单击的url(可能总是使用“”?) v=当前两个测试查询中的0 x=可能是最好的选择?它在非最佳匹配查询中显示0,在最佳匹配查询中显示1

内部xml(这些是…标记的内部xml元素) f=两个查询中的false 两个查询中的r=1 s=使用的范围(例如,所有站点) c=实际点击的链接(例如) y=单击最佳匹配(即MyBestBet)时的最佳匹配标题


长话短说。。。因为我不知道如何生成“m”属性,并且所有回发到服务器的尝试都没有记录实际的点击,所以我确定“m”绝对是必填字段。我不知道这是如何生成的,但它是特定于搜索实例的,而不是每个url。由于MS明确表示不要使用它,我想他们是认真的。

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

根据我目前收集的信息,RecordClick方法是从Microsoft.Office.Server.Search.WebControl.SearchResultsBaseWebPart调用的,它用于呈现搜索结果

加载SearchResultsBaseWebPart呈现的页面时,将为ID与RegExp筛选器匹配的所有HTML链接元素的onlick事件注册一个函数。还注册了页面的卸载事件,以向SearchWeb服务RecordClick方法发送soap请求

通过使用Reflector和Sharepoint搜索站点,您应该能够解决剩余的问题


我希望这能有所帮助。

我还没有测试过,但贝斯特伦似乎已经找到了在搜索服务器2010中调用RecordClick的方法:

他的代码:

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);   
     }
} 
使用(SPSite站点=新SPSite(“http://mysite"))
{    
SPServiceContext serviceContext=SPServiceContext.GetContext(站点);
SearchServiceApplicationProxy searchAppProxy=((SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(serviceContext));
对于(inti=0;i<6;i++)//要使查询流行,这里至少需要6个
{
字符串queryStr=“testme”;
字符串queryId=Guid.NewGuid().ToString();
字符串sessionId=Guid.NewGuid().ToString();
字符串clickedUrl=”http://mysite/Shared%20Documents/testme.txt";
QueryInfo=newqueryinfo();
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;
//发送单击查询信息
info.LogType=QueryLogType。单击;
searchAppProxy.RecordClick(信息);
//发送查询信息
info.LogType=QueryLogType.Query;
searchAppProxy.RecordClick(信息);
}
} 
还发现了关于该主题的大量信息: