對不起,標題不明確,但我不確定如何用簡單的句子表達我的問題。彈性搜索和耐嚼:根據項目內容製作uniq結果
解釋:我工作的應用程序目前有多種類型的對象可以鏈接到標籤,由用戶添加。目前,每個標籤都是數據庫中的不同條目。
對於比方說,比如我有: - 標記對象1:標籤1,標籤2 - 對象2標記有:標籤2,標籤3 - 對象3標記有:標籤1,標籤3,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
的變量的值也被收錄在彈性搜索(使用耐嚼的寶石),以便應用程序提供了標籤上的一些自動完成。
主要問題是,當搜索'ta'時,彈性搜索將返回列表:tag1,tag2,tag2,tag3,tag1,tag3,tag4,這會導致一些麻煩。 我們假設我們有100個標記爲「tag1」的對象,101st標記爲「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
問題不在於搜索本身(它工作正常),更多的是它返回結果的方式。如果我有兩個對象「標記」具有相同的值,我只想返回一個結果,而不是兩個。我知道我在解釋問題時並不完全清楚:/ – Vincent