2014-02-27 122 views
1

使用Elasticsearch我試圖用用戶提供的字符串查詢索引。我的文檔包含標點符號,我想保留這些標點符號,以便在檢索時能正確顯示,但我不希望該標點符號影響任何搜索結果,而不管它是否在查詢中提供。例如:Elasticsearch與NEST - 如何在搜索時忽略標點符號

實施例的文檔:

{ name: "joe's amazing document" } 

當查詢使用標準分析器,用於"joe's amazing document"這樣工作得很好,但是,如果在"joes amazing document"此用戶類型是不完全匹配和文檔丟失除其他低 - 比賽比賽。

我一直在尋找無濟於事到目前爲止找到如何與NEST做到這一點 - 我懷疑我可能需要使用char_filter such as this,但看着從NEST項目源測試我看不到如何添加用我自己指定的映射自己的定製char_filter,似乎只允許我指定Elasticsearch已經知道(擴展CharFilterBase只允許指定現有的過濾器的名稱使用)

任何人都可以點我的一個過濾器正確的方向與我想在這裏做什麼?我知道我可能會這樣做都是錯誤的,所以任何幫助都會很棒 - 我可以用NEST或Elasticsearch以某種方式做到這一點,還是我需要以某種方式定製Elasticsearch?或者有沒有我剛纔找不到的解決方案?謝謝!

更新:感謝femtoRgon的答案指向我朝着正確的方向,請參閱my answer下文,瞭解如何在NEST使用Snowball analyzer

回答

0

由於femtoRgon指着我在正確的方向,這裏是我結束了使用NEST解決方案和雪球分析儀:

首先我說我的文檔類的屬性,我想用分析儀這些屬性:

[ElasticType] 
public class MyIndexItem { 
    [ElasticProperty(IndexAnalyzer = "snowball", SearchAnalyzer = "snowball")] 
    public string Name { get; set; } 
} 

然後我重新利用這些屬性映射的所有索引:

_client.CreateIndex(IndexName, s => s 
    .AddMapping<MyIndexItem>(m => m.MapFromAttributes()) 
); 

最後我能夠索引和以正常的方式查詢,不需要額外的配置,Elasticsearch只在索引/查詢具有上述屬性的字段時應用這些分析器。

2

我相信對於標準分析儀來說,收縮和所有物可能會有問題,因爲它們很適合語言。比較:

  • 英語: 「喬的驚人文件」
  • 西班牙語: 「這份執行impresionante去喬」
  • 德國: 「喬erstaunliche庫門」)。

因此,language specific analyzer可能是最好的解決方案。 EnglishAnalyzer包含一個EnglishPossessiveFilter,它應該處理這種情況。

您可以設置一個英語分析是這樣的:

index : 
    analysis : 
     analyzer : 
      english : 
       type : english 
       stopwords : [...] 
       stem_exclusion : [...] 

stopwordsstem_exclusion都是可選的。當然,確保在索引和查詢時使用相同的分析器。

+0

謝謝你,但我發現它只能用其他方式 - 例如。如果文檔包含「joe amazing document」,並且查詢是針對所有格形式的「joe的驚人文檔」(有或沒有撇號),那麼英語分析師正確地指出這應該仍然是最佳匹配。但是,如果文檔包含所有格形式「joe的驚人文檔」,則「joes ...」的查詢不匹配。我想我會繼續嘗試,謝謝。 – embee

+0

這看起來很奇怪。我猜想,你可能會遇到一些奇怪的事情。有一些古怪的案件,它不處理完美。你確定你的英語分析器也被應用於查詢嗎? – femtoRgon

+0

是的我正在使用完全相同的數據測試兩個索引上的各種情況,一個使用每個分析器,然後使用相關分析器在每個分析器上運行查詢。當查詢包含所有格而數據不包含時,我只注意到兩組評分和結果順序之間的差異。 – embee