【问题标题】:Parsing text, then searching it: one entry per position, vs. 1 JSON column per text解析文本,然后搜索它:每个位置一个条目,而不是每个文本 1 个 JSON 列
【发布时间】:2020-09-02 01:58:48
【问题描述】:

情况

我有一个使用 Postgresql 的 Rails 应用程序。

文本被添加到应用程序中(大小从几个字到 5,000 个字不等)。

首先自动解析文本,然后进行一些手动修改,以将文本中的每个单词/位置与特定信息(动词/名词/等、基本词(运行 ==> 运行)、定义 ID、语法标签)

给定一个引理(基本词,例如“run”),或词性(动词/名词),或语法标签,或定义 ID(或组合),我需要能够找到所有数据库中包含相同信息的其他文本位置。

冲突

我无法进行全文搜索,例如,如果我在“我离开纳什维尔”上单击“左”,我不希望出现“在红灯处左转”。红绿灯。我只想要“离开”作为动词,以及其他形式的“离开”作为动词。

另外,我可能只想要具有特定定义 ID 的“左”(例如,“左”用作“政党”,而不是用作“右的对立面”)。

简而言之,我正在寻找一些关于我应该采取以下 3 条路线中的哪条的建议(或者我没有考虑过第 4 条或第 5 条路线)。

解决方案

我能想到三个选项:

选项 1:文本位置

一个 TextPosition 表,用于存储每个单词的位置,其中包含上述每个属性的列。

这将使搜索变得非常容易,但会有很多记录(每个位置 1 个),但也许这不是问题?出于某种特定原因,存储这么多票是不是一个坏主意?

选项 2:Text 对象上的 JSON

Text 对象上的 JSON 列,用于将所有单词位置存储在大型哈希数组或哈希哈希中。

这将添加零记录,但是,a) 构建一个查询来搜索具有特定信息的所有文本可能会很困难,b) 该查询可能会很慢,并且 c) 它可能比单独的查询占用更多的存储空间表(TextPosition)。

选项 3:两个 JSON 列:一个在 Text 对象上,一个在每个字典对象上

  1. 每个文本对象中的 JSON,如选项 2,但仅用于呈现文本(不用于搜索),包含有关同一文本中每个位置的所有信息。

  2. 每个“字典对象”(定义、基本词、语法概念、语法标签)中的另一个 JSON,仅用于搜索(不呈现文本)。此列将跟踪此特定对象在所有文本中的匹配。这将是一个哈希数组,其中每个哈希都是 {text_id: x, text_index: y}。

使用此选项,搜索会“更容易”,但仍不理想:要查找包含某个属性的所有文本位置,我必须执行以下操作:

  1. 查找该属性的记录
  2. 从记录中提取 text_ids / 索引
  3. 查找具有这些 ID 的文本
  4. 使用 JSON 中每个 text_id 附带的索引从每个文本中提取匹配行。

如果它是我正在寻找的属性的组合,我必须为每个属性执行这 4 个步骤,然后找到每个属性的匹配集之间的交集(最终只有两者都包含)。

此外,当更新一个位置时(例如,如果一个人指出一个属性被错误地关联并且它实际上应该是另一个),我将不得不更新两个 JSON。

另外,存储 2 个 JSON 列是否真的会比 TextPosition 表带来任何实际好处?它可能会比使用 TextPosition 表占用更多的存储空间,有什么好处?

结论

总之,我正在寻找一些关于我应该遵循这 3 条路线中的哪一条的建议。我希望答案是“选项 1”,但如果是这样,我很想知道以后有大量条目时会出现哪些缺点/障碍。

谢谢,迈克尔·金

【问题讨论】:

    标签: database postgresql search database-design nlp


    【解决方案1】:

    文本解析和搜索让我的大脑受伤。但是,每当我遇到您所说的复杂性时,ElasticSearch 都是我的首选工具。你可以用它做一些非常复杂的索引和搜索。

    所以我的答案是 4) ElasticSearch。

    【讨论】:

    • 谢谢!是否有陡峭的学习曲线? IE。任何粗略的时间估计都需要一个有 ruby​​/rails 经验但没有弹性经验的人(我)?
    • 非常陡峭。我预计至少需要一周的时间来获得基本的基础知识,然后再花一周的时间来深入了解您的特定应用程序的细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多