繁体   English   中英

ElasticSearch 自定义分析器断词包含特殊字符

[英]ElasticSearch custom analyzer breaks words containing special characters

如果用户搜索foo(bar) , elasticsearch 将其分为foobar

我想要实现的是,当用户输入说, i want a foo(bar)时,我完全匹配一个名为foo(bar)的项目,名称是固定的,它将被过滤器使用,所以它设置为关键字类型。

我做的大概步骤,

  1. 定义自定义分析器
  2. 定义一个包含foo(bar)的字典
  3. 定义包含abc => foo(bar)的同义词映射

现在,当我搜索abc时, elasticsearch 将其转换为foo(bar) ,但随后将其分解为foobar

问题是,您可能已经知道, how to preserve special characters in elasticsearch analyzer?

我尝试在字典文件中使用引号(“),例如"foo(bar)" ,但它不起作用。或者可能有其他方法可以解决这个问题?

顺便说一句,我在这里使用foo(bar)只是为了简单,实际情况要复杂得多。

提前致谢。

您可能希望在自定义分析器中为您的索引使用另一个标记器。

例如, standard标记器(通过分析器简称使用)由所有非单词字符\W+ )分割:

POST _analyze
{
  "analyzer": "standard",
  "text": "foo(bar)"
}

==>

{
  "tokens" : [
    {
      "token" : "foo",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "bar",
      "start_offset" : 4,
      "end_offset" : 7,
      "type" : "<ALPHANUM>",
      "position" : 1
    }
  ]
}

与自定义标记器相比,它由除() (即[^\w\(\)]+ )之外的所有非单词字符分割:

PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "pattern",
          "pattern": "[^\\w\\(\\)]+"
        }
      }
    }
  }
}

POST my-index-000001/_analyze
{
  "analyzer": "my_analyzer",
  "text": "foo(bar)"
}

===>

{
  "tokens" : [
    {
      "token" : "foo(bar)",
      "start_offset" : 0,
      "end_offset" : 8,
      "type" : "word",
      "position" : 0
    }
  ]
}

我以Pattern Tokenier为例,将某些符号(在您的情况下为()排除在标记化中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM