添加以向 SearchKick 添加令牌过滤器?

问题描述 投票:0回答:1

我有一个相当简单的用例,但到目前为止,寻找合适的语法一直很痛苦。

我写了几个token过滤器:

searchkick **{
  settings: {
    analysis: {
      filter: {
        replace_mm: {
          type: 'pattern_replace',
          pattern: '(\\d)mm',
          replacement: '$1 mm ',
        },
        replace_x_1: {
          type: 'pattern_replace',
          pattern: '(\\d) ?(×|x)',
          replacement: '$1 x ',
        },
        replace_x_2: {
          type: 'pattern_replace',
          pattern: '(×|x) ?(\\d)',
          replacement: ' x $2',
        },
      },
    },
  },
  word_start: [
    :name,
    :alternate_names,
    :description
  ],
  highlight: [
    :name,
  ],

我实际上如何使索引+搜索利用这些过滤器。我希望一切都保持默认,我想覆盖过滤器,再添加一些,因为其他一切都很完美。

ruby-on-rails ruby elasticsearch searchkick
1个回答
0
投票

这里的关键可能是利用

merge_mappings
参数并提供自定义映射/设置。

searchkick merge_mappings: true, mappings: {...}, settings: {...}

如果你想添加额外的令牌过滤器,你还需要创建额外的分析器才能使用它们,因为你不能直接使用令牌过滤器,它们是分析链的一部分。因此,您以正确的方式开始,将令牌过滤器添加到自定义设置中,但现在您还需要向自定义设置中添加新的分析器,或覆盖现有的分析器。

工作的第二部分,也是提供自定义映射以利用新的分析器,除非您已经覆盖了您所在领域的现有分析器。

查看默认设置是如何定义的,您的设置结构需要像这样才能正确合并:

{
  settings: {
    analysis: {
      filter: {
        replace_mm: {
          type: 'pattern_replace',
          pattern: '(\\d)mm',
          replacement: '$1 mm ',
        },
        replace_x_1: {
          type: 'pattern_replace',
          pattern: '(\\d) ?(×|x)',
          replacement: '$1 x ',
        },
        replace_x_2: {
          type: 'pattern_replace',
          pattern: '(×|x) ?(\\d)',
          replacement: ' x $2',
        },
      },
      analyzer: {
        my_new_analyzer: { ... },
        existing_analyzer: { ... },
      }
    },
  },
  mappings: {
    properties: {
      your_field: {
        type: text,
        analyzer: my_new_analyzer
      }
    }
  }

my_new_analyzer
将是一个新的分析器,您可以将其用于自定义映射(如果提供)中的一个字段,而
existing_analyzer
将是对现有分析器的覆盖,它考虑了您的新令牌过滤器。

您覆盖哪个分析器取决于您的字段类型,因为每种类型都有一个不同的分析器,名为

searchkick_#{type}_index
(完整列表可在此处)。

我希望这能让你走上正确的轨道。

© www.soinside.com 2019 - 2024. All rights reserved.