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

如何在屈折全文搜索中获取匹配位置?

  •  2
  • kevingessner  · 技术社区  · 15 年前

    我正在使用一个包含在MS SQL Server的全文索引引擎中的不稳定查询在文本列中进行搜索;例如:

    SELECT * 
    FROM MyTable
    INNER MERGE JOIN CONTAINSTABLE(MyTable, sDescription, 'FORMSOF(INFLECTIONAL, "brains")')
        AS TBL1 ON TBL1.[key]=MyTable.ixKey
    

    这对于查找包含“Brains”(例如“Brain”(大脑)、“Brained”(大脑))等词的描述行非常有用。但是,当我向用户显示这些结果时,我想突出显示与他们的查询匹配的单词(就像Google)。但我不能只在搜索结果中寻找搜索词:如果结果包含“brain”,我显然不能突出“brains”。

    SQL Server能否告诉我全文匹配在列(单词或字符)的何处发生?或者,我可以手动运行词干分析器来获取搜索词的所有形式吗?然后,我可以单独强调其中的每一个。

    2 回复  |  直到 12 年前
        1
  •  3
  •   kevingessner    15 年前

    SQL Server 2008包含一个函数,可以使用全文引擎的分析器获取单词或短语的屈折形式: sys.dm_fts_parser .

    SELECT display_term, source_term, occurrence FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, "brains")', 1033, 0, 0)
    

    获取类似以下内容的表:

    display_term | source_term | occurrence
    ---------------------------------------
    brain        | brains      | 1
    brains       | brains      | 1
    brained      | brained     | 1
    

    (使用查询短语需要做更多的工作,因为它会分别对每个单词进行词法调整,但将事物重新组合起来并不难。)

    现在我可以突出显示任何屈折形式的出现。这比SQL Server刚刚告诉我FTS匹配的位置要多一些,但它可以做到。

        2
  •  0
  •   Milen    12 年前

    结果列中的值 expansion_type 表示这一点。 扩展类型2是屈折的,4表示同义词库关键字扩展:

    FORMSOF(THESAURUS, "Co")
    source_term display_term    expansion_type
    Co  co  0
    Co  company 4
    
    FORMSOF(INFLECTIONAL, "Dog")
    source_term display_term    expansion_type
    Dog dog 0
    Dog dogs    2
    Dog dogged  2
    Dog dogging 2
    
    SQL
    
    SELECT 
    source_term,
    display_term,
    expansion_type
    FROM sys.dm_fts_parser (FORMSOF(INFLECTIONAL, "Dog"), 1033, 0, 0)
    order by source_term, expansion_type