2012-01-26 28 views
0

我想知道是否有可能对包含可解码的JSON字符串的数据进行索引,并将每个JSON值与各个值进行索引。Solr - 从数据库索引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> 

的问题是,“活动促销”是,我想解码,并有一些像我的指标以下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可以做到这一点吗?

在此先感谢

+0

JSON的结构是否固定?即它是否总是有三个名为'day','year'和'month'的键?以相同的顺序? – Chewie

+0

不是一个答案,而是一个想法。您可能不想将数据以JSON格式存储在数据库中。不得不问这个问题只是一个例子,为什么不呢。数据库不是你的演示文稿应该被保留的地方,特别是如果你真的需要访问单个字段。日期应该存储在支持它的数据库字段类型中。你最好希望你永远不需要排序,或者按照这个日期选择。你刚刚证明有人想要搜索它。 – rfeak

回答

1
  1. 如果你知道关于Java用自己的方式,你可以写你自己的,定制的变压器,将处理您的具体情况。

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

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

+0

太棒了! 我看了一下变压器(因为json数据格式不会被修复)和hurah! 我创建了一个看起来像一个变压器脚本如下: –

+0

+0

我用eval(我从来不太喜欢)解码JSON字符串。有谁知道是否有更好的方法来解码这种技术中的JSON字符串? 无论如何,非常感谢你帮助解决它。 –

1

在DB的otherinfo场JSON字符串开始吗?


您需要动态字段(docsexplanation)和客户端代码来让Solr的存储数据与arbitary架构。

您需要在您的架构像定义动态字段:

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

然后,你需要告诉DIH映射数据库字段到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为你提供的相同的(条件适用!)查询功能。

异国技术:像Neo4j这样的图形数据库包含文档数据库功能(即席查询)和关系:关系直接将一个节点链接到另一个节点,不涉及任何连接。所以这只是参考完整性的一小步。

+0

好吧,我不知道这一点。谢谢 –

+0

是的,数据是作为数据库中的JSON字符串 –

2

我对此评论过。我决定我应该回答。

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

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

我敢肯定,人们不会喜欢这不完全回答你的问题,但有人需要告诉你这一点。

+0

rFreak,我完全同意你的看法......我继承了这个数据库,并且需要做出重新设计数据库的困难选择...... phew –