2013-05-02 132 views
0

我試圖用NEST c#客戶端在ElasticSearch中查詢沒有口音的查詢,我的數據具有帶口音的葡萄牙拉丁字。見代碼如下:使用NEST C#客戶端的ElasticSearch區分重音查詢

var result = client.Search<Book>(s => s 
    .From(0) 
    .Size(20) 
    .Fields(f => f.Title) 
    .FacetTerm(f => f.OnField(of => of.Genre)) 
    .Query(q => q.QueryString(qs => qs.Query("sao"))) 
); 

此搜索沒有發現任何內容。我在該指數上的數據包含許多標題,如:「SãoCristóvan」,「SãoGonçalo」。

var settings = new IndexSettings(); 
settings.NumberOfReplicas = 1; 
settings.NumberOfShards = 5; 
settings.Analysis.Analyzers.Add("snowball", new Nest.SnowballAnalyzer { Language = "Portuguese" }); 
var idx5 = client.CreateIndex("idx5", settings); 

我怎樣才能讓查詢 「」,找到 「聖保羅」 使用ElasticSearch?

我認爲必須創建具有正確屬性的索引,但我已經嘗試過許多設置。

或原始模式:

 

    { 
    "idx" : { 
     "settings" : { 
     "index.analysis.filter.jus_stemmer.name" : "brazilian", 
     "index.analysis.filter.jus_stop._lang_" : "brazilian" 
     } 
    } 
    } 

我怎樣才能使搜索和忽略的口音?

感謝朋友,

回答

2

看到的解決辦法:

連接上elasticsearch搜索用膩子執行:

curl -XPOST 'localhost:9200/idx30/_close' 

curl -XPUT 'localhost:9200/idx30/_settings' -d '{ 
      "index.analysis.analyzer.default.filter.0": "standard", 
      "index.analysis.analyzer.default.tokenizer": "standard", 
      "index.analysis.analyzer.default.filter.1": "lowercase", 
      "index.analysis.analyzer.default.filter.2": "stop", 
      "index.analysis.analyzer.default.filter.3": "asciifolding", 
      "index.number_of_replicas": "1" 
}' 

curl -XPOST 'localhost:9200/idx30/_open' 

替換 「idx30」 與

完成索引的名字!

0

您將要合併的ACSII Folding filter到您的分析儀來完成這項工作。這將意味着構建snowballanalyzer表單標記器和過濾器(除非nest允許您將篩選器添加到非定製分析器中,但據我所知,ElasticSearch沒有)。

甲SnowballAnalyzer包含:

  • StandardTokenizer
  • StandardFilter
  • (添加此處所述ASCIIFolding濾波器)
  • LowercaseFilter
  • 的StopFilter(與適當的停止字組)
  • SnowballFilter (用適當的語言)
  • (或者,也許在這裏)

我可能會嘗試只LowercaseFilter之前添加ASCIIFoldingFilter,雖然它可能是更好的將其添加爲非常拉斯步驟(SnowballFilter後)。嘗試兩種方式,看看哪個更好。我不太瞭解Protuguese的詞幹說哪個最好。

+0

我試過設置它,但它沒有工作! settings.Analysis.Analyzers.Add(「standard」,new Nest.StandardAnalyzer()); settings.Analysis.TokenFilters.Add(「ascii」,new AsciiFoldingTokenFilter()); settings.Analysis.TokenFilters.Add(「小寫」,新的Nest.LowercaseTokenFilter()); settings.Analysis.Analyzers.Add(「lang」,new Nest.LanguageAnalyzer(Language.Brazilian){StopWords = new List {「com」,「quem」}}); settings.Analysis.Analyzers.Add(「snowball」,new Nest.SnowballAnalyzer {Language =「Brazilian」}); – 2013-05-02 19:40:46

+0

你用最後的ASCIIFoldingFilter來試試嗎?真的不確定哪個更合適。它怎麼不起作用?它是否像以前一樣執行操作,拋出異常,無法獲得結果? – femtoRgon 2013-05-02 19:48:41

3

我偶然發現了這個線程,因爲我得到了同樣的問題。 這裏的NEST代碼與AsciiFolding分析創建索引:

// Create the Client 
string indexName = "testindex"; 
var uri = new Uri("http://localhost:9200"); 
var settings = new ConnectionSettings(uri).SetDefaultIndex(indexName); 
var client = new ElasticClient(settings); 
// Create new Index Settings 
IndexSettings set = new IndexSettings(); 
// Create a Custom Analyzer ... 
var an = new CustomAnalyzer(); 
// ... based on the standard Tokenizer 
an.Tokenizer = "standard"; 
// ... with Filters from the StandardAnalyzer 
an.Filter = new List<string>(); 
an.Filter.Add("standard"); 
an.Filter.Add("lowercase"); 
an.Filter.Add("stop"); 
// ... just adding the additional AsciiFoldingFilter at the end 
an.Filter.Add("asciifolding"); 
// Add the Analyzer with a name 
set.Analysis.Analyzers.Add("nospecialchars", an); 
// Create the Index 
client.CreateIndex(indexName, set); 

現在你可以映射你的實體,以該指數

client.MapFromAttributes<TestEntity>(); 

(它做到這一點,你創建索引後很重要)和下面是這樣一個實體的樣子:

[ElasticType(Name = "TestEntity", DisableAllField = true)] 
public class TestEntity 
{ 
    public TestEntity(int id, string desc) 
    { 
     ID = id; 
     Description = desc; 
    } 

    public int ID { get; set; } 

    [ElasticProperty(Analyzer = "nospecialchars")] 
    public string Description { get; set; } 
} 

現在你去了,說明字段現在插入索引中,沒有重音。 您可以測試這個,如果你檢查你的索引的映射:

http://localhost:9200/testindex/_mapping 

然後應該是這個樣子:

{ 
    testindex: { 
     TestEntity: { 
      _all: { 
       enabled: false 
      }, 
      properties: { 
       description: { 
        type: "string", 
        analyzer: "nospecialchars" 
       }, 
       iD: { 
        type: "integer" 
       } 
      } 
     } 
    } 
} 

希望這會幫助別人。

相關問題