2016-01-02 31 views
6

在Elasticsearch中搜索iphone时,努力让iPhone匹配。排除Elasticsearch中的CamelCase标记器

由于我有一些关于源代码的问题,我当然需要CamelCase tokenizer,但它似乎将iPhone分成两个术语,因此无法找到iphone。

任何人都知道添加例外的方法来将camelCase单词分成标记(骆驼+大小写)?

更新:为了说清楚,我希望将NullPointerException标记为[null,指针,异常],但我不希望iPhone变成[我,电话]。

任何其他解决方案?更新2:@ChintanShah的答案提出了一个让我们更加不同的方法 - NullPointerException将被标记为[null,指针,异常,空指针,pointerexception,nullpointerexception],从视角来看,它肯定更有用搜索的那个。索引也更快!要支付的价格是指数大小,但它是一个优秀的解决方案。

+0

什么不使用小写过滤器?它将小写所有单词 – ChintanShah25

+0

@ ChintanShah25这如何帮助修复tokenizer? (和顺便说一句 - 我使用小写字母过滤器) – tishma

+0

标记化器不同于过滤器。 iPhone将被索引为带有小写过滤器的iphone。它会帮助,如果你发布你现在的anlayzer和映射 – ChintanShah25

回答

6

您可以通过word_delimiter token filter实现您的要求。 这是我的设置

{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "camel_analyzer": { 
      "tokenizer": "whitespace", 
      "filter": [ 
      "camel_filter", 
      "lowercase", 
      "asciifolding" 
      ] 
     } 
     }, 
     "filter": { 
     "camel_filter": { 
      "type": "word_delimiter", 
      "generate_number_parts": false, 
      "stem_english_possessive": false, 
      "split_on_numerics": false, 
      "protected_words": [ 
      "iPhone", 
      "WiFi" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    } 
} 

这将分裂的话就情况变化所以NullPointerException将被标记化作为指针例外iPhone无线仍将作为这是因为他们是保护word_delimiter有很多灵活性选项。你也可以preserve_original这将帮助你很多。

GET logs_index/_analyze?text=iPhone&analyzer=camel_analyzer 

结果

{ 
    "tokens": [ 
     { 
     "token": "iphone", 
     "start_offset": 0, 
     "end_offset": 6, 
     "type": "word", 
     "position": 1 
     } 
    ] 
} 

现在用

GET logs_index/_analyze?text=NullPointerException&analyzer=camel_analyzer 

结果

{ 
    "tokens": [ 
     { 
     "token": "null", 
     "start_offset": 0, 
     "end_offset": 4, 
     "type": "word", 
     "position": 1 
     }, 
     { 
     "token": "pointer", 
     "start_offset": 4, 
     "end_offset": 11, 
     "type": "word", 
     "position": 2 
     }, 
     { 
     "token": "exception", 
     "start_offset": 11, 
     "end_offset": 20, 
     "type": "word", 
     "position": 3 
     } 
    ] 
} 

另一种方法是用不同的分析仪两次分析自己的领域,但我觉得word_delimiter会做招。

这有帮助吗?

+0

它有很多帮助!我认为preserve_original plus甚至catenate_all是必须的,因为它是一个全面的解决方案。当查找NullPointerException而不是仅在查找它的一部分时,谁不希望发现NullPointerException! – tishma

+0

正如我所说它有很多选择,你可以根据你的各种要求调整它。 – ChintanShah25

+0

不需要冒险;)我正在考虑改变这个问题,因为word_delimiter实际上是一个更一般情况下的解决方案。顺便说一句,信件分词器为我工作比空白好得多。而且这比使用骆驼案件中的文档建议的模式快15-40%! – tishma