0

对不起,标题不够清晰,但我不确定如何用一个简单的句子表达我的问题。

解释一下:我目前工作的应用程序有多种类型的对象,可以链接到标签,由用户添加。目前,每个标签都是数据库中的不同条目。

例如,我有: - 对象 1 标记为:tag1、tag2 - 对象 2 标记为:tag2、tag3 - 对象 3 标记为:tag1、tag3、tag4

标签的表格如下所示:

id | value | tagged object
 1 | tag1  | 1
 2 | tag2  | 1
 3 | tag2  | 2
 4 | tag3  | 2
 5 | tag1  | 3
 6 | tag3  | 3
 7 | tag4  | 3

标签的值也在弹性搜索中被索引(使用耐嚼的 gem),因此应用程序在标签上提供了一些自动完成功能。

主要问题是,当搜索 'ta' 时,Elastic 搜索会返回列表:tag1, tag2, tag2, tag3, tag1, tag3, tag4 这会造成一些麻烦。假设我们有 100 个对象用“tag1”标记,第 101 个对象用“tag2”标记。如果我搜索“ta”,则不会返回“tag2”(因此不会被建议)。

我想要的是搜索查询返回:tag1,tag2,tag3,tag4(我不太关心所说的顺序),所以基本上根据索引标签的值统一结果,而不是整个对象。我希望我的问题足够清楚:)

提前致谢 :)

可能会有所帮助,这里是用于声明索引和索引元素的代码(是的,索引了两个字段,但是已经很难用一个字段来解释了;))

class SuggestionsIndex < Chewy::Index
  settings analysis: {
    filter: {
      ngram: {
        type: 'nGram',
        min_gram: 1,
        max_gram: 50,
        token_chars: [ 'letter', 'digit']
      }
    },
    tokenizer: {
      ngram_tokenizer: {
        type: 'nGram',
        min_gram: 1,
        max_gram: 50,
        token_chars: [ 'letter', 'digit', 'punctuation', 'symbol']
      }
    },
    analyzer: {
      # ngram indexing allows searching for a substring in words
      ngram: {
        tokenizer: 'ngram_tokenizer',
        filter: ['lowercase', 'asciifolding']
      },
      # when searching, we search for the lowercase words, not the ngram
      lowerascii_search: {
        tokenizer: 'whitespace',
        filter: ['lowercase', 'asciifolding']
      }
    }
  }

  define_type Tag do
    field :key,
      index_analyzer: 'ngram',
      search_analyzer: 'lowerascii_search'
    field :value,
      index_analyzer: 'ngram',
      search_analyzer: 'lowerascii_search'
    field :project_id, type: 'integer'
  end
end
4

1 回答 1

0

如果您希望弹性搜索精确值,则要么使字段not_analyzed,要么keyword在类型或索引级别上使用标记器(而不是 ngram)。

于 2016-02-02T16:47:03.020 回答