【发布时间】: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 对象上,一个在每个字典对象上
每个文本对象中的 JSON,如选项 2,但仅用于呈现文本(不用于搜索),包含有关同一文本中每个位置的所有信息。
每个“字典对象”(定义、基本词、语法概念、语法标签)中的另一个 JSON,仅用于搜索(不呈现文本)。此列将跟踪此特定对象在所有文本中的匹配。这将是一个哈希数组,其中每个哈希都是 {text_id: x, text_index: y}。
使用此选项,搜索会“更容易”,但仍不理想:要查找包含某个属性的所有文本位置,我必须执行以下操作:
- 查找该属性的记录
- 从记录中提取 text_ids / 索引
- 查找具有这些 ID 的文本
- 使用 JSON 中每个 text_id 附带的索引从每个文本中提取匹配行。
如果它是我正在寻找的属性的组合,我必须为每个属性执行这 4 个步骤,然后找到每个属性的匹配集之间的交集(最终只有两者都包含)。
此外,当更新一个位置时(例如,如果一个人指出一个属性被错误地关联并且它实际上应该是另一个),我将不得不更新两个 JSON。
另外,存储 2 个 JSON 列是否真的会比 TextPosition 表带来任何实际好处?它可能会比使用 TextPosition 表占用更多的存储空间,有什么好处?
结论
总之,我正在寻找一些关于我应该遵循这 3 条路线中的哪一条的建议。我希望答案是“选项 1”,但如果是这样,我很想知道以后有大量条目时会出现哪些缺点/障碍。
谢谢,迈克尔·金
【问题讨论】:
标签: database postgresql search database-design nlp