解析文本,然后搜索它:每个位置一个条目,而不是每个文本 1 个 JSON 列



>情况

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

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

文本首先被自动解析,然后进行一些手动修订,以将文本中的每个单词/位置与特定信息(动词/名词/等,基本单词(运行==>运行(,definition_id,语法标签(相关联。

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

冲突

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

另外,我可能只想用特定的definition_id"左"(例如,"左"用作"政党",而不是用作"右派的对立面"(。

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

解决 方案

我能想到的有三个选项:

选项 1:文本位置

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

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

选项 2:文本对象上的 JSON

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

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

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

  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",但如果是这样,我很想知道以后有大量条目时会出现哪些缺点/障碍。

谢谢,迈克尔·金

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

所以我的答案是4(弹性搜索。

相关内容

  • 没有找到相关文章

最新更新