当前位置: 首页 > 面试题库 >

搜索成千上万文档(pdf和/或xml)的最佳做法

拓拔稳
2023-03-14
问题内容

回顾停滞的项目,并在现代化成千上万的“旧”文档并通过网络提供文档方面寻求建议。

文档以各种格式存在,有些已经过时:(。 docPageMaker ,硬拷贝(OCR), PDF
等)。有资金可用于将文档迁移为“现代”格式,许多硬拷贝已被OCR转换为PDF-我们原本以为PDF是最终格式,但我们愿意接受建议(XML?) 。

一旦所有文档都采用通用格式,我们便希望 通过Web界面 提供和 搜索
其内容。我们希望可以灵活地只返回发现“命中”搜索结果的整个文档的部分(页面?)(我相信Lucene /
elasticsearch可以做到这一点?!?)如果内容全部为XML,是否可以更加灵活?如果是这样,如何/在哪里存储XML?直接在数据库中还是在文件系统中作为离散文件?那么文档中嵌入的图像/图形呢?

很好奇其他人如何处理这个问题。没有“错误”的答案,我只是在寻找尽可能多的输入来帮助我们继续进行。

感谢您的任何建议。


问题答案:

总结:我将推荐ElasticSearch,但是让我们分解一下问题并讨论如何实现它:

这有几个部分:

  1. 从文档中提取文本以使其可索引
  2. 将此文本用作全文搜索
  3. 返回文档的突出显示的片段
  4. 知道在文档中的何处可以找到这些摘要以进行分页
  5. 返回完整文档

ElasticSearch可以提供什么:

  1. ElasticSearch(例如Solr)使用Tika从多种文档格式中提取文本和元数据
  2. 很明显,它提供了强大的全文本搜索。它可以配置为以适当的语言分析每个文档,以阻止,增强某些字段(例如,标题比内容重要),ngram等的相关性,即标准Lucene内容
  3. 它可以为每个搜索结果返回突出显示的摘要
  4. 它不知道这些片段在您的文档中出现的位置
  5. 它可以将原始文档存储为附件,也可以存储并返回提取的文本。但是它将返回整个文档,而不是页面。

您可以将整个文档作为附件发送到ElasticSearch,然后进行全文搜索。但是关键是上面的(4)和(5):知道您在文档中的位置,并返回文档的一部分。

存储单个页面可能足以满足“我在哪里”的目的(尽管您同样可以降到段落级别),但是您希望将它们分组以便在搜索结果中返回文档(即使出现搜索关键字)在不同的页面上。

首先是索引部分:将文档存储在ElasticSearch中:

  1. 使用Tika(或您喜欢的任何方式)从每个文档中提取文本。将其保留为纯文本或HTML格式,以保留某些格式。(忘记XML,不需要它)。
  2. 还提取每个文档的元数据:标题,作者,章节,语言,日期等
  3. 将原始文档存储在文件系统中,并记录路径,以便以后使用
  4. 在ElasticSearch中,为包含所有元数据以及可能的章节列表的“ doc”文档建立索引
  5. 将每个页面索引为一个“页面”文档,其中包含:

    • 甲父字段,其包含的“doc”文档的ID(见“父-子关系”下方)
    • 文本
    • 页码
    • 也许章节标题或编号
    • 您想要可搜索的任何元数据

现在进行搜索。如何执行此操作取决于您要如何显示结果-按页面或按文档分组。

按页面显示结果很容易。此查询返回匹配页面的列表(每个页面均完整返回)以及页面中突出显示的代码片段列表:

curl -XGET 'http://127.0.0.1:9200/my_index/page/_search?pretty=1'  -d '
{
   "query" : {
      "text" : {
         "text" : "interesting keywords"
      }
   },
   "highlight" : {
      "fields" : {
         "text" : {}
      }
   }
}
'

用文本高亮显示按“ doc”分组的结果有点棘手。单个查询无法完成此任务,但是只需进行少量客户端分组就可以到达您的位置。一种方法可能是:

步骤1:执行top-children-
query,
以找到其子项(“ page”)与查询最匹配的父项(“ doc”):

