我将 dtSearch 与 SQL 数据库结合使用,并希望维护一个包含所有 DocId 及其相关文件名的表。从那里,我将添加一个带有外键的列,以允许我结合文本和数据库搜索。

我有代码可以简单地返回索引中的所有记录并将它们一一添加到数据库中。然而,这需要永远,并且没有解决如何在将新记录添加到索引时简单地追加新记录的问题。但以防万一它有帮助:

MyDatabaseContext db = new StateScapeEntities();
IndexJob ij = new dtSearch.Engine.IndexJob();

ij.IndexPath = @"d:\myindex";

IndexInfo indexInfo = dtSearch.Engine.IndexJob.GetIndexInfo(@"d:\myindex");

bool jobDone =   ij.Execute();

SearchResults sr = new SearchResults();

uint n = indexInfo.DocCount;

for (int i = 1; i <= n; i++)
{
    sr.AddDoc(ij.IndexPath, i, null);
}

for (int i = 1; i <= n; i++)
{
    sr.GetNthDoc(i - 1);
        //IndexDocument is defined elsewhere
        IndexDocument id = new IndexDocument();
        id.DocId = sr.CurrentItem.DocId;
        id.FilePath = sr.CurrentItem.Filename;

        if (id.FilePath != null)
        {
            db.IndexDocuments.Add(id);
            db.SaveChanges();
        }
}

最佳答案

要将 DocId 保留在索引中,您必须在 IndexJob 中使用标志 dtsIndexKeepExistingDocIds

当 DocID 更改时,您还可以查看 dtSearch Text Retrieval Engine Programmer's Reference

  • 将文档添加到索引时,会为其分配一个 DocId,并且 DocId 始终按顺序编号。
  • 当文档被重新索引时,旧的 DocId 被取消并分配一个新的 DocId。
  • 当索引被压缩时,索引中的所有 DocId 都会重新编号以删除取消的 DocId,除非在 IndexJob 中设置了 dtsIndexKeepExistingDocIds 标志。
  • 当一个索引合并到另一个索引时,目标索引中的DocIds 永远不会改变。合并到目标索引中的文档都将被分配新的、按顺序编号的 DocId,除非 (a) 在 IndexJob 中设置了 dtsIndexKeepExistingDocIds 标志并且 (b) 索引具有不重叠的 doc id 范围。
  • 关于sql-server - 在 SQL 数据库中从 dtSearch 记录所有 DocIds 和 FileNames 的最快方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32344084/

    10-13 02:53