【问题标题】:Exclude from CamelCase tokenizer in Elasticsearch从 Elasticsearch 中的 CamelCase 标记器中排除
【发布时间】:2016-01-02 14:56:41
【问题描述】:

在 Elasticsearch 中搜索 iphone 时努力使 iPhone 匹配。

由于我有一些源代码处于危险之中,我当然需要CamelCase tokenizer,但它似乎将 iPhone 分成了两个词,所以找不到 iphone。

任何人都知道添加例外以将 camelCase 单词分解为标记(camel + case)的方法吗?

更新:为了清楚起见,我希望将 NullPointerException 标记为 [null, pointer, exception],但我不希望 iPhone 成为 [i, phone]。

还有其他解决方案吗?

更新 2:@ChintanShah 的回答提出了一种不同的方法,可以为我们提供更多信息 - NullPointerException 将被标记为 [null, pointer, exception, nullpointer, pointerexception, nullpointerexception],从以下角度来看,这肯定更有用搜索的那个。而且索引也更快!付出的代价是索引大小,但它是一种优越的解决方案。

【问题讨论】:

  • 什么不使用小写过滤器?它会将所有单词小写
  • @ChintanShah25 这对修复分词器有何帮助? (顺便说一句 - 我使用小写过滤器)
  • 分词器与过滤器不同。 iPhone 将被索引为带有小写过滤器的 iphone。如果您发布当前的分析器和映射会有所帮助
  • 除非我完全弄错了,tokenizer 在过滤器之前起作用,所以骆驼大小写将 iPhone 切碎为 [i, Phone],小写只是将它变成 [i, phone]
  • 你不能有驼色外壳,也不能同时打破“iPhone”。 Elasticsearch 无法确定何时使用驼峰式套管,何时不使用。你必须想出这些规则。除了“iPhone”之外,可能还有其他您不想损坏的令牌,或者是否存在?

标签: elasticsearch camelcasing


【解决方案1】:

您可以通过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": {
  }
}

这将拆分 case changes 上的单词,因此 NullPointerException 将被标记为 nullpointerexception em> 但 iPhoneWiFi 将保持原样,因为它们受到保护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 可以解决问题。

这有帮助吗?

【讨论】:

  • 帮助很大!我认为 preserve_original 加上 catenate_all 是必须的,因为它是一个包罗万象的解决方案。谁不希望在查找 NullPointerException 而不是仅在查找部分时找到 NullPointerException!
  • 正如我所说,它有很多选择,您可以根据自己的各种要求进行调整。
  • 好的,知道了,字母标记器可能会在 iphone 4s、audi r8 等设备上出现异常
猜你喜欢
  • 1970-01-01
  • 2016-03-04
  • 2020-09-13
  • 1970-01-01
  • 2022-08-13
  • 2019-09-11
  • 2014-11-30
  • 2017-09-26
  • 1970-01-01
相关资源
最近更新 更多