代码之家  ›  专栏  ›  技术社区  ›  Trent

如何执行moss fulltextsqlquery并按技能管理属性筛选人员结果?

  •  3
  • Trent  · 技术社区  · 16 年前

    我在尝试使用contains谓词筛选skills托管属性的人员结果时遇到了moss fullttextsqlquery问题。让我演示一下:

    没有筛选器的查询返回预期结果:

    SELECT AccountName, Skills
    from scope()
    where freetext(defaultproperties,'+Bob')
    And ("scope" = 'People')
    

    结果

    Total Rows: 1
    ACCOUNTNAME: MYDOMAIN\Bob
    SKILLS: Numchucks | ASP.Net | Application Architecture
    

    但是当我附加一个包含谓词时,我不再得到预期的结果:

    SELECT AccountName, Skills
    from scope()
    where freetext(defaultproperties,'+Bob')
    And ("scope" = 'People')
    And (CONTAINS(Skills, 'Numchucks'))
    

    结果

    Total Rows: 0
    

    我确实意识到我可以使用一些数组谓词来完成这项工作,但是我想知道为什么不使用skills属性的包含谓词。我已经成功地使用了包含谓词和一个自定义的已爬网属性,该属性被指示为“多值”。在ssp管理站点的“已爬网属性”页上,未指示skills属性(尽管它似乎是多值的):

    http://ssp/admin/\u layouts/schema.aspx?consoleView=CrawledPropertiesView&category=People

    有人有什么想法吗?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Trent    16 年前

    因此,在Mark Cameron(Microsoft SharePoint开发人员支持)的帮助下,我发现某些托管属性必须 启用 要使用ManagedProperty对象模型API进行全文搜索,请将FullTextQuerable属性设置为true。下面是为我解决这个问题的方法。它可以包含在控制台应用程序中,也可以作为服务器场或Web应用程序范围内的功能接收器。

        using Microsoft.Office.Server;
        using Microsoft.Office.Server.Search.Administration;
    
        private void EnsureFullTextQueriableManagedProperties(ServerContext serverContext)
        {
            var schema = new Schema(SearchContext.GetContext(serverContext));
            var managedProperties = new[] { "SKILLS", "INTERESTS" };
            foreach (ManagedProperty managedProperty in schema.AllManagedProperties)
            {
                if (!managedProperties.Contains(managedProperty.Name.ToUpper()))
                    continue;
    
                if (managedProperty.FullTextQueriable)
                    continue;
    
                try
                {
                    managedProperty.FullTextQueriable = true;
                    managedProperty.Update();
                    Log.Info(m => m("Successfully set managed property {0} to be FullTextQueriable", managedProperty.Name));
                }
                catch (Exception e)
                {
                    Log.Error(m => m("Error updating managed property {0}", managedProperty.Name), e);
                }
            }
        }
    
        2
  •  0
  •   Francisco Aquino    16 年前
    SELECT AccountName, Skills
    from scope()
    where freetext(defaultproperties,'+Bob')
    And ("scope" = 'People')
    And (CONTAINS(Skills, 'Numchucks*'))
    

    最后使用*号。

    您还可以尝试其他一些选项:

    以下列表标识 其他查询元素 仅支持SQL搜索语法 使用fulltextsqlquery类:

    FrutEXT()

    容器()

    喜欢

    Source

    推荐文章