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

时间:2019-03-05 21:36:47

标签: postgresql search indexing solr

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

POSTGRES字段(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中为我可以有效查询的该字段建立索引?

1 个答案:

答案 0 :(得分:0)

将JSON数据引入Solr的方法有很多,尽管-我认为-Solr可以用XML(使用DIH)填充而不是JSON内容。

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

  

我应该先在Postgres中将JSON字段展平到一个新表,其中包含每个对象项的列吗?

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

  

是否有一种方法可以在SOLR中为我可以有效查询的该字段建立索引?

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

看看这个:

indexing-nested-documents-in-solr

Nested Child Documents

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

对此事一探究竟,怎么可能:Solr Analyzers, Tokenizers, and Token Filters

相关问题