簡體   English   中英

彈性搜索和耐嚼:根據項目內容使結果唯一

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM