使用Subsonic搜索查询

时间:2009-06-20 21:03:56

标签: subsonic full-text-search

好的,

今天我正在努力学习亚力学。很酷的东西。

我正在尝试在我的网站中构建一些搜索功能,但我正在努力解决如何在Subsonic中实现这一目标。

我有一个可以包含多个关键字的搜索字段。我想返回与所有关键字匹配的结果。搜索的目标是单个文本列。

到目前为止,我有这个(它运行但永远不会返回结果):

return new SubSonic.Select().From(Visit.Schema)
            .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn)
            .Where(InfopathArchive.XmlDocColumn).Like(keywords)
            .ExecuteTypedList<Visit>();      

Visit表和InfoPathArchive表之间存在一对一的映射。我只想返回在相关的XMLDocColumn中包含关键字的Visits集合。

如果我能做到这一点就会很棒。现在第二个问题是,如果有人搜索'australia processmodel',那么上面的代码显然应该只返回那个确切的短语。如何创建一个查询来分割我的搜索词,以便它必须返回包含所有单个搜索词的文档?

任何帮助表示感谢。

编辑:好的,所以基本搜索有效,但多关键字搜索不起作用。我做了Adam提出的建议,但似乎Subsonic只使用一个参数进行查询。

以下是代码:

        List<string> wordsInQueryList = keywords.Split(' ').ToList();

        SqlQuery q = Select.AllColumnsFrom<Visit>()
            .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn)
            .Where(Visit.IsDeletedColumn).IsEqualTo(false);

        foreach(string wordInQuery in wordsInQueryList)
        {
            q = q.And(InfopathArchive.XmlDocColumn).Like("%" + wordInQuery + "%");
        }

return q.ExecuteTypedList();

然后,如果我查看Subsonic生成的查询:

SELECT (bunch of columns)

 FROM [dbo].[Visit]
 INNER JOIN [dbo].[InfopathArchive] ON [dbo].[Visit].[VisitId] = [dbo].[InfopathArchive].[VisitId]
 WHERE [dbo].[Visit].[IsDeleted] = @IsDeleted
 AND [dbo].[InfopathArchive].[XmlDoc] LIKE @XmlDoc
 AND [dbo].[InfopathArchive].[XmlDoc] LIKE @XmlDoc

因此最终只搜索了最后一个关键字。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

第一个问题:

return new SubSonic.Select().From(Visit.Schema)
        .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn)
        .Where(InfopathArchive.XmlDocColumn).Like("%" + keywords + "%")
        .ExecuteTypedList<Visit>();

第二个问题:

将查询中的单词列表传递给构建SubSonic查询的函数,如下所示

SqlQuery query = DB.Select().From(Visit.Schema)
        .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn)
        .Where("1=1");

foreach(string wordInQuery in wordsInQueryList)
{
  query = query.And(InfopathArchive.XmlDocColumn).Like("%" + wordInQuery + "%")
}

return query.ExecuteTypedList<Visit>();

显然这是未经测试的,但它应该指向正确的方向。

答案 1 :(得分:1)

你可以做亚当所建议的,或者用2.2你可以简单地使用“Contains()”代替Like(“%...%”)。我们还支持StartsWith和EndsWith():)