2014-03-26 55 views
1

我有以下映射和分析器的索引:elasticsearch ngrams:爲什麼更短的標記匹配而不是更長?

settings: { 
    analysis: { 
     char_filter: { 
     custom_cleaner: { 
      # remove - and * (we don't want them here) 
      type: "mapping", 
      mappings: ["-=>", "*=>"] 
     } 
     }, 
     analyzer: { 
     custom_ngram: { 
      tokenizer: "standard", 
      filter: [ "lowercase", "custom_ngram_filter" ], 
      char_filter: ["custom_cleaner"] 
     } 
     }, 
     filter: { 
     custom_ngram_filter: { 
      type: "nGram", 
      min_gram: 3, 
      max_gram: 20, 
      token_chars: [ "letter", "digit" ] 
     } 
     } 
    } 
    }, 
    mappings: { 
    attributes: { 
     properties: { 
     name: { type: "string"}, 
     words: { type: "string", similarity: "BM25", analyzer: "custom_ngram" } 
     } 
    } 
    } 
} 

和我有在索引中的以下2個文件:

"name": "shirts", "words": [ "shirt"]

"name": "t-shirts", "words": ["t-shirt"]

我執行一個多匹配查詢,如

"query": { 

      "multi_match": { 
       "query": "t-shirt", 
       "fields": [ 
        "words", 
        "name" 
       ], 
       "analyzer": "custom_ngram" 
      } 

    } 

的問題是:

球衣的得分爲1.17,而噸恤的得分爲0.8。 這是爲什麼,我怎麼能達到那t恤(直接匹配)有更高的分數?

我需要另一個用例,我必須檢測包含匹配的ngrams。 (襯衫穿在肌肉上,...)因此,我猜,我不能跳過牛仔褲。

謝謝!

回答

4

我相信這是因爲您使用的是StandardTokenizer,它將字符串「T恤」標記爲令牌「t」和「襯衫」。但是,「t」比最小克大小要短,因此不會從它生成令牌。所以你在每種情況下都會得到相同的匹配,但是帶有t-shirt的文檔更長,所以得分稍低。

通過使用Explain API,您可以獲取有關文檔獲得分數的原因的詳細信息。

您確定需要使用ngrams嗎?你的例子,「肌肉衫」中的「襯衫」應該由StandardAnalyzer來處理,它將在連字符上標記。

+0

謝謝你的回覆! 我會在一分鐘內試用。 我認爲*,我需要ngrams,因爲我想匹配「肌肉襯衫」以及。如果沒有ngram,這是可行的嗎? (實際上,它應該匹配肌肉襯衫和肌肉襯衫[對於錯誤的例子抱歉]) – udo

+0

解釋告訴我,你是絕對正確的。 不應該char_filter去掉 - 從t恤? 當我分析T恤時,elasticsearch返回沒有 - (tsh,shi,hir,irt,...)的ngrams。 – udo

+0

嗯。你是對的,這不太合理。你可以發佈解釋輸出嗎? – femtoRgon

相關問題