【问题标题】:Solr - index JSON query string from database?Solr - 从数据库中索引 JSON 查询字符串?
【发布时间】:2012-01-26 15:09:50
【问题描述】:

我想知道是否可以对包含可以解码的 JSON 字符串的数据进行索引,并且每个 JSON 值都可以使用单独的值进行索引。

我正在使用 DIH 连接到 MySQL 数据库并能够索引各个列。 结果如下所示:

<response name="response" numFound="1" start="0" maxScore="2.7143538">
    ...
    <result name="response" numFound="1" start="0" maxScore="2.7143538">
        <doc>
        <float name="score">2.7143538</float>
        <str name="id">82</str>
        <str name="name">jorge</str>
        <str name="otherinfo">{"day":15,"year":1989,"month":"January"}</str>
    </doc>
</result>
</response>

问题是“otherinfo”是一个 JSON 字符串,我想对其进行解码并在我的索引中包含以下内容:

<response name="response" numFound="1" start="0" maxScore="2.7143538">
    ...
    <result name="response" numFound="1" start="0" maxScore="2.7143538">
        <doc>
        <float name="score">2.7143538</float>
        <str name="id">82</str>
        <str name="name">jorge</str>
        <str name="day">15</str>
        <str name="year">1989</str>
        <str name="month">January</str>
    </doc>
</result>
</response>

这完全可以用 Solr 做吗?

提前致谢

【问题讨论】:

  • JSON 会有固定的结构吗?即,它是否总是有三个名为dayyearmonth 的键?顺序一样吗?​​
  • 不是一个答案,而是一个想法。您可能不想将数据以 JSON 格式存储在数据库中。不得不问这个问题只是为什么不问的一个例子。数据库不是您应该进行演示的地方,尤其是当您确实需要访问各个字段时。日期应存储在支持它的数据库字段类型中。你最好希望你永远不需要在这个日期之前排序或选择。您刚刚证明有人想要搜索它。

标签: search solr search-engine


【解决方案1】:

我对此发表了评论。我决定我应该回答。

解决您的问题的方法不在 Solr 级别。一开始您不应该以这种方式将数据存储在数据库中。从长远来看,最好在那里解决这个问题,而不是试图在 Solr 索引级别破解这个问题。

您的问题证明有人(可能是最终用户)有兴趣通过这些数据进行搜索。这意味着它可能应该作为实际的日期或时间戳字段存储在数据库中,以便可以正确选择或排序。

我相信人们不会喜欢这并不能完全回答您的问题,但需要有人告诉您这一点。

【讨论】:

  • rFreak,我完全同意你的看法......我继承了这个数据库,需要做出重新设计数据库的艰难选择......唷
【解决方案2】:
  1. 如果您熟悉 Java,您可以编写自己的自定义转换器来处理您的特定情况。

  2. 您是否尝试过使用 DIH RegexTransformer 解析 JSON?
    我认为这应该是可行的,特别是如果你有固定的 json 格式(不包含 document in document in ...)。

  3. 我刚刚注意到ScriptTransformer,它允许您编写自己的解析器。我认为这是要走的路……

【讨论】:

  • 太棒了!我看了一下转换器(因为 json 数据格式不会被固定),哇!我创建了一个如下所示的转换器脚本:
  • 我使用了 eval(我一直不太喜欢)来解码 JSON 字符串。有谁知道在这种技术中是否有更好的方法来解码 JSON 字符串?无论如何,非常感谢您帮助解决这个问题。
  • 请将其添加到 Solr ScriptTransformer wiki 作为解析嵌入式 JSON 的示例。
【解决方案3】:

DB 中的otherinfo 字段是否以JSON 字符串开头?


您需要动态字段(docsexplanation)和客户端代码来让 Solr 使用任意模式存储数据。

您需要在架构中定义动态字段,例如:

dyn_string_*: store text as it is
dyn_text__*: store text and index it for search

然后您需要告诉 DIH 将 DB 字段映射到 solr 动态字段(伪代码警告;抱歉,我不熟悉 DIH):

Select
    day as dyn_number_day,
    name as dyn_text_name
from
    tablename

编辑

您确实需要查询数据结构。这需要 无模式 数据存储。

像 MongoDB 这样的文档数据库完全提供了功能:将数据存储在您在插入时确定的任意字段上。它可以对您的数据运行任何类型的即席查询

我不知道可以为此索引您的数据的请求处理程序。您可以编写代码来定期获取更新(或添加或删除)的行,解码 JSON 字段并将其索引到 Solr。

我建议 skinny data model 将属性存储到独立于当前数据库架构的属性。不久前我问了一个问题'Set intersection in MySQL: a clean way'。

回顾:MongoDB 和朋友包含您需要的功能。如果你想要关系和参照完整性,你可以继续使用 RDBMS。如果你仍然想要那个 JSON 东西,开发一个活动系统来解析它并将它索引到 solr。但我建议转向精简数据模型,因为您可以获得 Solr 通过 SQL 为您提供的相同(条件适用!)查询功能。

外来技术:像 Neo4j 这样的图形数据库包含文档数据库功能(即席查询)和关系:关系直接将一个节点链接到另一个节点,不涉及连接。因此,它距离参照完整性仅一步之遥。

【讨论】:

  • 是的,数据库中的数据是 JSON 字符串
猜你喜欢
  • 2019-07-27
  • 2011-11-08
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 2017-10-21
相关资源
最近更新 更多