【问题标题】:Index JSON filename along with JSON content in Solr在 Solr 中索引 JSON 文件名以及 JSON 内容
【发布时间】:2018-05-18 20:00:51
【问题描述】:

我有 2 个目录:1 个带有 txt 文件,另一个带有相应的 JSON(元数据)文件(每个大约 90000 个)。每个 CSV 文件都有一个 JSON 文件,它们共享相同的名称(它们不共享任何其他字段)。我正在尝试在 Apache solr 中索引所有这些文件。

txt 文件只有纯文本,我将每一行映射到一个字段调用“句子”,并使用数据导入处理程序将文件名作为字段包含在内。这里没有问题。

JSON 文件有元数据:3 个标签:URL、作者和标题(对应 txt 文件中的内容)。 当我索引 JSON 文件时(我只是使用了 _default 架构,并将字段发布到架构中,如官方 solr 教程中所述),我不知道如何将文件名作为字段放入索引中。据我所知,这不是对 JSON 文件使用数据导入处理程序的方法。我读过我可以通过 bin/post 工具传递文字,但据我所知,我不能将文件名作为文字动态传递。

我需要获取文件名,这是我可以将元数据与下游 Python 代码中 txt 文件中的每个句子相关联的唯一方法。

因此,如果有人对我应该如何索引 JSON 文件名以及 JSON 内容(甚至是一些解决方法)有任何建议,我将永远感激不尽。

【问题讨论】:

  • 那么您今天的索引情况如何?您如何知道要索引哪些文件,以及如何索引它们?
  • @MatsLindh,在此之前我没有索引文件,它们是由其他人生成的。要索引的文件位于一个目录中,具有不同的扩展名,就像我提到的那样。我已经索引了 txt 文件,现在必须索引这些 json 文件(这很简单:它们只有 3 个字段:url、作者、标题)。
  • @MatsLindh 我能想到的解决这个问题的唯一方法是一个非常丑陋的解决方法:将所有 json 文件转换为 csv 文件,然后使用带有 LineEntityProcessor 的数据导入处理程序对其进行索引和 RegexTransformer 像这样:` ` 但我宁愿直接用文件名索引 Json 文件。你有什么建议吗?
  • 大多数流行语言都有可用的 solr 客户端,因此,如果您要编写代码将 JSON 转换为 CSV - 请阅读 JSON 并将其作为常规 Solr 文档提交给 Solr。您也可以使用文件名。
  • 谢谢@MatsLindh,这比将文件转换为 CSV 更好。我将查看其中一个 Python 客户端模块的文档(似乎有一些!)。

标签: json solr import


【解决方案1】:

正如@MatsLindh 在 cmets 中提到的,我使用 Pysolr 进行索引并获取文件名。这是非常基本的,但我想我会发布我所做的,因为 Pysolr 没有太多文档。

因此,以下是您如何使用 Pysolr 索引多个 JSON 文件,同时还索引文件的文件名。如果您的文件和元数据文件具有相同的文件名(但扩展名不同),并且您希望以某种方式将它们链接在一起,例如我的情况,则可以使用此方法。

  • 使用 pysolr.Solr 命令打开与 Solr 实例的连接。
  • 遍历包含您的文件的目录,并使用 os.path.basename 获取每个文件的文件名并将其存储在变量中(如果需要,在删除扩展名之后)。
  • 将文件的 JSON 内容读入另一个变量。
  • Pysolr 期望将要索引的任何内容存储在字典列表中,其中每个字典对应一个记录。
  • 将您要索引的所有字段存储在字典中(下面我的代码中的 solr_content),同时确保键与托管模式文件中的字段名称匹配。
  • 将每次迭代中创建的字典附加到一个列表(我的代码中的 list_for_solr)。
  • 在循环之外,使用 solr.add 命令发送要在 Solr 中索引的词典列表。
  • 这就是它的全部内容!这是代码。

    solr = pysolr.Solr('http://localhost:8983/solr/collection_name')
    folderpath = directory-where-the-files-are-present
    list_for_solr = []
    for filepath in iglob(os.path.join(folderpath, '*.meta')):
        with open(filepath, 'r') as file:
            filename = os.path.basename(filepath)
            # filename is xxxx.yyyy.meta
            filename_without_extension = '.'.join(filename.split('.')[:2])
            content = json.load(file)
        solr_content = {}
        solr_content['authors'] = content['authors']
        solr_content['title'] = content['title']
        solr_content['url'] = content['url']
        solr_content['filename'] = filename_without_extension
        list_for_solr.append(solr_content)
    solr.add(list_for_solr)
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-13
    • 2021-02-27
    • 1970-01-01
    • 2020-09-21
    • 2020-05-21
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多