将SQL与外部搜索结合使用

时间:2015-09-18 17:04:32

标签: tsql sql-server-2012 lucene.net

在我的案例中,SQL用于结构化数据,并考虑使用Lucene进行文本搜索。 是的MSSQL有FullText,但Lucene提供了我想要的东西。 出于问题的目的,任何外部搜索。

在SQL中有一个带PK的主表。 在SQL中,有许多查询使用主表和其他表的数量。

从外部搜索中我将获得要过滤的Main.PK列表。 该列表可能是1到100万。

外部搜索是搜索中最昂贵的部分。 SQL部分非常有效。将SQL PK传递给外部并不是一个好选择,因为我需要来自SQL查询的各种数据。从Lucene回来的唯一东西是PK(术语),有时是得分。

有最好的做法吗?

我看到的选项是

  • 其中Main.PK in(来自外部搜索的PK值)

  • 在#TEMP中填充外部搜索PK值并加入到该中 因为有些时候我需要得分,这似乎是最好的,因为我可以把它 在#temp

  • 中得分

在一个理想的世界里会有这样的联接:

join exeternalvirtualtable as evt 
  on evt.PK = Main.PK 
 and syntax specific to the external search 

我得到了很多,但总的来说有类似的东西吗? 是否有语法/ API使外部搜索看起来像MSSQL的表(或视图)? MSSQL到Lucene有什么类似的东西吗? 这是一个开始OLE DB ProvidersOPENROWSET
理想情况下,Lucene的.NET Framework Data Providers将一些SQL语法映射到Lucene 如果有特定于.NET的解决方案,该应用程序是.NET。

产品RavenDB非常快速地结合了结构和非结构化(Lucene)搜索,即使Lucene返回了很多行,因此必须有一种方法可以做到这一点,而不是将PK放在#temp中。

1 个答案:

答案 0 :(得分:1)

  

是否有语法/ API使外部搜索看起来像MSSQL的表(或视图)?

你可以使用IndexSearcher类的Lucene,它会给你一个包含相关文件的TopDocs对象(在你的情况下是PK)。然后,您可以根据此结果填充SQL表。

你需要这样的东西:

    TopDocs topDocs = searcher.search(query, MAX_HITS);
    for (int i = 0; i < topDocs.scoreDocs.length; i++) {
        Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
        String pk = doc.get("PK");
        // Connection to database and executing insertion 
    }