curl -XGET 'http://127.0.0.1:9200/my_index/doc/_search?pretty=1'  -d '
{
   "query" : {
      "top_children" : {
         "query" : {
            "text" : {
               "text" : "interesting keywords"
            }
         },
         "score" : "sum",
         "type" : "page",
         "factor" : "5"
      }
   }
}

步骤2:从上述查询中收集“ doc” ID,然后发出新查询以从匹配的“页面”文档中获取代码段:

curl -XGET 'http://127.0.0.1:9200/my_index/page/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "query" : {
            "text" : {
               "text" : "interesting keywords"
            }
         },
         "filter" : {
            "terms" : {
               "doc_id" : [ 1,2,3],
            }
         }
      }
   },
   "highlight" : {
      "fields" : {
         "text" : {}
      }
   }
}
'

第3步:在您的应用中,按文档将上述查询的结果分组并显示出来。

使用第二个查询的搜索结果,您已经具有可以显示的页面全文。要移至下一页,您只需搜索即可:

curl -XGET 'http://127.0.0.1:9200/my_index/page/_search?pretty=1'  -d '
{
   "query" : {
      "constant_score" : {
         "filter" : {
            "and" : [
               {
                  "term" : {
                     "doc_id" : 1
                  }
               },
               {
                  "term" : {
                     "page" : 2
                  }
               }
            ]
         }
      }
   },
   "size" : 1
}
'

或者,为“页面”文档提供一个包含$doc_id _ $page_num(例如123_2)的ID,然后您就可以检索该页面:

curl -XGET 'http://127.0.0.1:9200/my_index/page/123_2

亲子关系:

通常,在ES(以及大多数NoSQL解决方案)中,每个文档/对象都是独立的-
没有真正的关系。通过在“文档”和“页面”之间建立父子关系,ElasticSearch确保子文档(即“页面”)与父文档(“ doc”)存储在同一碎片上。

这使您可以运行top-children-
query,该查询将根据“页面”的内容找到最匹配的“ doc”。



 类似资料:
  • 问题内容: 我正在创建一个Web API,需要一种很好的方法来非常快速地生成一些格式正确的xml。我找不到在python中执行此操作的任何好方法。 注意:一些库看起来很有前途,但要么缺少文档,要么仅输出到文件。 问题答案: 使用lxml: 输出: 有关更多信息,请参见教程。

  • 问题内容: 是否有任何API /解决方案可从XML文件数据和定义生成PDF报告。例如,XML定义/数据可以是: 我觉得将HTML转换为PDF也是一个很好的解决方案。 当前,我们使用iText API编写Java代码。我想外部化代码,以便非技术人员可以编辑和更改。 问题答案: 看看Apache FOP 。使用XSLT样式表将XML(或XHTML)转换为XSL- FO。然后,使用FOP读取XSL-FO

  • 我有一个二进制搜索树,它的每个节点都有两个值。 所以它的节点是这样的。 我已经根据节点的“name”变量的升序在BST中插入了值。所以树的顺序遍历将按“name”的升序返回节点。 现在我想根据“值”变量的升序显示树节点。无需更改原始树。哪种算法/方法对此最有效?

  • 问题内容: 几天以来,我一直在Google上进行搜索,并且尝试了很多操作,但是仍然无法对用户集合执行良好的全文本搜索。 我尝试了ElasticSearch,但几乎无法查询和分页… 我尝试了许多用于Mongoose的插件,例如ElMongo,mongoose-full- text,Mongoosastic等。每个人的文档都非常糟糕,我不知道如何执行良好的全文本搜索。 因此,我的收藏是普通收藏: 我在

  • 问题内容: 我正在尝试编写一个应用程序的自动化测试,该测试基本上将自定义消息格式转换为XML消息并将其发送到另一端。我有一组不错的输入/输出消息对,所以我要做的就是将输入消息发送进去,并听XML消息传到另一端。 当需要将实际输出与预期输出进行比较时,我遇到了一些问题。我的第一个想法只是对预期消息和实际消息进行字符串比较。这不能很好地工作,因为我们拥有的示例数据并不总是保持一致的格式,并且常常为XM

  • Beautiful Soup定义了很多搜索方法,这里着重介绍2个: find() 和 find_all() .其它方法的参数和用法类似,请读者举一反三. 再以“爱丽丝”文档作为例子: html_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <p><b>The Dormouse's story</b><