2014-10-19 107 views
0

目前我開始使用C#「NEST」的Elasticsearch包裝器,並且在編寫查詢時會遇到一些麻煩,這些查詢會檢查「book」和「books」等部分相似性,因此當我有一個文檔含有「書」,如果我搜索「書」它沒有找到它: 這裏是我的代碼:Elasticsearch NEST

var articles = client.Search<ProductResult>(s => s 
     .From(0) 
     .Size(1000) 
     .MatchAll() 
     .Query(q => q.QueryString(d => d 
     .Query(query) 
      ))); 

回答

1

嘗試用詞幹分析器像snowball將嘗試分析你的領域是最好的降低的話到他們的根本形式。例如,booksbooking =>book,jumpsjumping =>jump。等等......它背後的算法並不完美,並會以不規則的單詞/複數形式出現,但大多數情況下它的效果非常好(在大多數歐洲語言中)。

您可以在最初創建索引時或在使用更新映射API的現有索引上應用不同的分析器。無論哪種方式,您都必須重新編制我們的文檔以應用新分析。

使用NEST創建索引的示例:

client.CreateIndex("yourindex", c => c 
    ... 
    .AddMapping<YourType>(m => m 
     .MapFromAttributes() 
     .Properties(ps => ps 
      .String(s => s.Name("fieldname").Analyzer("snowball")) 
      ... 
     ) 
    ) 
); 

更新映射例如:

client.Map<YourType>(m => m 
    .MapFromAttributes() 
    .Index("yourindex") 
    .Properties(ps => ps 
     .String(s => s.Name("fieldname").Analyzer("snowball")) 
     ... 
    ) 
); 

這裏有algorithmic stemmers in The Definitive Guide一些真正偉大的信息。

+0

謝謝你這麼多,你響應@GregMarzouka,我會嘗試一下,看看有什麼我可以有。如果您有更多關於使用NEST的詳細資源,請將它們與我分享,因爲我發現他們網站上提供的文檔是不夠的。 – WLegend 2014-10-22 08:42:47

0

U可以使用模糊也...

var articles = client.Search<ProductResult>(s => s 
      .From(0) 
      .Size(1000) 
      .Query(q => q.(d => d 
       .Fuzzy(fz => fz.OnField("field").Value("book").MaxExpansions(2)) 
       )); 
+0

謝謝,我會試試這個@dzomba – WLegend 2015-01-13 14:36:25

+0

MaxExpansion的值可以改變......更大的值意味着數據庫值和輸入之間的差異更大。做一些測試 – danvasiloiu 2015-01-14 08:32:07

+0

你也可以使用帶有通配符的queryString,你將搜索如下所示的內容:「book *」 – danvasiloiu 2015-07-09 10:51:17