Solr - 从数据库索引JSON查询字符串?

时间:2012-01-26 15:09:51

标签: search solr search-engine

我想知道是否可以索引包含可以解码的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可以做到这一点吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

我对此发表了评论。我觉得我应该回答。

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

您的问题证明某人(可能是最终用户)对按此数据进行搜索感兴趣。这意味着它应该作为实际的Date或Timestamp字段存储在数据库中,以便可以正确选择或排序。

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

答案 1 :(得分:1)

  1. 如果您了解Java的方法,您可以编写自己的自定义变换器来处理您的特定情况。

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

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

答案 2 :(得分:1)

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这样的文档DB提供了完全相同的功能:在插入时确定的任意字段上存储数据。它可以对您的数据运行任何类型的即席查询

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

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

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

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