回顾停滞的项目,并在现代化成千上万的“旧”文档并通过网络提供文档方面寻求建议。
文档以各种格式存在,有些已经过时:(。 doc , PageMaker ,硬拷贝(OCR), PDF 等)。有资金可用于将文档迁移为“现代”格式,许多硬拷贝已被OCR转换为PDF-我们原本以为PDF是最终格式,但我们愿意接受建议(XML?) 。
一旦所有文档都采用通用格式,我们便希望 通过Web界面 提供和 搜索 其内容。我们希望可以灵活地只返回发现“命中”搜索结果的整个文档的部分(页面?)(我相信Lucene / elasticsearch可以做到这一点?!?)如果内容全部为XML,是否可以更加灵活?如果是这样,如何/在哪里存储XML?直接在数据库中还是在文件系统中作为离散文件?那么文档中嵌入的图像/图形呢?
很好奇其他人如何处理这个问题。没有“错误”的答案,我只是在寻找尽可能多的输入来帮助我们继续进行。
感谢您的任何建议。
总结:我将推荐ElasticSearch,但是让我们分解一下问题并讨论如何实现它:
这有几个部分:
ElasticSearch可以提供什么:
您可以将整个文档作为附件发送到ElasticSearch,然后进行全文搜索。但是关键是上面的(4)和(5):知道您在文档中的位置,并返回文档的一部分。
存储单个页面可能足以满足“我在哪里”的目的(尽管您同样可以降到段落级别),但是您希望将它们分组以便在搜索结果中返回文档(即使出现搜索关键字)在不同的页面上。
首先是索引部分:将文档存储在ElasticSearch中:
将每个页面索引为一个“页面”文档,其中包含:
现在进行搜索。如何执行此操作取决于您要如何显示结果-按页面或按文档分组。
按页面显示结果很容易。此查询返回匹配页面的列表(每个页面均完整返回)以及页面中突出显示的代码片段列表:
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,然后您就可以检索该页面:
$doc_id _ $page_num
curl -XGET 'http://127.0.0.1:9200/my_index/page/123_2
亲子关系:
通常,在ES(以及大多数NoSQL解决方案)中,每个文档/对象都是独立的- 没有真正的关系。通过在“文档”和“页面”之间建立父子关系,ElasticSearch确保子文档(即“页面”)与父文档(“ doc”)存储在同一碎片上。
这使您可以运行top-children- query,该查询将根据“页面”的内容找到最匹配的“ doc”。