繁体   English   中英

如何在SOLR中有效地索引和查询JSON字段数据?

[英]How to efficiently index and query JSON field data in SOLR?

从Postgres索引数据的最佳方法是什么,该数据包含一个带有长时间嵌套的JSONB数据的字段。

POSTGRES FIELD(json_db_field):

{
  ...
  "field_name": "field_value",
  "columns": [
      {
          "nested_key": "nested_value_1",
          ...
      },
      {
          "nested_key": "nested_value_1",
          ...
      },
    ],
    ...
}

截至目前,我正在像这样对字段进行索引:

<field name="json_db_field" type="my_text_general" indexed="true" stored="true" required="false" multiValued="false" default="{}"/>

<fieldType name="my_text_general" class="solr.TextField" positionIncrementGap="100" multiValued="false">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishMinimalStemFilterFactory"/>
        <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.EnglishMinimalStemFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone"/>
    </analyzer>
</fieldType>

我可以通过将其包含在查询字段中来查询该字段:

 qf=json_db_field

查询的速度相当慢,因此我认为最好更改此设置,因为将来可能会引起问题。

  1. 我是否应该先将Postgres中的JSON字段展平到一个新表,其中每个对象项都有列?
  2. 有没有一种方法可以索引我可以有效查询的SOLR?

将JSON数据引入Solr的方法有很多,尽管-在我看来-Solr可以比JSON内容更理想​​地用XML(使用DIH)填充。

但是,如果存储JSON,则不应将其存储为简单的文本字段。 顺便说一句:发布您的my_text_general字段定义会有所帮助。

我是否应该先将Postgres中的JSON字段展平到一个新表,其中每个对象项都有列?

我不会那样做。 将面向对象的结构迁移到平面结构中是可以的,但是大多数情况下,您会发现这样的问题。

有没有一种方法可以索引我可以有效查询的SOLR?

存在不同的方式,也存在不同的问题。如何通过使用靠近“嵌套文档”的内容来将Solr JSON索引,包括JSON结构的一部分。

看看这个:

索引嵌套文档

嵌套子文档

//更新查看您的字段定义,我不会使用那么多的过滤器。 但这取决于您的需求。 通常,您喜欢搜索一个准确的术语,例如columns 可能您不喜欢也找到column 为此,您应该只使用最少的过滤器,例如lowerCase和类似solr.StandardTokenizerFactory过滤器

看看这有什么可能: Solr分析器,令牌生成器和令牌过滤器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM