如何与“char_filter”一起执行“小写过滤器”?

时间:2014-11-13 17:59:06

标签: elasticsearch

据我在ES文档中读到:

  1. “字符过滤器用于在字符串被标记化之前”整理“字符串。”
  2. “在标记化后,生成的令牌流将通过任何指定的标记过滤器”
  3. (来源:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/custom-analyzers.html

    从这两个陈述中,我了解到执行了以下步骤:

    1. char_filter;
    2. 标记化;
    3. 过滤
    4. 问题:

      我可能有一个char_filter,可以一次转换多个字母。

      示例:ph - > F。

      但是,“PH”不会变成“f”,因为“PH”不是映射的一部分。

      所以,对“philipp”的分析检索“filipp”,而“Philipp”检索“philipp”。

      使用大写和小写(为了在两种情况下都能达到相同的结果),char_filter中的映射数将是(字符数)²。

      示例:ph - > F; Ph - > F; pH - > F; PH - > F。

      如果我只有4个映射,我不会有问题,但如果我需要更多的x²映射,char_filter往往会变得很乱。

      索引示例:

      {
          "settings" : {
              "index" : {
                  "analysis" : {
                      "analyzer" : {
                          "default_index" : {
                              "type" : "custom",
                              "tokenizer" : "whitespace",
                              "filter" : [
                                  "lowercase"
                              ],
                              "char_filter" : [
                                  "misc_simplifications"
                              ]
                          }
                      },
                      "char_filter" : {
                          "misc_simplifications" : {
                              "type" : "mapping",
                              "mappings" : [
                                  "ph=>f","Ph=>F","pH=>f","PH=>F"
                              ]
                          }
                      }
                  }
              }
          }
      }
      

      哲学问题:

      据我所知,我可能想要同等对待“ph”和“Ph”,但“pH”可能意味着完全不同的东西。但有没有办法在char_filter阶段之前将字符转换为小写?它有意义吗?

      因为这个大的映射让我觉得我做错了什么,或者我能找到一个更简单(更优雅)的解决方案。

1 个答案:

答案 0 :(得分:4)

您按步骤顺序纠正:

  1. CharFilter
  2. Tokenizer
  3. TokenFilter
  4. 然而,CharFilter的主要目的是清理数据以使标记化更容易。例如,通过剥离XML标记或用空格字符替换分隔符。

    所以 - 我会将misc_simplifications作为TokenFilter放在小写过滤器之后应用。

    {
    "settings" : {
        "index" : {
            "analysis" : {
                "analyzer" : {
                    "default_index" : {
                        "type" : "custom",
                        "tokenizer" : "whitespace",
                        "filter" : [
                            "lowercase",
                            "misc_simplifications"
                        ]
                    }
                },
                "filter" : {
                    "misc_simplifications" : {
                        "type" : "pattern_replace",
                        "pattern": "ph",
                        "replacement":"f"
                    }
                }
            }
        }
      }
    }
    

    注意我已使用模式替换而不是映射。 您还可以修改正则表达式,以仅替换" ph"在令牌的开头。

    此外 - 您的映射看起来像语音替换。我不确定您的要求,但看起来phonetic token filter可能对您有所帮助。