可搜索存档数千个文档的最佳做法(pdf和/或xml)
重新审视一个停滞的项目,寻找在现代化成千上万的“旧”文件,并通过网络提供建议。
文档以各种格式存在,一些过时:(.doc,PageMaker,硬拷贝(OCR),PDF等)。资金可用于将文档迁移到“现代”格式,许多硬拷贝已经被OCR化为PDF – 我们最初认为PDF将是最终格式,但我们接受建议(XML?) 。 一旦所有文档都采用通用格式,我们希望通过Web界面提供并搜索其内容。我们希望灵活地只返回整个文档的一部分(页面?),其中发现了一个搜索“hit”(我相信Lucene / elasticsearch使这可能吗?)?如果内容是所有XML,它可能更灵活吗?如果是这样如何/在哪里存储XML?直接在数据库中,还是作为文件系统中的离散文件?在文档中嵌入图像/图形怎么样? 好奇别人可能会这样做。没有“错误”的答案,我只是寻找尽可能多的输入,以帮助我们继续。 感谢任何建议。
总之:我将推荐
ElasticSearch,但让我们把问题解决,并谈谈如何实现它:
这里有几个部分: >从文档中提取文本,使其可编入索引 ElasticSearch提供的内容: > ElasticSearch(如Solr)使用Tika从各种各样的doc formats中提取文本和元数据 您可以将整个文档作为附件发送到ElasticSearch,您将获得全文搜索。但是坚持要点是上面的(4)和(5):知道你在文档中的哪个位置,并且返回文档的部分。 存储单个页面可能足以满足您的“我的目的”(虽然您可以等同于段落级别),但是您希望它们以在搜索结果中返回文档的方式进行分组,即使搜索关键字出现在不同的页面。 首先索引部分:将您的文档存储在ElasticSearch中: >使用Tika(或任何你喜欢的)从每个文档中提取文本。将其保留为纯文本,或保留为HTML以保留一些格式。 (忘了XML,不需要它)。 > A parent field,其中包含“doc”文档的ID(请参阅下面的“父子关系”) 现在搜索。如何做到这一点取决于你想如何展示你的结果 – 按页或按doc分组。 按页结果很容易。此查询返回匹配页面的列表(每个页面都完整返回)以及页面中的突出显示的代码段列表: 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,找到其子代(“页面”)与查询最匹配的父代(“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,并发出一个新查询,以从匹配的“page”文档中获取代码段: 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步:在您的应用程序中,通过doc将上述查询的结果分组并显示它们。 使用第二个查询的搜索结果,您已经拥有了可以显示的页面的全文。要移动到下一页,您只需搜索它: 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 } ' 或者,给“page”docs一个ID由$ doc_id _ $ page_num(例如123_2),那么你可以只是检索该页: curl -XGET 'http://127.0.0.1:9200/my_index/page/123_2 父子关系: 通常,在ES(和大多数NoSQL解决方案)中,每个doc /对象是独立的 – 没有真正的关系。通过在“doc”和“page”之间建立父子关系,ElasticSearch确保子文档(即“页面”)存储在与父文档(“doc”)相同的shard上。 这使您能够运行top-children-query,它将根据“页面”的内容找到最匹配的“doc”。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |