首页 > 解决方案 > 我们可以将 char_filter 应用于 elasticsearch 中的自定义标记器吗?

问题描述

我在 Elasticsearch 中设置了一个自定义分析器,该分析器使用 edge-ngram 标记器,并且我正在尝试使用过滤器和 char_filters 来优化搜索体验。

我已经指出了出色的工具elyser,它使您能够测试自定义分析器对特定术语的影响,但是当我将自定义分析器与 char_filter(特别是 html_strip)结合使用时,这会引发错误。

我从 elyser 得到的错误是:

非法参数异常','原因':'自定义规范器可能不使用字符过滤器[html_strip]'

我想知道这是否是合法的错误消息,或者它是否代表工具中的错误。

我参考了主要文档,甚至他们的自定义分析器示例在 elyser 中引发错误:

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type":      "custom", 
          "tokenizer": "standard",
          "char_filter": [
            "html_strip"
          ],
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  }
}

elyser 中的命令:

elyzer --es "http://localhost:9200" --index my_index --analyzer my_custom_analyzer "Trinity Chapel <h1>[in fact King's Chapel]</h1>"

如果事实证明 elyser 有问题,谁能指出另一种方法来检查我的自定义分析器生成的令牌,以便我可以测试每个过滤器的影响?

我的自定义分析仪看起来有点像我把厨房水槽扔给他们,我想要一种测试和重构的方法:

PUT /objects
{
  "settings" : {
    "index" : {
      "number_of_shards" : "5",
      "analysis" : {
        "analyzer" : {
          "search_autocomplete": {
            "type": "custom",
            "tokenizer": "standard",
            "char_filter" : [
              "html_strip"
            ],
            "filter": [
              "standard",
              "apostrophe",
              "lowercase",
              "asciifolding",
              "english_stop",
              "english_stemmer"
          ] 
          },
          "autocomplete": {
            "type": "custom",
            "tokenizer": "autocomplete",
            "filter": [
                "standard",
                "lowercase",
                "asciifolding",
                "english_stop",
                "english_stemmer"
            ]
          },
          "title_html_strip" : {
            "filter" : [
              "standard",
              "lowercase"
            ],
            "char_filter" : [
              "html_strip"
            ],
            "type" : "custom",
            "tokenizer" : "standard"
          }
        },
        "tokenizer": {
          "autocomplete": {
            "type": "edge_ngram",
            "min_gram": 3,
            "max_gram": 20,
            "token_chars": [
              "letter",
              "digit"
            ]
          }
        },
        "filter": {
          "english_stop": {
            "type": "stop",
            "stopwords": "_english_"
          },
          "english_stemmer": {
            "type": "stemmer",
            "name": "english"
          }
        }
      }
    }
  }
}

标签: elasticsearch

解决方案


这个错误在 elyzer 中。为了在分析过程的每个步骤中显示标记的状态,elyzer 对每个阶段执行分析查询:首先是 char filters,然后是tokenizer,最后是token filters

问题在于,在 ES 方面,自从引入了规范化器(以非向后兼容的方式)以来,分析过程发生了变化。他们假设如果请求中没有规范器、分析器和标记器,但要么是令牌过滤器要么是 char_filter,那么分析请求的行为应该像规范器。

在您的情况下, elyzer将首先执行对字符过滤器的请求,html_stripES 会认为它与规范器有关,因此您得到的错误html_strip对规范器无效char_filter

因为我非常了解 Elyzer 的开发人员(Doug Turnbull),所以我已经提交了一个错误。我们会看看会发生什么。


推荐阅读