2017-06-21 52 views
0

我有一个关于弹性搜索分析器的问题。 创建自定义分析是这样的:使用自定义弹性搜索分析器

Analyzers(o => o.Custom("custom", 
         m => m.CharFilters("icu_normalizer").Filters("lowercase", "asciifolding").Tokenizer("icu_tokenizer") 

并试图导致以下令牌(好)的分析:

/_analyze?analyzer=custom&text=SödertorG 

{ 
    "tokens": [ 
     { 
      "token": "sodertorg", 
      "start_offset": 0, 
      "end_offset": 9, 
      "type": "<ALPHANUM>", 
      "position": 0 
     } 
    ] 
} 

但是,当我试图寻找这个道理,就像这样:

_search?q=sodertorg&analyzer=custom 

我没有得到任何结果(坏)。

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 0, 
     "max_score": null, 
     "hits": [] 
    } 
} 

我错过了什么吗? 谢谢。

+0

如果您使用您存储数据的确切字段,即'_search?q = field:sodertorg&analyzer = custom',会发生什么? – Val

+0

没有帮助。只要我搜索'södertorg'(或_search?q = name1:södertorg),标准分析器就会找到结果,但我的自定义分析器不起作用,尽管它适用于其他搜索(例如“jarn”作为电子邮件字段) – Senj

+0

您的自定义分析仪存储在哪里? –

回答

0

当您正在执行query_string查询时,您将定位到_all字段。查询字符串中指定的analyzer仅适用于分析查询的方式;内容索引时,_all字段仍将使用standard分析器。

要解决问题,您需要确保您的自定义analyzer应用于映射中的_all字段。

var createIndexResponse = client.CreateIndex("my-index", c => c 
    .Settings(s => s 
     .Analysis(a => a 
      .Analyzers(o => o 
       .Custom("custom", m => m 
        .CharFilters("icu_normalizer") 
        .Filters("lowercase", "asciifolding") 
        .Tokenizer("icu_tokenizer") 
       ) 
      ) 
     ) 
    ) 
    .Mappings(m => m 
     .Map<Project>(mm => mm 
      // apply to _all field 
      .AllField(s => s 
       .Analyzer("custom") 
      ) 
      .AutoMap() 
     ) 
    ) 
); 

随着映射以这种方式应用的分析,你应该得到预期的结果;您不再需要在查询中指定分析器,因为映射中的分析器将用于索引时间和查询时间分析。