对不起,标题不够清晰,但我不确定如何用一个简单的句子表达我的问题。
解释一下:我目前工作的应用程序有多种类型的对象,可以链接到标签,由用户添加。目前,每个标签都是数据库中的不同条目。
例如,我有: - 对象 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