[英]Elastic search & chewy: make results uniq based on item content
抱歉,標題不夠清晰,但是我不確定如何用簡單的句子表達我的問題。
解釋一下:我正在處理的應用程序當前具有多種類型的對象,這些對象可以鏈接到由用戶添加的標簽。 當前,每個標簽是數據庫中的不同條目。
例如,我有:-對象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
標簽的值也會在彈性搜索中索引(使用耐嚼的寶石),因此應用程序會在標簽上提供一些自動補全功能。
主要問題是,當搜索“ 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
如果要讓Elastic搜索精確值,則可以使字段not_analyzed ,或者在類型或索引級別上使用keyword
tokenizer(而不是ngram)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.