2016-02-02 18 views
0

對不起,標題不明確,但我不確定如何用簡單的句子表達我的問題。彈性搜索和耐嚼:根據項目內容製作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 

回答

0

如果你想彈對類型搜索的精確值,那麼要麼使字段not_analyzed,要麼使用keyword標記生成器(而不是NGRAM)或指數水平。

+0

問題不在於搜索本身(它工作正常),更多的是它返回結果的方式。如果我有兩個對象「標記」具有相同的值,我只想返回一個結果,而不是兩個。我知道我在解釋問題時並不完全清楚:/ – Vincent