【问题标题】:How to efficiently index and query JSON field data in SOLR?SOLR中如何高效索引查询JSON字段数据?
【发布时间】:2019-07-27 11:06:27
【问题描述】:

从 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 中索引这个字段,我可以有效地查询?

【问题讨论】:

    标签: postgresql search indexing solr


    【解决方案1】:

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

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

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

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

    有没有办法在 SOLR 中索引这个字段,我可以有效地查询?

    有不同的方法和不同的问题如何通过使用“嵌套文档”附近的东西来索引 JSON 和 Solr,包括 JSON 结构的一部分。

    看看这个:

    indexing-nested-documents-in-solr

    Nested Child Documents

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

    看看这个,看看有什么可能:Solr Analyzers, Tokenizers, and Token Filters

    【讨论】:

    • 我已更新帖子以包含字段定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多