ElasticSearch中的路径层次结构令牌生成器无法正常工作

时间:2019-07-13 22:34:56

标签: elasticsearch tokenize

对于我的分析访问日志的项目,我需要使Path Hierarchy Tokenizer工作。事实是,分析器本身似乎运行良好,只是不能与我的索引数据一起使用。 我觉得映射有些问题。

注意:我正在使用的Elasticsearch版本是5.6。升级不是一种选择。我犯了一个错误,即使用了v.5.6中尚不可用的某些语法,因此我有可能语法有问题。不过,我无法发现自己​​的错误。

这是我的自定义模板的一部分:

{
"template": "beam-*"
"order" : 20,
"settings": {
    "number_of_shards": 1,
    "analysis": {
      "analyzer": {
        "custom_path_tree": {
          "tokenizer": "custom_hierarchy"
        },
        "custom_path_tree_reversed": {
          "tokenizer": "custom_hierarchy_reversed"
        }
      },
      "tokenizer": {
        "custom_hierarchy": {
          "type": "path_hierarchy",
          "delimiter": "/"
        },
        "custom_hierarchy_reversed": {
          "type": "path_hierarchy",
          "delimiter": "/",
          "reverse": "true"
        }
      }
    }
  },

这是映射。对象字段包含路径。我希望能够搜索object.tree和object.tree_reversed以标识在线商店中访问量最大的类别。

 "mappings": {
    "logs": {
    "properties": {
      "object": {
        "type": "text",
        "fields": {
          "tree": {
            "type": "text",
            "analyzer": "custom_path_tree"
          },
          "tree_reversed": {
            "type": "text",
            "analyzer": "custom_path_tree_reversed"
          }
        }
      },

当我尝试这个

POST beam-2019.07.02/_analyze
{
  "analyzer": "custom_path_tree",
  "text": "/belletristik/science-fiction/postapokalypse"
}

我明白了

{
  "tokens": [
    {
      "token": "/belletristik",
      "start_offset": 0,
      "end_offset": 13,
      "type": "word",
      "position": 0
    },
    {
      "token": "/belletristik/science-fiction",
      "start_offset": 0,
      "end_offset": 29,
      "type": "word",
      "position": 0
    },
    {
      "token": "/belletristik/science-fiction/postapokalypse",
      "start_offset": 0,
      "end_offset": 44,
      "type": "word",
      "position": 0
    }
  ]
}

分析仪本身似乎工作正常,并且正在执行应做的事情。

当我尝试建立查询时

GET beam-2019.07.03/_search
{
  "query": {
    "term": {
      "object.tree": "/belletristik/"
    }
  }
}

我没有结果,尽管应该有几百个。

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

也许我的查询是错误的。还是映射的总和不合算?

1 个答案:

答案 0 :(得分:0)

查询一词在查询时将不会对输入字符串应用分析器,因此它会尝试匹配movl $0, %eax 。如果您注意到分析器的输出,则由它生成的令牌为/belletristik/。生成的令牌的末尾没有斜杠/belletristik。因此,输入项与任何文档都不匹配。

按如下所示修改查询:

/

如果您不想更改查询的输入项,也可以使用match query。由于匹配也会将分析器应用于GET beam-2019.07.03/_search { "query": { "term": { "object.tree": "/belletristik" } } } 。因此,这将尝试匹配/belletristik/(分析程序在/belletristik上进行匹配查询时由分析器生成的令牌),从而将匹配文档。

/belletristik/