当前位置: 首页 > 知识库问答 >
问题:

无法理解elasticsearch分析器正则表达式

柴兴修
2023-03-14

有人能帮我理解为什么我对elasticsearch分析器的理解是错误的吗?

我有一个包含各种字段的索引,特别是:

"categories": {
    "type": "text",
    "analyzer": "words_only_analyser",
    "copy_to": "all",
    "fields": {
         "tokens": {
             "type": "text",
             "analyzer": "words_only_analyser",
             "term_vector": "yes",
             "fielddata" : True
          }
      }
}

words_only_analyser如下所示:

"words_only_analyser":{
    "type":"custom",
    "tokenizer":"words_only_tokenizer",
    "char_filter" : ["html_strip"],
    "filter":[ "lowercase", "asciifolding", "stop_filter", "kstem" ]
},

并且words\u only\u标记器看起来像:

"tokenizer":{
    "words_only_tokenizer":{
    "type":"pattern",
    "pattern":"[^\\w-]+"
    }
}

我对标记器中的模式[^\\w-]的理解是,它将标记一个句子,以便在出现任意数量的\w-时拆分它们。例如,给定模式,以下句子:

seasonal-christmas-halloween this is a description about halloween

我希望看到:

[seasonal, christmas, hallo, een this is a description about hallo, een]

我可以从https://regex101.com/

然而,当我对上面的句子运行words\u only\u分析器时:

curl -XGET localhost:9200/contextual/_analyze?pretty -H 'Content-Type: application/json' -d '{"analyzer":"words_only_analyser","text":"seasonal-christmas-halloween this is a description about halloween"}'

我得到,

{
  "tokens" : [
    {
      "token" : "seasonal-christmas-halloween",
      "start_offset" : 0,
      "end_offset" : 28,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "description",
      "start_offset" : 39,
      "end_offset" : 50,
      "type" : "word",
      "position" : 4
    },
    {
      "token" : "halloween",
      "start_offset" : 57,
      "end_offset" : 66,
      "type" : "word",
      "position" : 6
    }
  ]
}

这告诉我句子被标记为:

[seasonal-christmas-halloween, description, halloween]

在我看来,标记器模式没有得到实现?有人能解释一下我的理解哪里不正确吗?

共有1个答案

闻人冷勋
2023-03-14

很少有东西会改变分析器生成的最终标记,首先是标记器,然后是标记过滤器(例如:您有stop_filter删除停止字,如thisisa)。

您也可以使用analyze API来测试您的标记器,我创建了您的配置,它生成以下标记。

邮政_analyze

{
    "tokenizer": "words_only_tokenizer", // Note `tokenizer` here
    "text": "seasonal-christmas-halloween this is a description about halloween"
}

后果

{
    "tokens": [
        {
            "token": "seasonal-christmas-halloween",
            "start_offset": 0,
            "end_offset": 28,
            "type": "word",
            "position": 0
        },
        {
            "token": "this",
            "start_offset": 29,
            "end_offset": 33,
            "type": "word",
            "position": 1
        },
        {
            "token": "is",
            "start_offset": 34,
            "end_offset": 36,
            "type": "word",
            "position": 2
        },
        {
            "token": "a",
            "start_offset": 37,
            "end_offset": 38,
            "type": "word",
            "position": 3
        },
        {
            "token": "description",
            "start_offset": 39,
            "end_offset": 50,
            "type": "word",
            "position": 4
        },
        {
            "token": "about",
            "start_offset": 51,
            "end_offset": 56,
            "type": "word",
            "position": 5
        },
        {
            "token": "halloween",
            "start_offset": 57,
            "end_offset": 66,
            "type": "word",
            "position": 6
        }
    ]
}

您可以注意到,仍然存在停止词,因为它只是打断了空格上的标记,而没有考虑-

现在,如果您在同样具有过滤器分析器上运行相同的操作,它将减少停止字并为您提供以下标记。

邮政_analyze

{
    "analyzer": "words_only_analyser",
    "text": "seasonal-christmas-halloween this is a description about halloween"
}

后果

{
    "tokens": [
        {
            "token": "seasonal-christmas-halloween",
            "start_offset": 0,
            "end_offset": 28,
            "type": "word",
            "position": 0
        },
        {
            "token": "description",
            "start_offset": 39,
            "end_offset": 50,
            "type": "word",
            "position": 4
        },
        {
            "token": "about",
            "start_offset": 51,
            "end_offset": 56,
            "type": "word",
            "position": 5
        },
        {
            "token": "halloween",
            "start_offset": 57,
            "end_offset": 66,
            "type": "word",
            "position": 6
        }
    ]
}
 类似资料:
  • 问题内容: 我在为ElasticSearch Regexp Filter正确表达正则表达式时遇到问题。我正在尝试匹配url字段中“ info-for / media”中的任何内容,例如http://mydomain.co.uk/info-for/media/press- release-1 。为了尝试正确使用我现在使用的正则表达式,但这最终将与用户的查询字符串一起使用。 POST到localhos

  • 我在正确表达ElasticSearch regexp过滤器的regexp时遇到了问题。我正在尝试匹配url字段中“info-for/media”中的任何内容,例如http://mydomain.co.uk/info-for/media/press-release-1。为了尝试获得正确的正则表达式,我现在使用,但最终将是带有用户查询字符串的。 发布到localhost:9200/_search 这返

  • Java中的正则表达式问题。我正在从元素href属性中提取Id号。我在一个字符串中有一堆这样的链接:

  • 问题内容: 有什么方法可以在python中的流上使用正则表达式匹配吗?喜欢 而且我不想通过获取整个字符串的值来做到这一点。我想知道是否有任何方法可以在srtream上匹配正则表达式(即时)。 问题答案: 我有同样的问题。首先想到的是实现一个类,该类的作用类似于字符串,但仅从流中读取当前所需的数据(我通过重新实现并提取和缓冲字符直到访问的最高位置来完成此操作……)。 这没有解决(我从中得到了“ Ty

  • 本文向大家介绍正则表达式教程之子表达式用法分析,包括了正则表达式教程之子表达式用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了正则表达式教程之子表达式用法。分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的【和】之间,有的例子会使用java来实现,如果是java本身正则表达式的用法,会在相应的地方说明。所有java例子都在JDK1.6.0_13下测

  • 问题内容: 我在理解ElasticSearch中的regexp机制时遇到了麻烦。我有代表物业单位的文件: 从今天开始,DailyAvailability字段按天数对未来两年的财产可用性进行编码。’A’表示可用,’U’不可删除,’I’可以签入,’O’可以签出。如何编写正则表达式过滤器以获取特定日期可用的所有单位? 我试图在DailyAvailability字段中找到具有特定长度和偏移量的’A’子字符