Python 用JSON文件填充数据库,搜索值,仅返回匹配项。或者别的什么

Python 用JSON文件填充数据库,搜索值,仅返回匹配项。或者别的什么,python,json,Python,Json,首先,我在编程方面比较新;Python是我唯一熟悉使用的语言。第二,我把DB放在这个问题上,因为在搜索之后,这对我来说似乎是正确的,但如果DB更容易或更有效的话,我愿意不使用它 我必须处理的问题 我有一个包含75000个JSON文件的文件夹。它们都有相同的结构;下面是它们的外观示例(更多信息如下): 实际文件与上述文件不同的一种方式是,“纯文本”或“html”键将具有实际值,即文本(无论是纯文本还是html)。文本的长度可以从几句话到200多页不等。因此,JSON文件的大小从最小的907字节到2

首先,我在编程方面比较新;Python是我唯一熟悉使用的语言。第二,我把DB放在这个问题上,因为在搜索之后,这对我来说似乎是正确的,但如果DB更容易或更有效的话,我愿意不使用它

我必须处理的问题

我有一个包含75000个JSON文件的文件夹。它们都有相同的结构;下面是它们的外观示例(更多信息如下):

实际文件与上述文件不同的一种方式是,“纯文本”或“html”键将具有实际值,即文本(无论是纯文本还是html)。文本的长度可以从几句话到200多页不等。因此,JSON文件的大小从最小的907字节到2.1MB不等

我想做的事

基本上,我希望能够在所有文件中搜索纯文本或HTML字段中包含的单词或短语,并至少返回包含该单词或短语的文件列表。[理想情况下,我也会和他们一起做其他事情,但我可以在以后解决这些问题。我困惑的是从哪里开始。]

我想不出什么

  • 是否需要像MongoDB(或PostgreSQL)这样的文档存储数据库。如果这是处理这件事的适当方法,我愿意用我的方法来解决它。但我甚至不知道我应该如何解决这个问题,还是应该直接使用Python脚本迭代文件夹中的文件。是否可以使用将文件夹中的所有文件填充到数据库中,然后在每行中搜索子字符串?事实上,其中一些文件在其中一个值中有大量的文本,这让我觉得使用DB很奇怪,但再一次:我不知道我在做什么

  • 我想我知道直接用Python迭代文件。我知道如何打开文件,我知道如何从JSON文件中获取密钥列表。但是如何在两个JSON值中搜索匹配的子字符串呢?然后,如果在其中一个字符串中找到子字符串,如何将“id”字段返回到列表中,关闭文件,然后移动到下一个?(我的意思是,很明显,基本结构是有条件的。这是我在这里思考的逻辑结构:

    • Variable=“我要匹配的子字符串”
    • List=[]#将保存包含变量的文件的ID
    • 打开文件
    • 将文件读到底
    • 搜索文件[或仅搜索两个JSON键?]以查找变量
    • 如果找到变量,请将“id”附加到列表中
    • 关闭文件
    • 移动到目录中的下一个

    这是我遇到的实际代码部分。

    使用熊猫的想法,因为我不了解搜索引擎,有些复制自:

    创建它将花费很长时间,但一旦完成,您就可以快速搜索和执行操作。例如,如果您想查找所有
    id
    ,其中
    作者
    不是空的:

    id_list = temp.loc[temp['author'] != '']['id'].tolist()
    

    如果您所有文件的总大小都很大,您可能希望查阅文档以更高效地存储内容或使用其他方法。

    使用某种工具比迭代文件更可取,因为简单地处理文件需要花费大量时间。请查看Elasticsearch。如果您想实际搜索任意文本中的单词和单词,请查看Elasticsearchrases,使用搜索引擎(Elasticsearch、Solr、Graylog、Splunk)不是一个需要索引才能高效搜索的文档存储库。我有一种预感,我的两种天真方法中的一种或两种都是错误的。当各种数据库的所有示例和教程等都使用键:值对中具有非常简单/短值的示例时,我很快就得出了这个结论。但这是最陡峭的部分,我认为nk是编程学习曲线的一部分。有无数种不同的工具来做工作,甚至不知道如何找到合适的工具。
    dfs = [] # an empty list to store the data frames
    for file in file_list:
        data = pd.read_json(file, lines=True) # read data frame from json file
        dfs.append(data) # append the data frame to the list
    
    temp = pd.concat(dfs, ignore_index=True) # concatenate all the data frames in the list.
    
    id_list = temp.loc[temp['author'] != '']['id'].tolist()