Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数千份文档(pdf和/或xml)可搜索归档的最佳做法_Xml_Pdf_Lucene_Full Text Search_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Xml,Pdf,Lucene,Full Text Search,elasticsearch" /> elasticsearch,Xml,Pdf,Lucene,Full Text Search,elasticsearch" />

数千份文档(pdf和/或xml)可搜索归档的最佳做法

数千份文档(pdf和/或xml)可搜索归档的最佳做法,xml,pdf,lucene,full-text-search,elasticsearch,Xml,Pdf,Lucene,Full Text Search,elasticsearch,重温一个陷入僵局的项目,并寻求对数千份“旧”文档进行现代化并通过web提供这些文档的建议 文档的格式多种多样,有些已经过时:(.doc、PageMaker、硬拷贝(OCR)、PDF等)。我们有资金将文档迁移到“现代”格式,并且许多硬拷贝已经被OCR转换成PDF格式——我们最初假设PDF将是最终格式,但我们愿意接受建议(XML?) 一旦所有文档都采用通用格式,我们希望通过web界面使其内容可用并可搜索。我们希望能够灵活地只返回整个文档中搜索“命中”的部分(页面?)(我相信Lucene/elasti

重温一个陷入僵局的项目,并寻求对数千份“旧”文档进行现代化并通过web提供这些文档的建议

文档的格式多种多样,有些已经过时:(.docPageMaker、硬拷贝(OCR)、PDF等)。我们有资金将文档迁移到“现代”格式,并且许多硬拷贝已经被OCR转换成PDF格式——我们最初假设PDF将是最终格式,但我们愿意接受建议(XML?)

一旦所有文档都采用通用格式,我们希望通过web界面使其内容可用并可搜索。我们希望能够灵活地只返回整个文档中搜索“命中”的部分(页面?)(我相信Lucene/elasticsearch可以实现这一点?!?)如果内容都是XML,是否会更灵活?如果是,如何/在何处存储XML?直接在数据库中,还是作为文件系统中的离散文件?文档中嵌入的图像/图形如何

我很好奇其他人会如何处理这件事。没有“错误”的答案,我只是在寻找尽可能多的信息来帮助我们继续前进


谢谢你的建议。

我已经构建并维护了一个应用程序,可以索引和搜索70k+PDF文档。我发现必须从PDF中提取纯文本,将内容存储在SQL中,并使用Lucene为SQL表编制索引。否则,表现就糟透了

使用或类似,它处理大多数主要文档格式。他们使用Solr/Lucene。

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

这有几个部分:

  • 从文档中提取文本以使其可索引
  • 使此文本作为全文搜索可用
  • 返回突出显示的文档片段
  • 知道在文档中的何处可以找到这些代码段 传呼
  • 返回完整的文档
  • ElasticSearch可以提供什么:

  • ElasticSearch(如Solr)用于从各种文档中提取文本和元数据
  • 很明显,它提供了强大的全文搜索功能。可以对其进行配置 用适当的语言分析每个文档,包括,词干,增强某些字段的相关性(例如标题比内容更重要),ngrams等,即标准Lucene内容
  • 它可以返回每个搜索结果
  • 它不知道这些代码片段出现在你的文档中的什么地方
  • 它可以将原始文档存储为,也可以存储并返回提取的文本。但它会返回整个文档,而不是一页
  • 您只需将整个文档作为附件发送到ElasticSearch,即可获得全文搜索。但症结在于(4)和(5)以上:知道自己在文档中的位置,并返回文档的部分内容

    存储单个页面对于where-am-I目的来说可能已经足够了(尽管您也可以向下到段落级别),但是您希望以一种在搜索结果中返回文档的方式对它们进行分组,即使搜索关键字出现在不同的页面上

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

  • 使用Tika(或任何您熟悉的工具)从每个文档中提取文本。将其保留为纯文本或HTML以保留某些格式。(忘记XML,不需要它)
  • 还提取每个文档的元数据:标题、作者、章节、语言、日期等
  • 将原始文档存储在文件系统中,并记录路径,以便以后提供服务
  • 在ElasticSearch中,索引一个“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:执行以下操作以查找其子项(“页面”)与查询最匹配的父项(“文档”):

    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,并发出新的查询以从匹配的“page”文档中获取代码片段:

    步骤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\u ID\u$page\u num
    组成的ID(例如123\u 2),然后您可以检索该页面:

    curl -XGET 'http://127.0.0.1:9200/my_index/page/123_2
    
    亲子关系:

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


    这使您能够运行,它将根据“页面”的内容找到最佳匹配的“文档”。

    将内容存储在数据库中有什么好处?提取内容(假设您不只是使用Solr并跳过手动处理)、为其编制索引并丢弃纯文本内容不是更容易吗?好吧。。。我得回去看看密码
    curl -XGET 'http://127.0.0.1:9200/my_index/page/123_2